كيفية العمل مع Ansible When وشروط أخرى

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

في هذا البرنامج التعليمي ، ستتعلم كيفية العمل مع “Ansible when” والشروط الأخرى حتى تتمكن من تنفيذ المهام دون تدمير الأمور.

دعنا نبدأ!

المتطلبات المسبقة

يتضمن هذا البرنامج التعليمي أمثلة عملية. إذا كنت ترغب في متابعتها ، تأكد من وجود ما يلي:

  • مضيف تحكم “Ansible” – يستخدم هذا البرنامج التعليمي “Ansible v2.9.24” المستضاف على جهاز “Ubuntu 18.04.5 LTS”.
  • A remote computer to run commands.
  • سيتعين عليك إعداد ملف “التجهيز” وتكوين مضيف واحد أو أكثر بالفعل لتشغيل أمر Ansible وسيناريوات اللعب. سيستخدم هذا البرنامج التعليمي مجموعة تجهيز تسمى “الويب”.

العمل مع “Ansible when” مع عدة مهام في السيناريو

إمتلاك مهام متعددة في سيناريو يمكن أن يكون مزعجًا إذا تم تنفيذها جميعًا دون شروط محددة. دعنا نبدأ هذا البرنامج التعليمي بتعريف شروط when في سيناريو أنسيبل باستخدام مهام متعددة.

1. قم بفتح نافذة الطرفية على مضيف تحكم أنسيبل.

2. قم بتشغيل الأوامر أدناه لإنشاء دليل وتسميته بأي اسم تفضله في دليل المستخدم الخاص بك، وانتقل إلى ذلك الدليل.

في هذا المثال، يتم تسمية الدليل بـ ansible_when_condition_demo. سيحتوي هذا الدليل على سيناريو الذي ستستخدمه لتنفيذ الشرط “when” في مهمة أنسيبل.

# إنشاء دليل بأسم ~/ansible_when_condition_demo
mkdir ~/ansible_when_condition_demo
# تغيير دليل العمل إلى ~/ansible_when_condition_demo
cd ~/ansible_when_condition_demo

3. في محرر الشفرة المفضل لديك، قم بإنشاء ملف YAML في الدليل ~/ansible_when_condition_demo. في هذا المثال، يسمى الملف my_playbook.yml. قم بنسخ ولصق محتويات سيناريو YAML أدناه في ملف my_playbook.yml.

في كلا المهام أدناه (Task-1 و Task-2)، تتحقق الشروط when من نظام التشغيل الذي يتواجد عليه كل مضيف عن بُعد. يتم تمرير النتيجة إلى المتغير العام ansible_os_family في كل مهمة.

إذا كانت قيمة العلامات التالية ansible_os_family تساوي إما RedHat أو Debian، فإن Ansible ينفذ أحد المهام لتثبيت Apache.

---
- name: Ansible tasks to work on Ansible When
# تعريف الخادم البعيد حيث سيعمل Ansible
  hosts: web
  remote_user: ubuntu # استخدام الخادم البعيد كـ ubuntu
  become: true # تشغيل المهام بصلاحيات مستخدم مرتفعة (sudo)
  tasks:

# (المهمة-1) التحقق مما إذا كانت ansible_os_family == "RedHat" ثم تثبيت Apache على العقد البعيد
    - name: Install Apache on CentOS  Server
      yum: name=httpd  state=present
      become: yes
      when: ansible_os_family == "RedHat"

# (المهمة-2) التحقق مما إذا كانت ansible_os_family == "Debian" ثم تثبيت Apache على العقد البعيد
    - name: Install Apache on Ubuntu Server
      apt:name=apache2 state=present
      become: yes
      when: ansible_os_family == "Debian"

4. قم بتشغيل الأمر ansible-playbook أدناه لتنفيذ المهام المعرفة في دفتر الأعمال (my_playbook.yml) على الخادم البعيد المعرف في ملف المخزون الحالي الخاص بك.

ansible-playbook my_playbook.yml 

في الصورة المرفقة أدناه، يمكنك أن ترى أن:

  • المهمة الأولى عادت بحالة موافقة، مما يظهر أن المهمة لا تتطلب أي تغييرات.
  • المهمة الثانية عادت بحالة تخطي. عندما لا تتوافق الشرط، سيتم تخطي المهمة.
  • المهمة الثالثة عادت بحالة تغيير، مما يشير إلى أن الخادم البعيد لم يكن في الحالة المناسبة (أي أن Apache غير موجود) وتم تعديله لتثبيت Apache.
Invoking the ansible-playbook using ansible-playbook command

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

6. أخيرًا، قم بتشغيل الأمر service أدناه للتحقق مما إذا كانت Apache مثبتة (status apache2) على الخادم البعيد.

service status apache2

كما يمكنك رؤية أدناه، قمت بتثبيت خدمة Apache على الجهاز البعيد.

Verifying the Apache service on the remote node

العمل مع شرط when وحلقات في Ansible

سابقًا، قمت بتنفيذ مهام Ansible وفقًا لشرط when فيما يتعلق بمعلمة معينة مثل ansible_os_family. ولكن ربما تحتاج إلى التحقق من حالة معينة باستخدام معلمات متعددة محددة في قائمة. إذا كان الأمر كذلك، فيمكنك محاولة إضافة حلقة في المهمة.

افتح ملف my_playbook.yml الذي قمت بإنشائه مسبقًا (الخطوة الثالثة في “العمل مع Ansible when مع مهام متعددة في السيناريو”). استبدل محتوى ملف my_playbook.yml بالشفرة أدناه.

المهمة في الشفرة أدناه (Task-1) تقوم بتشغيل حلقة حيث يتحقق الشرط when مما إذا كانت قيمة العنصر أكبر من خمسة وتعيد النتيجة.

---
- name: Ansible tasks to work on Ansible When
# تعريف الخادم البعيد الذي سيتم تشغيل Ansible عليه
  hosts: web
  remote_user: ubuntu   # استخدام الخادم البعيد كـ أوبونتو
  become: true
  tasks:
  # (المهمة -1) التحقق مما إذا كانت قيمة العنصر أكبر من 5
    - name: Run with items greater than 5
      ansible.builtin.command: echo {{ item }}
      loop: [ 0, 2, 4, 6, 8, 10 ]
      when: item > 5*

قم الآن بتشغيل الأمر أدناه لتنفيذ سيناريو العمل كما فعلت سابقًا.

 ansible-playbook my_playbook.yml

أدناه يمكنك رؤية حالة التخطي عندما تكون الشرط غير صحيح وحالة التغيير عندما يكون الشرط صحيح.

Checking the when condition for multiple parameters

العمل مع Ansible when و Ansible facts

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

استبدل محتوى ملف my_playbook.yml بالكود أدناه.

في الكود أدناه، تنفذ كلتا المهام (Task-1 و Task-2) فقط (إيقاف نظام التشغيل) عندما يكون أحد الشروط التالية صحيحًا:

  • تمت إرجاع قيمة صحيحة لكل من distribution و distribtion_major_version.
  • قيمة os_family تساوي CentOS.
---
- name: Ansible When Single task example
  hosts: web
  remote_user: ubuntu
  become: true
  tasks:
# (المهمة-1): لإيقاف تشغيل العقدة البعيدة إذا كان التوزيع CentOS بإصدار رئيسي 6 
    - name: Shut down CentOS 6 systems
      ansible.builtin.command: /sbin/shutdown -t now
      when:
        - ansible_facts['distribution'] == "CentOS"
        - ansible_facts['distribution_major_version'] == "6"
# (المهمة-2): لإيقاف تشغيل العقدة البعيدة إذا كانت عائلة نظام التشغيل CentOS. 
    - name: Shut down CentOS flavored systems
      ansible.builtin.command: /sbin/shutdown -t now
      when: ansible_facts['os_family'] == "CentOS"

قم بتنفيذ الكتاب النصي كما فعلت سابقًا باستخدام الأمر أدناه.

ansible-playbook my_playbook.yml

لاحظ أدناه أن كلا المهام تظهر الحالة التخطي لأنك تستخدم Ubuntu. تنفذ المهمة فقط إذا كنت تستخدم CentOS.

Executing the ansible-playbook with Ansible facts in Ansible when

العمل مع Ansible when بناءً على القيم المسجلة

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

1. أنشئ دليلاً فارغًا باسم /home/ubuntu/hello.

2. استبدل محتوى ملف my_playbook.yml بالكود أدناه، الذي يقوم بالأمور التالية:

المهمة الأولى (Task-1) تقوم بسرد محتويات (الملفات والمجلدات الفرعية) في دليل /etc/hosts في الذاكرة وتحفظ هذه النتيجة في متغير contents1 من خلال أمر register.

المهمة الثانية (Task-2) تقوم بسرد محتويات (فارغة حاليًا) في الدليل /home/ubuntu/hello في الذاكرة وتحفظ هذا القائمة في متغير contents2.

المهمة الثالثة (Task-3) تفحص وتقوم بطباعة رسالة “الدليل فارغ” إذا كانت إما نتيجة المتغير المسجل للمتغير contents1 أو contents2 فارغة.

خاصية stdout لمتغير contents1 و contents2 هي الإخراج الخاص بالشيل المحفوظ من نتيجة تشغيل أوامر المهمة.

---
- name: Ansible When Single task example
  hosts: web
  remote_user: ubuntu
  become: true
  tasks:
# (المهمة-1): لعرض محتوى الدليل في دليل /etc/hosts
      - name: List contents of directory and Store in content1
        ansible.builtin.command: ls /etc/hosts
        register: contents1
# (المهمة-2): لعرض محتوى الدليل في /home/ubuntu/hello
      - name: List contents of directory and Store in content2
        ansible.builtin.command: ls /home/ubuntu/hello
        register: contents2
# (المهمة-3): عرض الدليل فارغ إذا كان أي من الدليل 
# /etc/hosts أو /home/ubuntu/hello هو دليل فارغ
      - name: Check contents for emptiness for content1 or content2
        ansible.builtin.debug:
          msg: "Directory is empty"
        when: contents1.stdout == "" or contents2.stdout == ""

3. أخيرًا، قم بتنفيذ الـ playbook بواسطة الأمر ansible-playbook أدناه.

ansible-playbook my_playbook.yml

كما هو موضح أدناه، نظرًا لأن النتيجة المسجلة لمتغير contents2 فارغة، يقوم المهمة الثالثة بإرجاع رسالة الدليل فارغ.

Running the Ansible playbook for Ansible when based on registered values

العمل مع Ansible when في أدوار Ansible

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

1. قم بتشغيل الأوامر أدناه لإنشاء دليل يسمى ~/ansible_role_when_demo في دليل المستخدم الخاص بك وتغيير إلى ذلك الدليل كدليل عمل. سيحتوي الدليل ~/ansible_role_when_demo على ملفات العرض التوضيحي لهذا المثال.

# إنشاء دليل يسمى ~/ansible_role_when_demo في دليل المستخدم الخاص بك
mkdir ~/ansible_role_when_demo
# التغيير إلى الدليل ~/ansible_role_when_demo
cd ~/ansible_role_when_demo

2. بعد ذلك، قم بتشغيل الأوامر أدناه لإنشاء دليل ~/ansible_role_when_demo/roles و ~/ansible_role_when_demo/roles/java/tasks.

أدناه ما سيحتويه كل دليل:

  • سيحتوي الدليل ~/ansible_role_when_demo/roles على الدور الذي تحتاج إلى نشره.

بشكل افتراضي، يبحث Ansible عن الأدوار في موقعين في دليل يسمى roles/ داخل الدليل الذي يتواجد فيه ملف السيناريو أو في /etc/ansible/roles. إذا كنت ترغب في تخزين الأدوار في مسارات مختلفة، قم بتعريف المسارات باستخدام المعلمة - role: في ملف السيناريو.

  • ستحتوي المجلد ~/ansible_role_when_demo/roles/java/tasks على ملف main.yml ستحتاج إلى نشر دور.
# قم بإنشاء دليل يسمى roles داخل دليل ~/ansible_role_when_demo
mkdir -p roles
# تغيير دليل العمل إلى دليل ~/ansible_role_when_demo/roles
cd roles 
# قم بإنشاء الدليل الأصلي (-p) المسمى java ودليل فرعي يسمى tasks
mkdir -p java/tasks

الآن، قم بإنشاء ملف يسمى main.yml في الدليل ~/ansible_role_when_demo/roles/java/tasks، ثم قم بنسخ ولصق كود السيناريو أدناه إلى ملف main.yml.

السيناريو أدناه يقوم بتثبيت الجافا على العقدة البعيدة التي يتم تشغيلها عليها باستخدام وحدة التحكم apt.

---
# تثبيت الجافا (Open Jdk)
- name: Install Java 1.8
  apt: name=openjdk-8-jdk

4. قم بإنشاء ملف YAML آخر بالاسم الذي تفضله، وانسخ/لصق الكود أدناه. لهذا المثال، يُسمى الملف ~/ansible_role_when_demo/java-setup.yml.

الكود أدناه ينفذ دور Ansible (java) إلى المستخدم البعيد (ubuntu) الذي يحتوي على صلاحيات المسؤول فقط عندما يكون المستخدم البعيد على نظام Debian.

- name: Java Installation playbook
# تحديد الخادم البعيد حيث سيتم نشر الحزمة 
  hosts: myserver
  remote_user: ubuntu   # باستخدام مستخدم بعيد كـ ubuntu
  become: true
  tasks:  
  roles:
     - role: java
       # تنفيذ المهمة فقط إذا كان المستخدم البعيد على نظام Debian.
       when: ansible_facts['os_family'] == 'Debian'

5. قم بتشغيل الأمر tree للتحقق من وجود جميع المجلدات والملفات المطلوبة في ~/ansible_role_when_demo directory.

Verifying all of the required folders in the ~/ansible_role_when_demo directory

6. أخيرًا، قم بتنفيذ الملف التنفيذي باستخدام أمر ansible-playbook التالي. ansible-playbook java-setup.yml

ansible-playbook java-setup.yml

فيما يلي، أظهر المهمة حالة changed، مشيرًا إلى نجاح تثبيت Java بنجاح حيث أن العقد البعيد على نظام Debian.
تشغيل الملف التنفيذي لأنسيبل باستخدام Ansible when مع أدوار Ansible

Running the Ansible playbook using Ansible when with Ansible roles

الختام

في هذا البرنامج التعليمي، تعلمت طرق مختلفة لاستخدام Ansible when وشروط أخرى. كما تعلمت كيفية تطبيق شروط Ansible when، من المهام الأساسية باستخدام حقائق Ansible facts ونشر أدوار Ansible roles.

الآن كيف يمكنك الاستفادة من هذه المعرفة الجديدة؟ ربما توفير الوقت في تكوين خوادم متعددة باستخدام قوالب Ansible مع تطبيق شروط Ansible when؟

Source:
https://adamtheautomator.com/ansible-when/