איך לעבוד עם אנסיבל בעת ותנאים אחרים

אם נדרש לבצע משימות של Ansible בהתבסס על תנאים שונים, אז תהיה לך הנאה. Ansible when ותנאים נוספים מאפשרים לך לבדוק תנאים, כגון מבוסס על מערכת הפעלה, או אם משימה אחת תלויה במשימה הקודמת.

במדריך זה, תלמד איך לעבוד עם Ansible when ותנאים נוספים כך שתוכל לבצע משימות בלי לקרוס את הדברים.

בוא נתחיל!

דרישות קדם

מדריך זה כולל דוגמאות פרקטיות. אם ברצונך לעקוב, הקפד לוודא שיש לך את הדברים הבאים במקום:

  • מארח שליטה של Ansible – מדריך זה משתמש ב-Aansible v2.9.24 המתקיים על מכונת Ubuntu 18.04.5 LTS.
  • A remote computer to run commands.
  • יש לך צורך בקובץ ממלא הקצאות ולפחות מארח אחד או יותר המוגדרים כבר להפעלת פקודות וניגון של סקריפטים באמצעות Ansible. המדריך ישתמש בקבוצת הממשק שנקראת web.

עבודה עם Ansible when עם מספר משימות ב-Playbook

יש לכם מספר משימות בפלייבוק יכול להיות לא נעים אם כולן מבוצעות בלי תנאים מסוימים. בואו נתחיל את המדריך הזה על ידי הגדרת תנאי when בפלייבוק של Ansible עם מספר משימות.

1. פתחו טרמינל בשרת ה־Ansible controller.

2. הריצו את הפקודות הבאות כדי ליצור ספרייה ולתת לה שם שתרצו בספריית הבית שלכם, ונווטו אליה.

לדוגמה, הספרייה תקרא ansible_when_condition_demo. הספרייה הזו תכיל את ה־פלייבוק שתשתמשו בו כדי להפעיל את התנאי בתוך המשימה של Ansible.

# צורו ספרייה בשם ~/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 שלכם.

בשתי המשימות מתחת (משימה-1 ו־משימה-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 לביצוע המשימות המוגדרות ב-playbook (my_playbook.yml) על המארח המרוחק, שהוגדר בקובץ המלאי הקיים שלך.

ansible-playbook my_playbook.yml 

בצילום המסך למטה, ניתן לראות ש:

  • המשימה הראשונה החזירה סטטוס OK, שמציין שאין צורך בשינויים במשימה זו.
  • המשימה השנייה החזירה סטטוס skipping. כאשר התנאי אינו מתקיים, המשימה תתעבר.
  • המשימה השלישית החזירה סטטוס changed, שמציין שהמארח המרוחק לא היה במצב הנכון (כלומר, אפאצ'י לא קיים) ושונה כך שיתאפשר להתקין את Apache.
Invoking the ansible-playbook using ansible-playbook command

5. פתח ישיבת SSH לשרת המרוחק, שהיה המטרה של דרך המשחק של Ansible, באמצעות הלקוח SSH האהוב עליך כדי לאמת שהאפאצ'י מותקן ופועל.

6. לבסוף, הרץ את הפקודה service למטה כדי לוודא אם האפאצ'י מותקן (status apache2) בשרת המרוחק.

service status apache2

כפי שאתה רואה למטה, התקנת את שירות האפאצ'י על המכונה המרוחקת.

Verifying the Apache service on the remote node

עבודה עם Ansible when ולולאות

קודם ביצעת משימות של Ansible לפי תנאי Ansible when עבור פרמטר מסוים כמו ansible_os_family. אך אולי תרצה לבדוק תנאי עם מספר פרמטרים מוגדרים ברשימה. אם כן, נסה להוסיף loop במשימה.

פתח את הקובץ my_playbook.yml שיצרת קודם (שלב שלוש תחת "עבודה עם Ansible when עם משימות מרובות בפלייבוק"). החלף את תוכן הקובץ my_playbook.yml בקוד למטה.

המשימה בקוד למטה (משימה-1) מפעילה loop שבו התנאי 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

אולי ברצונך להוסיף תנאים מרובים כדי לבצע משימה. אם כן, למד איך להשתמש בעובדות Ansible בתוך תנאי when. עובדות Ansible מאפשרות לך להוסיף הצהרה תנאית לביצוע משימות בהתבסס על עובדות שנאספו, כגון מערכת ההפעלה שלך, כתובות ה-IP, מערכות הקבצים שמחוברות ועוד.

החלף את תוכן הקובץ my_playbook.yml עם הקוד שבתחתית.

בקוד שמתחת, שתי המשימות (משימה-1 ו־משימה-2) מבצעות רק (כיבוי מערכת) כאשר תנאי אחד מתוך התנאים הבאים הוא נכון:

  • שתי הערכים הפצה ו־גרסת_ראשי_הפצה החזירו ערך נכון.
  • ערך ה־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): לכיבוי הצומת המרוחקת אם os_family הוא 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. לבסוף, לבצע את הפלייבוק עם פקודת ansible-playbook למטה.

ansible-playbook my_playbook.yml

כפי שמוצג למטה, מאחר שהתוצאה הנרשמת עבור משתנה contents2 היא ריקה, המשימה השלישית מחזירה את ההודעה "התיקייה ריקה".

Running the Ansible playbook for Ansible when based on registered values

עבודה עם Ansible when בתפקידי Ansible

בדוגמה האחרונה זו, תלמד כיצד פקודת when ב־Ansible פועלת בתוך תפקידי Ansible. תפקידי Ansible מאפשרים לך להשתמש בהגדרות סטנדרטיות ולבצע התקנה מהירה יותר. קרא הלאה כדי ללמוד כיצד משימה מפעילה תפקידי Ansible רק אם תנאי ה־when ב־Ansible נכון.

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 שתצטרך להשיג תפקיד.
# צור ספרייה בשם תפקידים בתוך ספריית ~/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.

הפלייבוק למטה מתקין את Java בשרת המרוחק שבו הוא מופעל עם מודול apt.

---
# מתקין את Java (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.

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 באמצעות 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/