ניהול הגדרות 101: כתיבת פלייבוקים של Ansible

הקדמה

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

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

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

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

  1. עדכון מטמון ה־apt
  2. התקנת Apache
  3. יצירת ספריית שורש מותאמת אישית
  4. שים קובץ index.html בשורש המסמך המותאם
  5. החל תבנית כדי להגדיר את המארח הווירטואלי המותאם
  6. אתחל את Apache מחדש

נתחיל עם להביט במונחים המשמשים על ידי Ansible, ואחר כך נציג סקירה של התכונות העיקריות שניתן להשתמש בהן כדי לכתוב playbooks. בסוף המדריך, תמצא את תוכן הדוגמה המלאה להפעלת דוגמה להפעלה אוטומטית של השלבים המתוארים להגדרת Apache על Ubuntu 18.04

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

התחלה

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

מונחים

הרשימה הבאה מכילה סקירה מהירה של המונחים הרלוונטיים ביותר המשמשים ב־Ansible:

  • צומת בקרה: המכונה שבה Ansible מותקן, אחראית להרצת התקנת השרתים שאתה מנהל.
  • אחסון: קובץ INI המכיל מידע על השרתים שאתה מנהל.
  • פלייבוק: קובץ YAML המכיל סדרת פעולות שצריך לאוטומט.
  • משימה: בלוק שמגדיר פעולה יחידה להתבצע, לדוגמה: להתקין חבילה.
  • מודול: מודול כללית מפעילה משימת מערכת, כמו התמודדות עם חבילות או יצירת ושינוי קבצים. ל־Ansible יש מספר רב של מודולים מובנים, אך תוכל גם ליצור מותאמים אישית.
  • תפקיד: סט של פלייבוקים, תבניות וקבצים אחרים הקשורים, מאורגנים בדרך מוגדרת מראש כדי לקלוט ולשתף שימוש.
  • פלייב: התקנה מבוצעת מתחילתה עד סופה נקראת פלייב.
  • עובדות: משתנים גלובליים המכילים מידע על המערכת, כמו ממשקי רשת או מערכת הפעלה.
  • טיפולים: משמשים להפעלת שינויי מצב של שירותים, כמו איתור מחדש או טעינה מחדש של שירות.

תבנית משימה

A task defines a single automated step that should be executed by Ansible. It typically involves the usage of a module or the execution of a raw command. This is how a task looks:

- name: This is a task
  apt: name=vim state=latest

החלק name בעצם אופציונלי, אך מומלץ, מכיוון שהוא מופיע בפלט של התפקוד בעת ביצוע המשימה. החלק apt הוא מודול מובנה של Ansible שמפשט את ניהול החבילות בהפצות מבוססות Debian. המשימה הדוגמתית הזו מספרת ל-Ansible שהחבילה vim צריכה לשנות את מצבה ל־latest, מה שיגרום למנהל החבילות להתקין את החבילה הזו במקרה שהיא עדיין לא מותקנת.

תבנית פלייבוק

פלייבוקים הם קבצי YAML המכילים סדרת הוראות לאוטומציה של פרוביזיונינג שרת. הדוגמה הבאה היא פלייבוק פשוט שבוצע בו שתי משימות: עדכון של מטמון ה־apt והתקנה של vim לאחר מכן:

---
- hosts: all
  become: true
  tasks:
     - name: Update apt-cache 
       apt: update_cache=yes

     - name: Install Vim
       apt: name=vim state=latest

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

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

כתיבת פלייבוקים

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

עבודה עם משתנים

ישנם דרכים שונות להגדיר משתנים ב־Ansible. הדרך הפשוטה ביותר היא על ידי שימוש בקטע vars של תסריט. הדוגמה למטה מגדירה משתנה בשם package שנעשה בו שימוש מאוחר יותר בתוך משימה:

---
- hosts: all
  become: true
  vars:
     package: vim
  tasks:
     - name: Install Package
       apt: name={{ package }} state=latest

המשתנה package יש תחום גלובלי, המשמע שניתן לגשת אליו מכל נקודה של התפקוד, גם מקבצים מובאים ותבניות.

שימוש בלולאות

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

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

- name: Install Packages
  apt: name={{ item }} state=latest
  with_items:
     - vim
     - git
     - curl  

בנוסף, ניתן להשתמש גם ב־משתנה מערך כדי להגדיר את הפריטים שלך:

---
- hosts: all
  become: true
  vars:
     packages: [ 'vim', 'git', 'curl' ]
  tasks:
     - name: Install Package
       apt: name={{ item }} state=latest
       with_items: "{{ packages }}"

שימוש בתנאים

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

הדוגמה הבאה תכבה רק מערכות עם Debian:

- name: Shutdown Debian Based Systems
  command: /sbin/shutdown -t now
  when: ansible_os_family == "Debian"

התנאי when מקבל כארגומנט ביטוי לבדיקה. המשימה מתבצעת רק במקרה שבו הביטוי מוערך ל- true. בדוגמתנו, בדקנו עובדה כדי לבדוק האם מערכת ההפעלה היא ממשפחת Debian.

A common use case for conditionals in IT automation is when the execution of a task depends on the output of a command. With Ansible, the way we implement this is by registering a variable to hold the results of a command execution, and then testing this variable in a subsequent task. We can test for the command’s exit status (if failed or successful). We can also check for specific contents inside the output, although this might require the usage of regex expressions and string parsing commands.

הדוגמה הבאה מציגה שתי משימות תנאי על סמך הפלט מפקודת php -v. נבדוק את סטטוס היציאה של הפקודה, מאחר ואנו יודעים שהיא תכשל בביצוע במקרה שלא מותקן PHP בשרת זה. חלק ה- ignore_errors של המשימה חשוב לווידוי שהפריסה תמשיך גם כאשר הפקודה נכשלת בביצוע.

- name: Check if PHP is installed
  register: php_installed
  command: php -v
  ignore_errors: true

- name: This task is only executed if PHP is installed
  debug: var=php_install
  when: php_installed|success
  
- name: This task is only executed if PHP is NOT installed
  debug: msg='PHP is NOT installed'
  when: php_installed|failed

המודול debug שנעשה שימוש בו כאן הוא מודול שימושי להצגת תוכן של משתנים או הודעות דיבוג. הוא יכול להדפיס מחרוזת (כאשר משתמשים בארגומנט msg) או להדפיס את תוכן המשתנה (כאשר משתמשים בארגומנט var).

עבודה עם תבניות

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

הדוגמה הבאה היא תבנית להגדרת מארח וירטואלי של Apache, המשתמשת במשתנה להגדרת תיק המסמך עבור מארח זה:

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot {{ doc_root }}

    <Directory {{ doc_root }}>
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

מודול התבניות המובנה template משמש ליישום התבנית ממשימה. אם קראת לקובץ התבנית למעלה vhost.tpl, ושמת אותו באותו תיקייה של סקירת התסריטים שלך, כך תיישם את התבנית כדי להחליף את מארח הווירטואלי של Apache ברירת המחדל:

- name: Change default Apache virtual host
  template: 
    src: vhost.tpl
    dest: /etc/apache2/sites-available/000-default.conf

הגדרת וקידום טריגרים

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

בואו נשקול את השימוש בתבנית הקודמת שלנו, שבהגדרנו מארח וירטואלי של Apache. אם ברצונך לוודא ש-Apache מתבצעת מחדש לאחר שינוי במארח הווירטואלי, עליך ליצור תחילה טריגר עבור שירות ה-Apache. כך מוגדרים טריגרים בסקירת התסריטים:

handlers:
    - name: restart apache
      service: name=apache2 state=restarted
    
    - name: other handler
      service: name=other state=restarted

ההוראה name כאן חשובה מכיוון שזו תהיה המזהה היחודי של מטפל זה. כדי להפעיל מטפל זה ממשימה, עליך להשתמש באפשרות notify:

- name: Change default Apache virtual host
  template: 
    src: vhost.tpl
    dest: /etc/apache2/sites-available/000-default.conf
  notify: restart apache

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

דוגמה לפלייבוק

עכשיו בואו נסתכל על פלייבוק שיאפשר לאוטומט את ההתקנה של שרת אינטרנט Apache במערכת Ubuntu 18.04, כפי שדובר בהקדמה של מדריך זה.

הדוגמה המלאה, כולל קובץ התבנית להגדרת Apache וקובץ HTML להיות משורת הרוח של השרת האינטרנט, ניתן למצוא ב-Github. התיקייה מכילה גם קובץ Vagrantfile שמאפשר לך לבדוק את הפלייבוק בהגדרה פשוטה יותר, באמצעות מכונת וירטואלית שננהלת על ידי Vagrant.

תוכן הפלייבוק

תוכן הפלייבוק המלא זמין כאן לנוחותך:

playbook.yml
  1. ---
  2. - hosts: all
  3. become: true
  4. vars:
  5. doc_root: /var/www/example
  6. tasks:
  7. - name: Update apt
  8. apt: update_cache=yes
  9. - name: Install Apache
  10. apt: name=apache2 state=latest
  11. - name: Create custom document root
  12. file: path={{ doc_root }} state=directory owner=www-data group=www-data
  13. - name: Set up HTML file
  14. copy: src=index.html dest={{ doc_root }}/index.html owner=www-data group=www-data mode=0644
  15. - name: Set up Apache virtual host file
  16. template: src=vhost.tpl dest=/etc/apache2/sites-available/000-default.conf
  17. notify: restart apache
  18. handlers:
  19. - name: restart apache
  20. service: name=apache2 state=restarted

בואו נבדוק כל חלק מתוך פלייבוק זה במידע נוסף:

hosts: all
הפלייבוק מתחיל על ידי ציון שהוא צריך להיות מיושם על כל המארחים במלאי שלך (hosts: all). אפשר להגביל את ביצוע הפלייבוק למארח ספציפי, או לקבוצת מארחים. אפשרות זו יכולה להידרש מחדש בזמן הרצת הפלייבוק.

become: true
החלק become: true אומר ל־Ansible להשתמש בזיהוי זכויות (sudo) לביצוע כל המשימות בפלייבוק זה. אפשרות זו יכולה להידרש מחדש על בסיס משימה אחרת לפי משימה.

vars
מגדיר משתנה, doc_root, שמשמש מאוחר יותר במשימה. סעיף זה יכול להכיל מספר משתנים.

tasks
הסעיף בו מוגדרות המשימות האמיתיות. המשימה הראשונה מעדכנת את מטמון ה־apt, והמשימה השנייה מתקינה את החבילה apache2.

המשימה השלישית משתמשת במודול המובנה file כדי ליצור ספרייה שתשמש כשורש המסמך שלנו. מודול זה ניתן לשימוש לניהול קבצים ותיקיות.

המשימה הרביעית משתמשת במודול copy כדי להעתיק קובץ מקומי לשרת מרוחק. אנו מעתיקים קובץ HTML פשוט שישמש כאתר האינטרנט שלנו המאורח על ידי Apache.

handlers
לבסוף, יש לנו את הסעיף handlers, שבו מוגדרות השירותים. אנו מגדירים את המטפל restart apache שמתרע לו מהמשימה הרביעית, בה התבצע תבנית Apache.

הרצת פלייבוק

לאחר שאתה מוריד את תוכן הפלייבוק הזה לשלטון השליטה שלך ב־Ansible, תוכל להשתמש ב־ansible-playbook כדי להפעיל אותו על קודם אחד או יותר מתוך הצמדים שלך. הפקודה הבאה תפעיל את הפלייבוק על כל המארחים מהקובץ השליטה ברירת המחדל שלך, באמצעות אימות מפתח SSH להתחברות כמשתמש המערכת הנוכחי:

  1. ansible-playbook playbook.yml

תוכל גם להשתמש ב־-l כדי להגביל את הביצוע למארח יחיד או קבוצת מארחים מהצמדים שלך:

  1. ansible-playbook -l host_or_group playbook.yml

אם נדרש לך לציין משתמש SSH שונה כדי להתחבר לשרת מרוחק, תוכל לכלול את הארגומנט -u user לפקודה זו:

  1. ansible-playbook -l host_or_group playbook.yml -u remote-user

למידע נוסף על איך להריץ פקודות ופלייבוקים של Ansible, נא לעיין במדריך שלנו על איך להתקין ולהגדיר את Ansible על Ubuntu 18.04.

סיכום

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

בחלק הבא בסדרת זו, נראה סקירה מעשית של Puppet, כלי ניהול ההגדרות הפופולרי והמוכח שמשתמש ב־DSL מותאם אישית, בסיסי ועוצמתי המבוסס על Ruby לכתיבת סקריפטים להפעלה.

Source:
https://www.digitalocean.com/community/tutorials/configuration-management-101-writing-ansible-playbooks