ديف أوبس

الوصفات في أداة Chef

تُعدّ أداة Chef من أبرز أدوات إدارة التهيئة (Configuration Management) المستخدمة في عالم DevOps، حيث توفّر طريقة آلية للتحكم الكامل في إعدادات الخوادم ونشر البرمجيات والتطبيقات على بيئات متعددة. تعتمد Chef على مفهوم “البنية التحتية كرمز” (Infrastructure as Code)، وتُكتب التهيئات فيها باستخدام وصفات تُعرف بـ Recipes، وهي كتل من التعليمات البرمجية تُحدد كيفية إعداد النظام وتكوينه. في هذا المقال المطوّل، سيتم التطرق إلى مفهوم الوصفات في Chef، بنيتها، استخداماتها، مزاياها، وأفضل الممارسات المتعلقة بها، مع استعراض تطبيقات عملية وتوضيح العلاقة بينها وبين الكائنات الأخرى في Chef مثل الطبخات (Cookbooks) والأدوار (Roles) والبيئات (Environments).


مفهوم الوصفات في Chef

الوصفة (Recipe) هي وحدة البناء الأساسية في Chef، تُكتب باستخدام لغة Ruby مع DSL (Domain Specific Language) الخاص بـChef، وتُستخدم لتحديد الموارد (Resources) والإجراءات (Actions) التي يجب تنفيذها على الخادم الهدف. يمكن أن تحتوي الوصفة على تعليمات لتثبيت برامج، نسخ ملفات، إنشاء مجلدات، أو تنفيذ أوامر شل.

تُخزَّن الوصفات ضمن ملفات تحمل امتداد .rb وتُدرج داخل Cookbook، وهو الحاوية التنظيمية التي تضم مجموعة من الوصفات المرتبطة بهدف معين.


بنية الوصفة في Chef

الوصفات مكتوبة بلغة Ruby مع DSL يُسهّل التعبير عن الأوامر بطريقة قابلة للقراءة والتنفيذ. تتكون البنية الأساسية للوصفة من مجموعة من الموارد مرتبة حسب الترتيب المرغوب في تنفيذها.

مثال على وصفة بسيطة:

ruby
package 'nginx' do action :install end service 'nginx' do action [:enable, :start] end file '/usr/share/nginx/html/index.html' do content '

مرحباً بك في NGINX

'
mode '0644' owner 'root' group 'root' end

هذا المثال يُوضح تثبيت NGINX، تشغيله، وتعديل صفحة الترحيب الخاصة به. كل جزء من هذه الوصفة هو مورد (Resource) يُنفذ إجراءً معينًا.


أهم الموارد المستخدمة في الوصفات

المورد الوظيفة
package تثبيت حزمة برمجية
service إدارة خدمة (تشغيل، إيقاف، إعادة تشغيل)
file إنشاء أو تعديل ملفات
template إنشاء ملفات بناءً على قوالب متغيرة
execute تنفيذ أوامر نظام مباشرة
directory إنشاء مجلدات وضبط صلاحياتها
user إنشاء مستخدمين
group إنشاء مجموعات
cron جدولة مهام دورية
bash تنفيذ سكربت bash

العلاقة بين الوصفات والطبخات (Cookbooks)

تُدرج الوصفات ضمن الطبخات، وهي بنية تنظيمية تشمل ملفات متعددة:

  • recipes/ مجلد يحتوي الوصفات.

  • attributes/ لتعريف القيم الافتراضية.

  • templates/ يحتوي على قوالب ملفات.

  • files/ لتضمين ملفات ثابتة.

  • libraries/ لتعريف وظائف Ruby مخصصة.

  • metadata.rb لتعريف الطبخة نفسها (الاسم، المؤلف، الوصفات…).

كل طبخة يمكن أن تحتوي وصفة افتراضية (عادةً default.rb) تُستدعى عند استدعاء اسم الطبخة فقط.


كيفية استدعاء الوصفات

يتم استدعاء الوصفات داخل ملفات الطبخات أو الأدوار أو السياسات. من أمثلة الاستدعاء داخل وصفة أخرى:

ruby
include_recipe 'apache2::default'

أو ضمن دور معين:

json
{ "name": "webserver", "run_list": [ "recipe[apache2]", "recipe[my_cookbook::setup]" ] }

استخدام السمات (Attributes) داخل الوصفات

تُستخدم السمات لتعريف قيم قابلة لإعادة الاستخدام داخل الوصفات. يمكن تحديد السمات في ملفات attributes/*.rb أو داخل وصفة مباشرة. مثال:

ruby
default['nginx']['port'] = 8080

ثم استخدامها:

ruby
template '/etc/nginx/nginx.conf' do source 'nginx.conf.erb' variables(port: node['nginx']['port']) end

التعامل مع القوالب (Templates)

تُستخدم القوالب لإنشاء ملفات ديناميكية بناءً على متغيرات تُمرر إليها من الوصفة:

ملف القالب: nginx.conf.erb

erb
server { listen <%= @port %>; server_name localhost; }

الوصفة:

ruby
template '/etc/nginx/nginx.conf' do source 'nginx.conf.erb' variables(port: node['nginx']['port']) notifies :restart, 'service[nginx]', :immediately end

الربط بين الوصفات والخوادم (Nodes)

يتم تطبيق الوصفات على الخوادم من خلال قوائم التشغيل (Run Lists) الخاصة بكل عقدة (Node). تحتوي القائمة على الترتيب الذي تُطبق به الوصفات.

مثال على قائمة تشغيل لعقدة:

json
{ "run_list": [ "recipe[my_cookbook::default]", "recipe[nginx::install]" ] }

أفضل الممارسات عند كتابة الوصفات

  • تفكيك المهام: يُفضل كتابة وصفات صغيرة ذات هدف محدد بدلًا من وصفة ضخمة.

  • إعادة الاستخدام: استخدم السمات والقوالب بدلًا من نسخ القيم يدويًا.

  • التحقق من التكرار: تجنب إعادة تنفيذ موارد لا داعي لها من خلال استخدام خصائص مثل not_if و only_if.

  • الاختبار الآلي: استخدم أدوات مثل ChefSpec وTest Kitchen لاختبار الوصفات قبل تطبيقها في بيئة الإنتاج.

  • توثيق الوصفات: قم بإضافة تعليقات توضيحية في كل وصفة لتعريف وظيفتها.


جدول مقارنة بين الموارد الشائعة في Chef

المورد متى يُستخدم هل يقبل سمات؟ هل يمكن ربطه بخدمة؟
package لتثبيت برمجيات نعم لا
service لإدارة الخدمات نعم نعم
template لإنشاء ملفات ديناميكية نعم نعم
file لإنشاء ملفات ثابتة نعم نعم
execute لتشغيل أوامر نعم لا
bash لتشغيل سكربتات نعم لا

الاختبارات والتوثيق

تُمكّن Chef المطورين من اختبار الوصفات قبل نشرها باستخدام أدوات مثل:

  • ChefSpec: لاختبار منطق الوصفات باستخدام RSpec.

  • Test Kitchen: لإنشاء بيئات افتراضية لاختبار الطبخات.

  • Foodcritic / Cookstyle: لتحليل جودة الكود في الوصفات.

تُعدّ التوثيق الجيد للوصفات جزءًا أساسيًا من أفضل الممارسات، ويُفضل إدراج وصف واضح في بداية كل وصفة، مع استخدام README.md داخل الطبخة.


الخاتمة

الوصفات في أداة Chef تمثل العمود الفقري لإدارة التهيئة المؤتمتة، إذ توفّر طريقة معيارية قابلة للتكرار لتجهيز الخوادم وضبط إعداداتها بما يتوافق مع متطلبات الأنظمة الحديثة. من خلال تنظيم الوصفات داخل طبخات، واستخدام السمات والقوالب، وتحقيق أفضل الممارسات في الكتابة والتوثيق والاختبار، يمكن تحقيق قدر كبير من الاستقرار، الأمان، والكفاءة في إدارة البنية التحتية الرقمية. تعتبر Chef أحد الأدوات الرائدة التي تُمكن المؤسسات من تحقيق نموذج DevOps حقيقي وفعّال في عملياتها اليومية.


المصادر والمراجع: