دليل استخدام Ansible للمبتدئين: ملف التشغيل والأوامر

⚡ ملخص ذكي

Ansible هو محرك أتمتة مفتوح المصدر لا يتطلب تثبيت عميل، يقوم بتهيئة الخوادم عبر SSH، وتشغيل الأوامر المخصصة، وتنسيق عمليات النشر المعقدة من خلال ملفات YAML، والأدوار، والقوالب القابلة لإعادة الاستخدام عبر أنظمة Linux و Windows البنية التحتية.

  • 🧩 وكيل Archiالبنية: يتصل Ansible بالعملاء عبر SSH ويقوم بدفع الوحدات النمطية، لذلك لا يلزم تثبيت أي برنامج وكيل على العقد المُدارة.
  • 📥 تركيب: قم بتثبيت Ansible على عقدة التحكم باستخدام yum وEPEL على CentOS أو RHEL، أو باستخدام apt وPPA على Ubuntu أو دبيان.
  • ⚡ أوامر مخصصة: تنفيذ مهام لمرة واحدة مثل ping، نسخ، أو yum عبر المخزون باستخدام صيغة وحدة ansible -m.
  • 📜 كتيبات التشغيل: صف الحالة المطلوبة في ملفات YAML التي تجمع بين عمليات التشغيل والمهام والوحدات النمطية لتكوين العديد من الخوادم بشكل متسق.
  • 🧱 الأدوار والقوالب: قم بتقسيم ملفات التشغيل الكبيرة إلى أدوار قابلة لإعادة الاستخدام تم إنشاؤها باستخدام ansible-galaxy، وقم بعرض ملفات التكوين باستخدام قوالب Jinja2.
  • 🔁 المسؤولون والحقائق: قم بتشغيل المعالجات من خلال المنبهات عند التغيير، واستخدم متغيرات gather_facts للأتمتة المشروطة والقابلة للتكرار.
  • 🎯 دراسة الحالة: يمكن لملف تشغيل p4.yml واحد تشغيل أدوار selinux و httpd و resolver عبر جميع المضيفين، ويتم التحكم في كل منها بواسطة علامة.

دليل Ansible للمبتدئين يغطي التثبيت، والأوامر المخصصة، ودفاتر التشغيل، والأدوار، والقوالب.

يُعد Ansible أحد أكثر أدوات الأتمتة مفتوحة المصدر استخدامًا في العصر الحديث DevOpsيُقدّر نظام Ansible لتصميمه الذي لا يتطلب تثبيت برامج وسيطة، وملفات تكوينه البسيطة والواضحة. يشرح هذا الدليل التعليمي للمبتدئين ماهية Ansible، وكيفية تثبيته، وكيفية استخدام الأوامر المخصصة، ودفاتر التشغيل، والأدوار، والقوالب من خلال أمثلة عملية.

ما هو أنسبل؟

Ansible هي أداة مفتوحة المصدر لأتمتة وتنسيق عمليات توفير البرامج وإدارة التكوين ونشر البرامج. تقوم بتكوين أنظمة شبيهة بنظام يونكس و Windows تُشبه أنظمة Ansible في ذلك، حيث توفر البنية التحتية كبرنامج من خلال لغتها التصريحية الخاصة. وغالبًا ما تتم مقارنة Ansible بأدوات تعتمد على الوكلاء مثل دمية.

يحظى برنامج Ansible بشعبية واسعة بفضل سهولة تثبيته، وسهولة اتصاله بالعملاء، وتصميمه الذي لا يتطلب تثبيت وكيل. ويتصل بالعملاء عبر SSHلذا، لا حاجة إلى وكيل خاص على جانب العميل. يقوم Ansible بدفع الوحدات النمطية إلى كل عميل، وتعمل هذه الوحدات محليًا، ثم تُعاد مخرجاتها إلى خادم Ansible.

بفضل اعتماده على بروتوكول SSH، يتصل Ansible بالعملاء بسهولة باستخدام مفاتيح SSH، مما يُبسط العملية برمتها. تُخزَّن بيانات العميل، مثل أسماء المضيفين وعناوين IP ومنافذ SSH، في ملفات تُسمى ملفات المخزون. بمجرد إنشاء ملف المخزون وتعبئته بالبيانات، يُمكن لـ Ansible استخدامه.

لماذا نستخدم Ansible؟

فيما يلي بعض الفوائد المهمة لاستخدام Ansible:

  • إحدى أهم مزايا Ansible هي أنها مجانية للاستخدام من قبل الجميع.
  • لا يتطلب الأمر مهارات خاصة من مسؤول النظام لتثبيته واستخدامه، والوثائق الرسمية شاملة للغاية.
  • إن قابلية Ansible للتجزئة عبر المكونات الإضافية والوحدات النمطية والمخزونات ودفاتر التشغيل تجعلها رفيقًا ممتازًا لتنسيق البيئات الكبيرة.
  • يتميز برنامج Ansible بأنه خفيف الوزن ومتسق، ولا توجد قيود على نظام التشغيل أو الأجهزة الأساسية.
  • إنه آمن للغاية بفضل تصميمه الذي لا يتطلب تثبيت برامج وسيطة واستخدامه لميزات الأمان في OpenSSH.
  • يتميز برنامج Ansible بسهولة تعلمه، مدعومًا بوثائق شاملة وهيكل وتكوين سهل التعلم.

هذه المزايا، خاصة عند مقارنتها بغيرها بدائل لـ Ansibleيساعد ذلك في تفسير سرعة انتشاره. قبل تثبيته، من المفيد فهم كيفية تطور المشروع.

تاريخ أنسيبل

فيما يلي أهم المحطات في تاريخ Ansible:

  • بدأ مشروع Ansible في فبراير 2012. وقد تم تطويره لأول مرة بواسطة مايكل ديهان، مبتكر Cobbler و Func (Fedora Unified Network Controller).
  • كانت الشركة التي تمول Ansible تُسمى في البداية AnsibleWorks Inc، وقد استحوذت عليها RedHat في عام 2015، ثم انتقلت لاحقًا، جنبًا إلى جنب مع RedHat، إلى تحت مظلة IBM مظلة.
  • اليوم، يتم تضمين Ansible في توزيعات مثل Fedora Linux وRHEL وCentOS و Oracle لينكس.

المصطلحات الهامة المستخدمة في Ansible

تظهر المصطلحات التالية في جميع أنحاء هذا البرنامج التعليمي لـ Ansible، ومن المفيد معرفتها قبل البدء:

خادم غير معقول

الجهاز الذي تم تثبيت Ansible عليه والذي يتم من خلاله تشغيل جميع المهام ودفاتر التشغيل.

وحدة

الوحدة النمطية هي أمر، أو مجموعة من أوامر Ansible المتشابهة، والمقصود تنفيذها على جانب العميل.

مهمة

المهمة هي قسم يتكون من إجراء واحد يجب إكماله.

النوع

طريقة لتنظيم المهام والملفات ذات الصلة بحيث يمكن استدعاؤها لاحقًا في دليل التشغيل.

حقيقة

المعلومات التي تم جلبها من المتغيرات العامة لنظام العميل من خلال عملية gather_facts.

المعرض

ملف يحتوي على بيانات حول خوادم عميل Ansible. ويُعرف في الأمثلة اللاحقة باسم ملف المضيفين.

بلايستشن

تنفيذ خطة العمل.

معالج

مهمة يتم استدعاؤها فقط عند وجود مُرسِل إشعارات.

المخطر

قسم يُنسب إلى مهمة يستدعي معالجًا إذا تغيرت المخرجات.

بطاقة

اسم يتم تعيينه على مهمة يمكن استخدامه لاحقًا لتشغيل تلك المهمة المحددة أو مجموعة المهام.

التثبيت Ansible في لينكس

بعد دراسة خياراتك واتخاذ قرار اعتماد Ansible، فإن الخطوة التالية هي تثبيته على نظامك. يشرح الدليل المختصر التالي عملية التثبيت على أشهر الأنظمة. لينكس التوزيعات.

قم بتثبيت Ansible على أنظمة Centos/RedHat

الخطوة 1) قم بتثبيت مستودع EPEL.

[root@ansible-server ~]# sudo yum install epel-release

الخطوة 2) قم بتثبيت حزمة Ansible.

[root@ansible-server ~]# sudo  yum install -y ansible

قم بتثبيت Ansible على أنظمة Centos/RedHat

تثبيت غير ممكن على Ubuntu/أنظمة ديبيان

الخطوة 1) قم بتحديث الحزم.

$ sudo apt update

الخطوة 2) قم بتثبيت حزمة software-properties-common.

$ sudo apt install software-properties-common

الخطوة 3) قم بتثبيت حزمة Ansible الشخصية.

$ sudo apt-add-repository ppa:ansible/ansible

الخطوة 4) قم بتثبيت برنامج Ansible.

$ sudo apt update
$ sudo apt install ansible

أوامر مخصصة غير قابلة للتطبيق

إحدى أبسط طرق استخدام Ansible هي عبر الأوامر المخصصة. تُفيد هذه الأوامر عند الرغبة في تنفيذ أمر على خادم واحد أو مجموعة من الخوادم. لا تُخزَّن الأوامر المخصصة للاستخدام المستقبلي، ولكنها تُعدّ وسيلة سريعة للتفاعل مع الخوادم التي تختارها.

في هذا البرنامج التعليمي لـ Ansible، يتم تكوين ملف مضيفين بسيط لخادمين، يحتوي على host1 و host2.

يمكنك التأكد من إمكانية الوصول إلى المضيفين من خادم Ansible عن طريق إصدار أمر ping الأمر مُفعّل على جميع الأجهزة المضيفة.

[root@ansible-server test_ansible]# ansible -i hosts all -m ping
host1 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
host2 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

أوامر مخصصة غير قابلة للتطبيق

التفسير:

  1. حالة الأمر، في هذه الحالة، النجاح
  2. المضيف الذي تم تشغيل الأمر عليه
  3. الأمر الصادر عبر المعامل -m، في هذه الحالة، ping
  4. باستخدام المعلمة -i، يمكنك الإشارة إلى ملف المضيفين.

يمكنك أيضًا إصدار نفس الأمر على مضيف واحد عند الحاجة.

[root@ansible-server test_ansible]# ansible -i hosts all -m ping --limit host2
host2 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

أوامر مخصصة غير قابلة للتطبيق

التفسير:

  1. يمكن استخدام معلمة الحد لإصدار الأوامر فقط على مضيفين محددين في ملف المضيف
  2. اسم المضيف كما هو محدد في ملف المخزون

إذا كنت بحاجة إلى نسخ ملف إلى وجهات متعددة بسرعة، فاستخدم وحدة النسخ التي تعتمد على بروتوكول SCP. يبدو الأمر ومخرجاته كما يلي:

[root@ansible-server test_ansible]# ansible -i hosts all -m copy -a "src=/root/test_ansible/testfile dest=/tmp/testfile"
host1 | SUCCESS => {
    "changed": true,
    "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "dest": "/tmp/testfile",
    "gid": 0,
    "group": "root",
    "md5sum": "d41d8cd98f00b204e9800998ecf8427e",
    "mode": "0644",
    "owner": "root",
    "size": 0,
    "src": "/root/.ansible/tmp/ansible-tmp-1562216392.43-256741011164877/source",
    "state": "file",
    "uid": 0
}
host2 | SUCCESS => {
    "changed": true,
    "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "dest": "/tmp/testfile",
    "gid": 0,
    "group": "root",
    "md5sum": "d41d8cd98f00b204e9800998ecf8427e",
    "mode": "0644",
    "owner": "root",
    "size": 0,
    "src": "/root/.ansible/tmp/ansible-tmp-1562216392.6-280302911361278/source",
    "state": "file",
    "uid": 0
}

أوامر مخصصة غير قابلة للتطبيق

التفسير:

  1. تم تحديد وحدة النسخ
  2. وسيطات الوحدة، في هذه الحالة، هي المسار المطلق للمصدر والمسار المطلق للوجهة.
  3. إن إخراج أمر Ansible يعكس نجاح أمر النسخ وتفاصيل أخرى مثل مجموع التحقق sha1 أو md5 للتحقق من سلامة الملف والبيانات الوصفية مثل المالك أو الحجم أو الأذونات. من السهل تثبيت حزمة على مجموعة من الخوادم. يحتوي Ansible على عدة وحدات تتفاعل مع المثبتات المستخدمة، مثل yum وapt وdnf وما إلى ذلك.

في المثال التالي، ستقوم بتثبيت حزمة باستخدام وحدة yum على مضيفين من نوع CentOS.

[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=present'
host1 | SUCCESS => {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [


"Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\n * base: mirror.netsite.dk\n * elrepo: mirrors.xservers.ro\n * epel: fedora.mirrors.telekom.ro\n * extras: centos.mirrors.telekom.ro\n * remi-php70: remi.schlundtech.de\n * remi-safe: remi.schlundtech.de\n * updates: centos.mirror.iphh.net\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n========================================================================\n Package         Arch              Version                Repository       Size\n========================================================================\nInstalling:\n ncdu            x86_64            1.14-1.el7             epel             51 k\n\nTransaction Summary\n========================================================================\nInstall  1 Package\n\nTotal download size: 51 k\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Installing : ncdu-1.14-1.el7.x86_64                                       1/1 \n  Verifying  : ncdu-1.14-1.el7.x86_64                                       1/1 \n\nInstalled:\n  ncdu.x86_64 0:1.14-1.el7                                                      \n\nComplete!\n"
    ]
}
host2 | SUCCESS => {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [
        "Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\n * base: mirror.netsite.dk\n * elrepo: mirrors.leadhosts.com\n * epel: mirrors.nav.ro\n * extras: centos.mirrors.telekom.ro\n * remi-php70: mirrors.uni-ruse.bg\n * remi-safe: mirrors.uni-ruse.bg\n * updates: centos.mirror.iphh.net\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n========================================================================\n Package         Arch              Version                Repository       Size\n========================================================================\nInstalling:\n ncdu            x86_64            1.14-1.el7             epel             51 k\n\nTransaction Summary\n========================================================================\nInstall  1 Package\n\nTotal download size: 51 k\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Installing : ncdu-1.14-1.el7.x86_64                                       1/1 \n  Verifying  : ncdu-1.14-1.el7.x86_64                                       1/1 \n\nInstalled:\n  ncdu.x86_64 0:1.14-1.el7                                                      \n\nComplete!\n"
    ]
}

أوامر مخصصة غير قابلة للتطبيق

التفسير:

  1. يتم استخدام وحدة Yum في هذا المثال
  2. فهو يحدد وسيطات الوحدة، وفي هذه الحالة، ستختار اسم الحزمة وحالتها. إذا كانت الحالة غائبة، على سبيل المثال، سيتم البحث في الحزمة وإذا وجدت، تتم إزالتها
  3. عند تلوينه باللون الأصفر، سترى مخرجات الأمر ansible مع تغيير الحالة، مما يعني في هذه الحالة أنه تم العثور على الحزمة وتثبيتها.
  4. حالة أمر yum install الصادر عبر ansible. في هذه الحالة تم تثبيت الحزمة ncdu.x86_64 0:1.14-1.el7.

بالطبع، يمكن استخدام جميع خيارات برنامج التثبيت yum من خلال Ansible، بما في ذلك التحديث والتثبيت وأحدث إصدار والإزالة.

في المثال أدناه، يتم إصدار نفس الأمر لإزالة حزمة ncdu المثبتة مسبقًا.

[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=absent'
host1 | SUCCESS => {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [
        "Loaded plugins: fastestmirror\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be erased\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n========================================================================\n Package         Arch              Version               Repository        Size\n========================================================================\nRemoving:\n ncdu            x86_64            1.14-1.el7            @epel             87 k\n\nTransaction Summary\n========================================================================\nRemove  1 Package\n\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Erasing    : ncdu-1.14-1.el7.x86_64                                       1/1 \n  Verifying  : ncdu-1.14-1.el7.x86_64                                       1/1 \n\nRemoved:\n  ncdu.x86_64 0:1.14-1.el7                                                      \n\nComplete!\n"
    ]
}
host2 | SUCCESS => {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [
        "Loaded plugins: fastestmirror\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be erased\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n========================================================================\n Package         Arch              Version               Repository        Size\n========================================================================\nRemoving:\n ncdu            x86_64            1.14-1.el7            @epel             87 k\n\nTransaction Summary\n========================================================================\nRemove  1 Package\n\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Erasing    : ncdu-1.14-1.el7.x86_64                                       1/1 \n  Verifying  : ncdu-1.14-1.el7.x86_64                                       1/1 \n\nRemoved:\n  ncdu.x86_64 0:1.14-1.el7                                                      \n\nComplete!\n"
    ]
}

أوامر مخصصة غير قابلة للتطبيق

التفسير:

  1. يُظهر إخراج الأمر yum أنه تمت إزالة الحزمة.

من الميزات الأساسية الأخرى لبرنامج Ansible قدرته على جمع معلومات حول النظام. فهو يجمع معلومات عن الأجهزة والبرامج والإصدارات، ويخزن كل قيمة في متغير يمكنك إعادة استخدامه لاحقًا.

عندما تحتاج إلى معلومات مفصلة حول الأنظمة التي سيقوم Ansible بتعديلها، فإن وحدة الإعداد تجمع هذه الحقائق من متغيرات النظام.

أوامر مخصصة غير قابلة للتطبيق

كتب اللعب Ansible

كتب اللعب Ansible تُعدّ ملفات التشغيل وسيلةً لإرسال الأوامر إلى الأنظمة البعيدة عبر البرامج النصية. فهي تُهيئ بيئات الأنظمة المعقدة وتزيد من مرونتها من خلال تشغيل برنامج نصي واحد على نظام واحد أو أكثر. وهي أقرب إلى لغة تهيئة منها إلى لغة برمجة.

تستخدم أوامر دفتر التشغيل تنسيق YAML، لذا لا يتطلب الأمر الكثير من الكتابة، ولكن يجب مراعاة المسافات البادئة. وكما يوحي الاسم، فإن دفتر التشغيل عبارة عن مجموعة من الخطط. من خلال دفتر التشغيل، يمكنك تعيين أدوار محددة لبعض المضيفين وأدوار مختلفة لمضيفين آخرين، مما يتيح لك إدارة العديد من الخوادم في ملف واحد.

قبل المتابعة مع أمثلة ملفات التشغيل، من المفيد تعريف المهمة. المهام هي واجهة وحدات Ansible للأدوار وملفات التشغيل.

والآن، لنفترض وجود ملف تشغيل Ansible يحتوي على مهمة واحدة تتضمن مهامًا متعددة، كما هو موضح أدناه:

---

- hosts: group1
  tasks:
  - name: Install lldpad package
    yum:
      name: lldpad
      state: latest
  - name: check lldpad service status
    service:
      name: lldpad
      state: started

كتب اللعب Ansible

في ملف التشغيل أعلاه، يتم استهداف مضيفات المجموعة 1 في ملف المضيفين لتثبيت حزمة lldpad باستخدام وحدة yum. ثم يتم تشغيل خدمة lldpad التي تم إنشاؤها بعد التثبيت باستخدام وحدة الخدمة، والتي تتفاعل في الغالب مع مجموعة systemd.

التفسير:

  1. مجموعة المضيفين التي سيتم تشغيل قواعد اللعبة عليها
  2. يتم استخدام وحدة Yum في هذه المهمة لتثبيت lldpad
  3. يتم استخدام وحدة الخدمة للتحقق مما إذا كانت الخدمة قيد التشغيل بعد التثبيت

يعمل كل ملف تشغيل Ansible مع ملف جرد. يحتوي ملف الجرد على قائمة بالخوادم مقسمة إلى مجموعات، مما يوفر تحكمًا أفضل في التفاصيل مثل عنوان IP ومنفذ SSH لكل مضيف.

يبدو ملف المخزون الخاص بمثال دفتر التشغيل هذا كما يلي. هناك مجموعتان، المجموعة 1 والمجموعة 2، تحتوي كل منهما على المضيف 1 والمضيف 2 على التوالي.

[group1]
host1 ansible_host=192.168.100.2 ansible_ssh_port=22
[group2]
host2 ansible_host=192.168.100.3 ansible_ssh_port=22

كتب اللعب Ansible

التفسير:

  1. أسم المجموعة
  2. اسم المضيف، مع عنوان IP ومنفذ ssh، في هذه الحالة، الاسم الافتراضي، 22.

يحتوي مثال Ansible playbook التالي على خطوتين لمجموعتين من المضيفين. بالنسبة للمجموعة الأولى، group1، يتم تمكين SELinux، وعند تمكينه تظهر رسالة على شاشة المضيف.

بالنسبة للمجموعة الثانية، يتم تثبيت حزمة httpd فقط إذا كانت ansible_os_family هي RedHat و ansible_system_vendor هي HP.

ansible_os_family و ansible_system_vendor هما متغيران يتم جمعهما باستخدام خيار gather_facts، ويمكن استخدامهما كما في هذا المثال الشرطي.

---

- hosts: group1
  tasks:
  - name: Enable SELinux
    selinux:
      state: enabled
    when: ansible_os_family == 'Debian'
    register: enable_selinux

  - debug:
      Imsg: "Selinux Enabled. Please restart the server to apply changes."
    when: enable_selinux.changed == true

- hosts: group2
  tasks:
  - name: Install apache
    yum:
      name: httpd
      state: present
    when: ansible_system_vendor == 'HP' and ansible_os_family == 'RedHat'

كتب اللعب Ansible

التفسير:

  1. مثال على جملة متى، في هذه الحالة، عندما يكون نوع نظام التشغيل هو دبيان. يتم جمع المتغير ansible_os_family عبر وظيفة Collect_facts.
  2. يتم تسجيل مخرجات المهمة للاستخدام المستقبلي باسمenable_selinux
  3. مثال آخر على شرط when. في هذه الحالة، سيتم عرض رسالة للمستخدم المضيف إذا تم تمكين SELinux بالفعل من قبل.
  4. مثال آخر على جملة When التي تتكون من قاعدتين

إلى جانب المهام، توجد أيضًا مهام خاصة تُسمى المعالجات. يجب أن يحمل كل معالج اسمًا فريدًا في جميع أنحاء دليل التشغيل. تعمل المعالجات مثل المهام العادية، ولكن يمكن إخطار المعالج من خلال أداة إخطار.

إذا لم يتم إخطار معالج أثناء تشغيل دفتر التشغيل، فلن يتم تشغيله. ومع ذلك، إذا قامت أكثر من مهمة بإخطار معالج، فسيتم تشغيله مرة واحدة فقط بعد انتهاء جميع المهام.

في المثال أدناه، تحتوي مهمة محددة على قسم إشعار يستدعي مهمة أخرى. إذا تغيرت مخرجات المهمة الأولى، يتم استدعاء مهمة معالجة. ومن الأمثلة الشائعة على ذلك تغيير ملف التكوين ثم إعادة تشغيل الخدمة المتأثرة.

---

- hosts: group2
  tasks:
  - name: sshd config file modify port
    lineinfile:
     path: /etc/ssh/sshd_config
     regexp: 'Port 28675'
     line: '#Port 22'
    notify:
       - restart sshd
handlers
    - name: restart sshd
      service: sshd
        name: sshd
        state: restarted

في هذه الحالة، إذا تغيرت المهمة الأولى، "تعديل منفذ ملف تكوين sshd"، مما يعني أن المنفذ ليس 28675 بالفعل، فسيتم تعديل المنفذ وستقوم المهمة بإخطار المعالج الذي يحمل نفس الاسم، والذي يعيد تشغيل خدمة sshd.

كتب اللعب Ansible

التفسير:

  1. مثال على الإخطار
  2. مثال للمعالج

أدوار غير قابلة للتنفيذ

عند العمل مع ملفات التشغيل الكبيرة، يُفضّل تقسيم المهام إلى أدوار. كما تُسهّل الأدوار إعادة استخدام العمل لاحقًا. الدور عبارة عن مجموعة من المهام التي يمكن نقلها من ملف تشغيل إلى آخر وتشغيلها بشكل مستقل، ولكن فقط من خلال ملف التشغيل.

يتم تخزين الأدوار في مجلدات منفصلة وتتبع بنية مجلدات محددة.

[root@ansible-server test2]# tree
.
`-- role1
    |-- defaults
    |   `-- main.yml
    |-- handlers
    |   `-- main.yml
    |-- meta
    |   `-- main.yml
    |-- README.md
    |-- tasks
    |   `-- main.yml
    |-- tests
    |   |-- inventory
    |   `-- test.yml
    `-- vars
        `-- main.yml

7 directories, 8 files

يحتوي ملف YAML الموجود في مجلد الإعدادات الافتراضية على المتغيرات الافتراضية المستخدمة مع ملف التشغيل. ويخزن مجلد المعالجات المعالجات، بينما يحتوي مجلد البيانات الوصفية على معلومات حول المؤلف وتبعيات الدور. ويحتوي مجلد المهام على ملف YAML الرئيسي للدور.

يحتوي دليل الاختبارات على نموذج لملف تشغيل YAML ونموذج لملف جرد، ويستخدم في الغالب للاختبار قبل إنشاء الدور الفعلي.

يحتوي مجلد المتغيرات على ملف YAML الذي تُعرّف فيه جميع المتغيرات المستخدمة في الدور. أما مجلدا القوالب والملفات فيحتويان على القوالب والملفات المستخدمة في مهام الدور.

لإنشاء شجرة الدليل لدور معين، استخدم الأمر التالي مع اسم الدور كمعامل أخير:

[root@ansible-server test2]# ansible-galaxy init role1

يعمل Ansible بشكل جيد مع القوالب، ويستخدم Jinja2 كلغة للقوالب.

يوضح المثال التالي كيف يبدو قالب Jinja2 الأساسي وكيفية استخدامه في دور معين.

في وقت التشغيل، اعتمادًا على سبيل المثال على مركز البيانات الذي يوجد فيه خادمك، يمكنك الاختيار من بين عدة خوادم أسماء، كل منها يتوافق مع مركز بيانات، باستخدام المتغير resolver_ip_addresses.

{% for resolver in resolver_ip_addresses %}
nameserver {{ resolver }}
{% endfor %}

options timeout:1
options attempts:5
options rotate

في هذا المثال، يحدد دليل التشغيل عدة متغيرات، بما في ذلك resolver_ip_addresses، بقيم مختلفة اعتمادًا على مركز البيانات.

- name: Set resolver for server
  template:
    src: dns.j2
    dest: /etc/resolv.conf
    group: root
    owner: root
    mode: "0644"
    tag: resolver

أدوار غير قابلة للتنفيذ

التفسير:

  1. اسم القالب الذي سيتم استخدامه. يقع القالب في القوالب الموجودة في مسار الدور
  2. مسار الوجهة لاسم الملف الذي سيتم استبداله بالقالب، من جانب العميل.
  3. أذونات الملف الوجهة

يمكن أن تحتوي مهام الأدوار أيضًا على حقل وسم باسم مُعيّن. يمكن لأكثر من مهمة أن تشترك في نفس الوسم، وعند تشغيل ملف التشغيل، يمكنك تحديد وسم بحيث يتم تنفيذ المهام الموسومة فقط.

دراسة حالة غير قابلة للتنفيذ

في هذا القسم، نحلل دراسة حالة لملف تشغيل أساسي في Ansible يتضمن ثلاثة أدوار. الهدف هو تقديم مثال عملي للمفاهيم التي تم تناولها حتى الآن. تم تعديل بعض الأمثلة السابقة من هذا الدليل وإعادة استخدامها في ملف التشغيل هذا.

فيما يلي بنية مجلدات ملف التشغيل. ملف YAML المستخدم هو p4.yml.

[root@ansible-server test_ansible]# ls -lrth
total 16K
-rw-r--r--. 1 root root   0 Jul  3 10:13 testfile
-rw-r--r--. 1 root root 203 Jul  3 13:30 p1.yml
-rw-r--r--. 1 root root 125 Jul  3 15:00 hosts
-rw-r--r--. 1 root root 488 Jul  3 16:40 p2.yml
-rw-r--r--. 1 root root 188 Jul  4 17:33 p4.yml
drwxr-xr-x. 5 root root  47 Jul  4 17:35 roles
[root@ansible-server test_ansible]# cd roles
[root@ansible-server roles]# ls -lrth
total 12K
drwxr-xr-x. 9 root root 4.0K Jul  4 12:52 httpd
drwxr-xr-x. 9 root root 4.0K Jul  4 13:55 selinux
drwxr-xr-x. 9 root root 4.0K Jul  4 16:54 resolver

يحتوي دليل التشغيل على ثلاثة أدوار. يقوم دور المُحلِّل بتعيين خادم أسماء مُحدد على الخوادم عن طريق نسخ ملف إلى المسار /etc/resolv.conf. يقوم دور خادم HTTP بتثبيت حزمة خادم HTTP باستخدام وحدة yum، أما الدور الثالث فيُفعِّل SELinux ويُخطر المستخدم المُسجَّل لإعادة تشغيل النظام. تم إنشاء كل دور باستخدام أمر ansible-galaxy.

دور المحلل، مهمة main.yml:

دراسة حالة غير قابلة للتنفيذ

دور Httpd، مهمة main.yml:

دراسة حالة غير قابلة للتنفيذ

دور Selinux، مهمة main.yml:

دراسة حالة غير قابلة للتنفيذ

فيما يلي ملف p4.yml الخاص بتشغيل البرنامج. يعمل هذا الملف على جميع الأجهزة المضيفة ما لم يُحدد خلاف ذلك في سطر الأوامر، ويعمل بصلاحيات المستخدم الجذر على المنفذ 22 (SSH)، ويجمع البيانات قبل تشغيل الأدوار، ثم يُشغّل الأدوار الثلاثة جميعها. يمكن تشغيل كل دور على حدة بتحديد علامته في سطر أوامر ansible-playbook باستخدام المعامل –t.

---

- hosts: all
  user: root
  port: 22
  gather_facts: True
  roles:
    - { role: selinux, tags: selinux }
    - { role: httpd, tags: httpd }
    - { role: resolver, tags: resolver }

يمكنك بعد ذلك تشغيل ملف p4.yml على الجهازين المضيفين وتحليل مخرجاته. ويمكن تشغيل الأمر نفسه مع المعامل ‎–check لإجراء تجربة أولية، ومع المعامل ‎-k عند الرغبة في استخدام مصادقة كلمة المرور.

دراسة حالة غير قابلة للتنفيذ

التفسير:

  1. أمر Ansible-playbook الذي يقوم بتشغيل p4.yml
  2. يتخطى Playbook دور SELinux لأنه ممكّن بالفعل.
  3. اكتشف Ansible أن حزمة httpd مثبتة بالفعل، لذا فهي ترجع بشكل جيد.
  4. تم تعيين المحلل، وتم تغيير حالة محلل الدور.

ورقة الغش للأوامر Ansible

قم بتثبيت EPEL repo على أنظمة Centos/RHEL

[root@ansible-server ~]# sudo yum install epel-release

تثبيت حزمة غير معقولة على أنظمة Centos/RHEL

[root@ansible-server ~]# sudo  yum install -y ansible

قم بإجراء تحديث للحزم الموجودة على Debian/Ubuntu نظم

$ sudo apt update

قم بتثبيت حزمة خصائص البرنامج المشتركة على Debian/Ubuntu نظم

$ sudo apt install software-properties-common

تثبيت أرشيف الحزمة الشخصية ansible على Debian/Ubuntu نظم

$ sudo apt-add-repository ppa:ansible/ansible

تثبيت ansible على دبيان/Ubuntu نظم

$ sudo apt update
$ sudo apt install ansible

إصدار أ ping الأمر على جميع الخوادم المحددة في ملف المخزون المسمى hosts

[root@ansible-server test_ansible]# ansible -i hosts all -m ping

إصدار أ ping الأمر متاح فقط على المضيف 2

[root@ansible-server test_ansible]# ansible -i hosts all -m ping --limit host2

انسخ الملف "testfile" على كافة الأجهزة المضيفة في ملف المخزون

[root@ansible-server test_ansible]# ansible -i hosts all -m copy -a "src=/root/test_ansible/testfile dest=/tmp/testfile"

تثبيت حزمة ncdu على كافة المضيفين

[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=present'

إزالة حزمة ncdu على كافة الأجهزة المضيفة

[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=absent'

قم ببناء بنية الدليل للدور المسمى role1.

[root@ansible-server test2]# ansible-galaxy init role1

قواعد التشغيل الجافة p4.yml

[root@ansible-server test_ansible]# ansible-playbook -i hosts p4.yml --check

قم بتشغيل p4.yml playbook مع مصادقة كلمة المرور لجميع المضيفين

[root@ansible-server test_ansible]# ansible-playbook -i hosts p4.yml -k

الأسئلة الشائعة

نعم. برنامج Ansible لا يتطلب تثبيت أي برنامج، لذا لا يتم تشغيل أي برنامج على العقد المُدارة. يتصل عبر SSH أو WinRM لـ Windowsويقوم بتحميل وحدات صغيرة تُنفذ على الهدف ثم تُزال. يحتاج عقد التحكم فقط إلى Ansible و Python تثبيت.

تُكتب ملفات Ansible البرمجية بلغة YAML، وهي لغة سهلة القراءة وتعتمد على المسافات البادئة بدلاً من الأقواس. تستخدم القوالب لغة Jinja2، بينما تسمح الحقائق والمتغيرات بتكييف ملف برمجي واحد مع العديد من الأجهزة المضيفة. لا يتطلب الأمر أي خلفية برمجية عامة للبدء.

Ansible لا يتطلب تثبيت عميل ويعتمد على الدفع، حيث يرسل التغييرات عبر SSH، بينما دمية و Chef تعتمد هذه الأنظمة عادةً على الوكلاء وسحب البيانات. يستخدم Ansible لغة YAML، بينما Chef يستخدم Ansible لغة Ruby، بينما يستخدم Puppet لغة برمجة خاصة به. وتختار العديد من الفرق Ansible لسهولة تعلمه.

نعم. برنامج Ansible مجاني ومفتوح المصدر بموجب رخصة جنو العمومية (GPL)، وتتولى صيانته شركة Red Hat ومجتمع كبير من المستخدمين. المحرك الأساسي وآلاف الوحدات النمطية مجانية تمامًا. كما تبيع Red Hat منصة Ansible Automation Platform، وهي منتج مدفوع يوفر واجهة مستخدم رسومية، ونظام وصول قائم على الأدوار، ودعمًا فنيًا.

نعم. بالإضافة إلى أجهزة Linux وUnix التي يتم الوصول إليها عبر SSH، يدير Ansible Windows العقد من خلال WinRM باستخدام مخصص Windows الوحدات النمطية. يمكنه تثبيت الحزم، وتعديل سجل النظام، وإدارة الخدمات، وتشغيل PowerShell، لذا فهو مناسب لأنظمة Linux المختلطة و Windows تتم أتمتة الأساطيل من خلال عقدة تحكم واحدة.

Ansible Galaxy عبارة عن منصة عامة لمشاركة وتنزيل أدوار ومجموعات المجتمع. يقوم الأمر ansible-galaxy بإنشاء بنية دليل الدور وتثبيت الأدوار المنشورة، مما يتيح لك إعادة استخدام الأتمتة المختبرة بدلاً من كتابة كل ملف تشغيل من الصفر.

يمكن للمساعدين المدعومين بالذكاء الاصطناعي إنشاء ملفات YAML من طلب بلغة بسيطة، وشرح الوحدات غير المألوفة، واقتراح حلول للمهام الفاشلة أو أخطاء بناء الجملة. كما يمكنهم تحويل نصوص shell البرمجية إلى مهام متكررة التنفيذ. يُنصح دائمًا بمراجعة ملفات التشغيل المُنشأة للتأكد من صحة أسماء الوحدات وتكرار التنفيذ قبل تشغيلها.

نعم. مساعد الطيار جيثب تُكمل هذه الأداة تلقائيًا مهام دفتر التشغيل، وإدخالات المخزون، وقوالب Jinja2 من تعليق قصير أو اسم ملف. تعامل مع مخرجاتها كنقطة انطلاق، وتحقق من المسافات البادئة، ومعلمات الوحدة، وأسماء المتغيرات، لأن ملفات YAML المُنشأة قد تشير إلى صيغة قديمة أو وحدات غير موجودة.

تلخيص هذه التدوينة بـ: