برنامج تعليمي للدمى للمبتدئين: الأساسيات ولغة البرمجة DSL
⚡ ملخص ذكي
بابيت هي منصة مفتوحة المصدر لإدارة التكوين، تعمل على أتمتة كيفية توفير الخوادم وتكوينها والحفاظ على اتساقها. وتطبق مبدأ البنية التحتية كبرنامج من خلال لغة تعريفية خاصة بالمجال، مما يحل محل الإدارة اليدوية المتكررة عبر أساطيل الخوادم الكبيرة.
بابيت هي أداة مفتوحة المصدر لإدارة التكوين، تتيح لك تعريف البنية التحتية كشفرة برمجية والحفاظ على أساطيل كبيرة من الخوادم في حالة متسقة وقابلة للتكرار. قبل أن نتعلم بابيت، دعونا نفهم أولاً إدارة التكوين.
ما هي إدارة التكوين؟
إدارة التكوين هي عملية الحفاظ على البرامج وأنظمة الحاسوب - مثل الخوادم ووحدات التخزين والشبكات - في حالة معروفة ومرغوبة ومتسقة. كما أنها توفر الوصول إلى سجل تاريخي دقيق لحالة النظام لأغراض إدارة المشاريع والتدقيق.
يقوم مسؤولو الأنظمة في الغالب بمهام متكررة، مثل تثبيت الخوادم وتكوينها. ويمكن لهؤلاء المحترفين أتمتة هذا العمل عن طريق كتابة البرامج النصية.
لكن هذه المهمة تصبح صعبة عند العمل على بنية تحتية ضخمة. وقد تم استحداث أدوات إدارة التكوين مثل Puppet لحل هذه المشكلات.
ما هي الدمية؟
دمية Puppet هي أداة لإدارة الأنظمة تُستخدم لمركزة وأتمتة عملية إدارة التكوين. كما تُستخدم أيضًا كأداة لنشر البرامج.
هو برنامج مفتوح المصدر لإدارة التكوين، ويستخدم على نطاق واسع لتكوين الخوادم وإدارتها ونشرها وتنسيق مختلف التطبيقات والخدمات عبر البنية التحتية الكاملة للمؤسسة.
تم تصميم Puppet خصيصًا لإدارة تكوين Linux و Windows أنظمة. إنه مكتوب بلغة روبي ويستخدم أسلوبه الفريد Domain Specific Lاللغة (DSL) لوصف تكوين النظام.
ما هي إصدارات الدمى؟
تأتي الدمية في نسختين:
- دمية مفتوحة المصدرهو إصدار أساسي من أداة إدارة تكوين Puppet، والمعروفة أيضًا باسم Puppet مفتوح المصدر. وهو متاح مباشرة من موقع Puppet الإلكتروني، ومرخص بموجب نظام Apache 2.0.
- Puppet Enterprise: نسخة تجارية تقدم ميزات مثل إعداد تقارير الامتثال، والتنسيق، والتحكم في الوصول القائم على الأدوار، وواجهة المستخدم الرسومية، وواجهة برمجة التطبيقات، وأدوات سطر الأوامر للإدارة الفعالة للعقد.
ما الدمية يمكن أن تفعل؟
على سبيل المثال، لنفترض أن لديك بنية تحتية تضم حوالي 100 خادم. بصفتك مسؤول نظام، فإن دورك هو ضمان أن جميع هذه الخوادم محدثة دائمًا وتعمل بكامل وظائفها.

لتحقيق ذلك، يمكنك استخدام Puppet، الذي يتيح لك كتابة تعليمات برمجية بسيطة يمكن نشرها تلقائيًا على هذه الخوادم. هذا يقلل من الجهد البشري ويجعل عملية التطوير سريعة وفعالة.

تؤدي الدمية الوظائف التالية:
- يتيح لك Puppet تحديد تكوينات مميزة لكل مضيف.
- تتيح لك هذه الأداة مراقبة الخوادم باستمرار للتأكد من وجود التكوين المطلوب وعدم تغييره. في حال تغيير التكوين، يعود Puppet إلى التكوين المُحدد مسبقًا على المضيف.
- كما يوفر التحكم في كل نظام مُهيأ، بحيث يتم تطبيق التغيير المركزي تلقائيًا في كل مكان.
- كما يُستخدم كأداة نشر، لأنه يقوم بنشر البرامج تلقائيًا على النظام. وهو يُنفذ البنية التحتية كبرنامج، لأن السياسات والتكوينات مكتوبة كبرنامج.
دمية DSL ونماذج البرمجة
قبل أن نتعلم لغة برمجة Puppet DSL، دعونا نفهم نماذج البرمجة. نموذج البرمجة هو أسلوب يُستخدم في برمجة الحاسوب.
أربعة أنواع من النماذج هي:
- إلزامي.
- تصريحي.
- الوظيفي (الذي يعتبر مجموعة فرعية من النموذج التصريحي).
- وجوه المنحى.
سنركز على النماذج الإجرائية والتصريحية.
النماذج الحتمية
يعبّر نموذج البرمجة هذا عن منطق الحساب (ما يجب فعله) ويصف أيضًا تدفق التحكم الخاص به (كيفية القيام بذلك).
على سبيل المثال:
لنفترض أنك ذاهب إلى مكتبك. تحجز سيارة أجرة وتبدأ بإعطاء السائق تعليمات مفصلة خطوة بخطوة حتى تصل إلى المكتب. تحديد ما يجب فعله وكيفية القيام به هو أسلوب حتمي.
النماذج التصريحية
يعبر نموذج البرمجة هذا عن منطق الحساب (ماذا يجب فعله) دون وصف تدفق التحكم الخاص به (كيفية القيام بذلك).
على سبيل المثال:
لنفترض أنك ذاهب إلى مكتبك. تحجز سيارة أجرة عبر أوبر وتحدد الوجهة النهائية فقط (المكتب). تحديد ما يجب فعله، دون تحديد كيفية القيام به، هو أسلوب إخباري.
| نموذج | ماذا أفعل | كيفية القيام |
|---|---|---|
| واجب | نعم | نعم |
| تصريحي | نعم | لا |
يستخدم Puppet نموذج برمجة تعريفي
يستخدم Puppet أسلوب البرمجة التصريحية.
على سبيل المثال: أنشئ مستخدمًا على النظام.
يمكن القيام بذلك باستخدام نمط البرمجة الإجرائية مع سكربت شل. هنا، نحدد كيفية إنشاء المستخدم والأوامر التي يجب استخدامها عليه. نظام التشغيل.
ومع ذلك، يمكن القيام بذلك أيضًا باستخدام نمط البرمجة التصريحية مع بضعة أسطر فقط من كود Puppet ولغة Puppet الخاصة بالمجال (DSL)، ولا يزال من الممكن تحقيق نفس النتيجة.
نماذج نشر أدوات إدارة التكوين
هناك نوعان من نماذج النشر لـ أدوات إدارة التكوين:
- نموذج النشر القائم على الدفع: يبدأ بواسطة عقدة رئيسية.
- نموذج النشر القائم على السحب: بدأه الوكلاء.
نموذج النشر القائم على الدفع
في نموذج النشر هذا، يقوم الخادم الرئيسي بدفع الإعدادات والبرامج إلى كل وكيل على حدة. وبعد التحقق من اتصال آمن، يقوم الخادم الرئيسي بتشغيل الأوامر عن بُعد على الوكلاء. على سبيل المثال، Ansible ومكدس الملح.
نموذج النشر القائم على السحب
في نموذج النشر هذا، تتصل الخوادم الفردية بخادم رئيسي، وتتحقق من الاتصال وتنشئ اتصالاً آمناً، ثم تقوم بتنزيل إعداداتها وبرامجها، وبعد ذلك تُهيئ نفسها وفقاً لذلك - على سبيل المثال، Puppet و Chef.
كيف تعمل الدمية؟
يعتمد Puppet على نموذج نشر السحب، حيث تقوم عقد الوكيل بتسجيل الدخول بانتظام - بعد كل 1800 ثوانٍ مع العقدة الرئيسية للتحقق مما إذا كان هناك أي شيء يحتاج إلى تحديث على الوكيل. إذا كان التحديث مطلوبًا، يقوم الوكيل بسحب كود Puppet اللازم من العقدة الرئيسية وتنفيذ الإجراءات المطلوبة.
دعونا نوضح ذلك بمثال على إعداد رئيسي-وكيل.
السيد
هذا جهاز يعمل بنظام لينكس ومثبت عليه برنامج Puppet الرئيسي. وهو مسؤول عن إدارة الإعدادات باستخدام كود Puppet. يجب أن يكون نظام التشغيل الرئيسي لينكس فقط.
الوكلاء
هذه هي الأجهزة المستهدفة التي يديرها برنامج Puppet، والتي تم تثبيت برنامج وكيل Puppet عليها.
يمكن تهيئة البرنامج على أي نظام تشغيل مدعوم، مثل لينكس. Windows, Solarisأو نظام التشغيل ماك.
يتم إنشاء الاتصال بين السيد والوكيل من خلال شهادات آمنة.

التواصل بين السيد والوكيل
الخطوة 1) بمجرد إنشاء الاتصال بين العميل والخادم الرئيسي، يرسل عميل Puppet بيانات حول حالته إلى خادم Puppet الرئيسي. تُسمى هذه البيانات "حقائق"، وتشمل اسم المضيف، وتفاصيل النواة، وعنوان IP، وتفاصيل أسماء الملفات، وما إلى ذلك.

الخطوة 2) يستخدم خادم Puppet الرئيسي هذه البيانات ويُنشئ قائمةً بالتكوينات التي سيتم تطبيقها على الوكيل. تُعرف قائمة التكوينات هذه التي سيتم تنفيذها على الوكيل باسم الأقسامقد يشمل ذلك تثبيت الحزم أو ترقيتها أو إزالتها، وإنشاء نظام الملفات، وإنشاء المستخدمين أو حذفهم، وإعادة تشغيل الخادم، وتغييرات تكوين IP، وما إلى ذلك.
الخطوة 3) يستخدم الوكيل قائمة التكوين هذه لتطبيق أي تغييرات تكوين مطلوبة على العقدة.
إذا لم تكن هناك أي انحرافات في التكوين، فإن الوكيل لا يقوم بأي تغييرات في التكوين ويترك العقدة تعمل بنفس التكوين.

الخطوة 4) بمجرد الانتهاء من ذلك، تقوم العقدة بإبلاغ خادم Puppet الرئيسي، مما يشير إلى أنه تم تطبيق التكوين وإكماله.
كتل الدمية
يوفر Puppet المرونة اللازمة لدمج التقارير مع أدوات الطرف الثالث باستخدام واجهات برمجة تطبيقات Puppet.
أربعة أنواع من لبنات بناء الدمى هي:
- المصادر
- الحصص
- واضح
- الأقسام
موارد الدمى
تُعد موارد Puppet بمثابة اللبنات الأساسية لـ Puppet.
الموارد هي وظائف يحمل في ثناياه عوامل التي تعمل في الخلفية لتنفيذ العمليات المطلوبة في Puppet.
دروس الدمى
يمكن تجميع مجموعة من الموارد المختلفة معًا في وحدة واحدة تسمى فصلًا دراسيًا.
بيان الدمية
ملف البيان هو مجلد يحتوي على ملفات لغة برمجة Puppet الخاصة بالمجال (DSL). تحمل هذه الملفات امتداد .pp، وهو اختصار لبرنامج Puppet. يتكون كود Puppet من تعريفات أو تصريحات لفئات Puppet.
وحدات الدمية
الوحدات النمطية عبارة عن مجموعة من الملفات والمجلدات، مثل البيانات الوصفية وتعريفات الفئات. وهي الوحدات القابلة لإعادة الاستخدام والمشاركة في Puppet.
على سبيل المثال، MySQL يقوم البرنامج بتثبيت وتكوين الوحدة MySQL، و Jenkins تدير الوحدة Jenkins.

أنواع الموارد الدمية
بشكل عام، يتكون النظام من ملفات ومستخدمين وخدمات وعمليات وحزم وما إلى ذلك. في Puppet، تُسمى هذه العناصر بالموارد، وهي اللبنات الأساسية لـ Puppet.
يتم تنفيذ جميع العمليات على عملاء Puppet بمساعدة موارد Puppet.
موارد Puppet هي أدوات جاهزة تُستخدم لتنفيذ مهام وعمليات متنوعة على أي منصة مدعومة. يمكننا استخدام مورد Puppet واحد لتنفيذ مهمة محددة، أو يمكننا استخدام عدة موارد Puppet معًا لتنفيذ عمليات نشر معقدة لتكوين التطبيقات.
يمكن أن يكون للموارد أنواع مختلفة. استخدامات الدمية موارد و أنواع الموارد من أجل وصف تكوين النظام.
هناك ثلاثة أنواع من أنواع الموارد:
- الدمية الأساسية أو أنواع الموارد المضمنة.
- أنواع الموارد المحددة للدمى.
- أنواع الموارد المخصصة للدمى.
الدمية الأساسية أو أنواع الموارد المضمنة
أنواع الموارد الأساسية أو المدمجة هي أنواع موارد Puppet الجاهزة التي تأتي مع برنامج Puppet. جميع أنواع موارد Puppet الأساسية أو المدمجة مكتوبة ومُدارة من قِبل فريق Puppet.
أنواع الموارد المحددة للدمى
أنواع الموارد المحددة هي أنواع موارد خفيفة الوزن مكتوبة بلغة Puppet التصريحية باستخدام مجموعة من أنواع الموارد الموجودة.
أنواع الموارد المخصصة للدمى
أنواع الموارد المخصصة هي أنواع موارد مخصصة بالكامل مكتوبة بلغة روبي.
دعونا نستكشف أنواع موارد Puppet بشكل أعمق.
في سطر الأوامر، اكتب الأمر التالي لعرض قائمة بالأوامر الفرعية المتعلقة بـ Puppet:
Puppet --help
في حالتنا نحن مهتمون بالأمر الفرعي "مورد"، والتي سنستخدمها للعثور على معلومات حول أنواع موارد Puppet المدمجة.
في المحطة الطرفية، اكتب أيًا من الأوامر التالية لعرض قائمة الإجراءات مرتبط بالأمر الفرعي Puppet "مورد"
Puppet help resource Puppet resource --help
في هذه الحالة ، لدينا مورد كأمر فرعي و -أنواع كفعل.
يحتوي Puppet على 49 نوعًا من الموارد الأساسية المضمنة.
في سطر الأوامر، اكتب الأمر التالي لعرض قائمة بأنواع موارد Puppet المدمجة المتاحة:
puppet resource –types
كل نوع يدعم قائمة سمات. توفر هذه السمات وصفًا تفصيليًا يستخدمه Puppet لإدارة المورد.
للعثور على جميع السمات المرتبطة بنوع مورد Puppet، استخدم الأمر التالي:
puppet describe <resource type name>
ستسرد المعلمات جميع السمات المتاحة لنوع المورد هذا.
دمية تصف الحزمة
يصعب على الشخص الجديد فهم وربط العديد من ملفات كود Puppet غير المُدارة. وهنا نحتاج إلى بعض المجموعاتping لربط العمليات معًا. الهدف هو حل مشكلة واحدة، مثل جميع العمليات المطلوبة لتكوين SSH على خادم، أو خدمة NTP، أو خادم ويب كامل أو خادم قاعدة بيانات من الصفر.
ما هي فئات الدمى؟
تُعدّ فئات Puppet عبارة عن مجموعات من موارد Puppet مجمعة معًا كوحدة واحدة.
قدمت الدمية دروسًا لجعل الهيكل قابلاً لإعادة الاستخدام وتنظيمه.
أولاً، نحتاج إلى تعريف فئة باستخدام صيغة تعريف الفئة. يجب أن تكون الفئات فريدة ولا يمكن تعريفها إلا مرة واحدة بنفس الاسم:
class <class-name> {
<Resource declarations>
}
على سبيل المثال:
class ntpconfig {
file {
"/etc/ntp.conf":
ensure=> "present", content=> "server 0.centos.pool.ntp.org iburst\n",
}
}
حتى الآن، قمنا فقط بتعريف الصنف؛ ولم نستخدمه في أي مكان. هذا يعني أن الكود الذي كتبناه لن يُنفذ أبدًا إلا إذا قمنا بتعريف هذا الصنف في مكان آخر.
إعلان الطبقة
لاستخدام فئة مُعرَّفة في التعليمات البرمجية الخاصة بك، استخدم تتضمن الكلمة.
class ntpconfig {
file {
"/etc/ntp.conf":
ensure=> "present",
content=> "server 0.centos.pool.ntp.org iburst\n",
}
}
include ntpconfig
دعونا نفهم هذا من خلال سيناريو واقعي.
تثبيت تجريبي NTP
أولاً، تأكد من عدم وجود حزمة NTP على الخادم. لن يُظهر الأمر التالي أي نتائج إذا لم تكن حزمة NTP موجودة على الخادم:
rpm -qa | grep -i ntp
كما نرى، فإن حزمة NTP موجودة بالفعل على الخادم. لنقم بإزالة حزمة NTP الموجودة:
yum remove ntp
بعد إزالة الحزمة، تأكد من أن ملف ntp.conf لم يعد موجودًا:
ls -lrt /etc/ntp.conf
تحقق من عدم وجود خدمة ntp عن طريق تشغيل الأمر التالي:
systemctl status ntp
قم بإنشاء ملف .pp جديد لحفظ الكود. من سطر الأوامر:
vi demontp.pp
قم بالتبديل إلى وضع الإدخال بالضغط على حرف i في لوحة المفاتيح.
اكتب الكود التالي لإنشاء ملف جديد:
# Class Definition
class ntpconfig {
# Installing NTP Package
package {"ntp":
ensure=> "present",
}
# Configuring NTP configuration file
file {"/etc/ntp.conf":
ensure=> "present",
content=> "server 0.centos.pool.ntp.org iburst\n",
}
# Starting NTP services
service {"ntpd":
ensure=> "running",
}
}
بعد الانتهاء من التحرير، اضغط على زر Esc.
لحفظ الملف اضغط على :wq!
الخطوة التالية هي التحقق إذا كان الكود يحتوي على أي أخطاء نحوية، قم بتنفيذ الأمر التالي:
puppet parser validate demontp.pp
تأكد من أنك قد انتقلت إلى جذر لتمكين المستخدم من إكمال الاختبار دون أي خطأ، عن طريق تنفيذ الأمر التالي:
su root
اختبار هذه هي الخطوة التالية في عملية إنشاء الكود. قم بتنفيذ الأمر التالي لإجراء اختبار الدخان:
Puppet applies demontp.pp --noop
الخطوة الأخيرة هي يجري قم بتشغيل برنامج Puppet في الوضع الحقيقي وتحقق من المخرجات.
puppet apply demontp.pp
لم يقم برنامج Puppet بأي شيء لأن فئة العرض التوضيحي كانت فقط تعريف ولكن ليس معلن.
لذا، لن يتم تطبيق الكود حتى تقوم بتعريف فئة Puppet.
دعنا أعلن الطبقة التجريبية داخل نفس الكود باستخدام تضمين اسم الفئة في نهاية الكود:
# Class Definition
class ntpconfig {
# Installing NTP Package
package {"ntp":
ensure=> "present",
}
# Configuring NTP configuration file
file {"/etc/ntp.conf":
ensure=> "present",
content=> "server 0.centos.pool.ntp.org iburst\n",
}
# Starting NTP services
service {"ntpd":
ensure=> "running",
}
}
# Class Declaration
include ntpconfig
مرة أخرى، التحقق إذا كان الكود يحتوي على أي أخطاء نحوية، قم بتنفيذ الأمر التالي:
puppet parser validate demontp.pp
تأكد من أنك قد انتقلت إلى جذر لتمكين المستخدم من إكمال الاختبار دون أي خطأ، عن طريق تنفيذ الأمر التالي:
su root
الاختبار هذه هي الخطوة التالية في عملية إنشاء الكود. قم بتنفيذ الأمر التالي لإجراء اختبار الدخان:
Puppet apply demontp.pp --noop
الخطوة الأخيرة هي يجري قم بتشغيل برنامج Puppet في الوضع الحقيقي وتحقق من المخرجات.
puppet apply demontp.pp
هذه المرة، يتم تطبيق الكود لأن الفئة تم تعريفها ثم الإعلان عنها.
تأكد من وجود ملف ntp.conf الآن:
ls -lrt /etc/ntp.conf
تأكد من بدء تشغيل خدمة NTP عن طريق تشغيل الأمر التالي:
systemctl status ntpd












