הקדמה
בגדר כללית, ניהול הגדרת השרת (המכונה גם במונח IT אוטומציה) הוא פתרון להפיכת ניהול התשתיות שלך לקוד מקור, המתאר את כל התהליכים הנדרשים להפעלת שרת בסט של תסריטי תפעול שניתן לגרסאות ולשימוש חוזר בקלות. זה עשוי לשפר משמעותית את אילות של כל תשתית שרת לאורך הזמן.
במדריך קודם, דיברנו על יתרונות העיקריים של הטמעת אסטרטגיית ניהול הגדרת השרתים שלך, כיצד כלי ניהול ההגדרה פועלים ומה הם בדרך כלל משותפים.
חלק זה של הסדרה ילמד אותך איך לאוטומטזיה של הפעלת שרתים באמצעות Ansible, כלי ניהול ההגדרה המספק תוכנה מלאה לאוטומציה ויכולות אורקסטרציה, תוך שמירה על מטרה של פשטות קיצונית ומינימליזם. נתמקד במונחי השפה, התחביר והתכונות הנדרשות ליצירת דוגמה מפושטת לאוטומציה מלאה של ההפעלה של שרת אינטרנט Ubuntu 18.04 באמצעות Apache.
הרשימימה הבאה מכילה את כל השלבים שצריך לאוטומט כדי להגיע למטרה שלנו:
- עדכון מטמון ה־
apt
- התקנת Apache
- יצירת ספריית שורש מותאמת אישית
- שים קובץ
index.html
בשורש המסמך המותאם - החל תבנית כדי להגדיר את המארח הווירטואלי המותאם
- אתחל את 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:
התנאי 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
של המשימה חשוב לווידוי שהפריסה תמשיך גם כאשר הפקודה נכשלת בביצוע.
המודול 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 ברירת המחדל:
הגדרת וקידום טריגרים
טריגרים משמשים להפעלת שינוי מצב בשירות, כמו איתור מחדש או עצירה. אף על פי שהם עשויים להיראות די דומים למשימות רגילות, טריגרים נפעלים רק כאשר נקראים מראש מהכוונה notify
במשימה. הם נקראים כתקרית באיזור הhandlers
של סקירת התסריטים, אך יכולים גם להתקיים בקבצים נפרדים.
בואו נשקול את השימוש בתבנית הקודמת שלנו, שבהגדרנו מארח וירטואלי של Apache. אם ברצונך לוודא ש-Apache מתבצעת מחדש לאחר שינוי במארח הווירטואלי, עליך ליצור תחילה טריגר עבור שירות ה-Apache. כך מוגדרים טריגרים בסקירת התסריטים:
ההוראה name
כאן חשובה מכיוון שזו תהיה המזהה היחודי של מטפל זה. כדי להפעיל מטפל זה ממשימה, עליך להשתמש באפשרות notify
:
ראינו כמה מהתכונות החשובות ביותר שניתן להשתמש בהן כדי להתחיל לכתוב פלייבוקים של Ansible. בקטע הבא, נכנס לדוגמה יותר ממוקדת של פלייבוק שיאפשר לאוטומט את ההתקנה והתצורה של Apache על Ubuntu.
דוגמה לפלייבוק
עכשיו בואו נסתכל על פלייבוק שיאפשר לאוטומט את ההתקנה של שרת אינטרנט Apache במערכת Ubuntu 18.04, כפי שדובר בהקדמה של מדריך זה.
הדוגמה המלאה, כולל קובץ התבנית להגדרת Apache וקובץ HTML להיות משורת הרוח של השרת האינטרנט, ניתן למצוא ב-Github. התיקייה מכילה גם קובץ Vagrantfile שמאפשר לך לבדוק את הפלייבוק בהגדרה פשוטה יותר, באמצעות מכונת וירטואלית שננהלת על ידי Vagrant.
תוכן הפלייבוק
תוכן הפלייבוק המלא זמין כאן לנוחותך:
- ---
- - hosts: all
- become: true
- vars:
- doc_root: /var/www/example
- tasks:
- - name: Update apt
- apt: update_cache=yes
-
- - name: Install Apache
- apt: name=apache2 state=latest
-
- - name: Create custom document root
- file: path={{ doc_root }} state=directory owner=www-data group=www-data
-
- - name: Set up HTML file
- copy: src=index.html dest={{ doc_root }}/index.html owner=www-data group=www-data mode=0644
-
- - name: Set up Apache virtual host file
- template: src=vhost.tpl dest=/etc/apache2/sites-available/000-default.conf
- notify: restart apache
- handlers:
- - name: restart apache
- 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 להתחברות כמשתמש המערכת הנוכחי:
תוכל גם להשתמש ב־-l
כדי להגביל את הביצוע למארח יחיד או קבוצת מארחים מהצמדים שלך:
אם נדרש לך לציין משתמש SSH שונה כדי להתחבר לשרת מרוחק, תוכל לכלול את הארגומנט -u user
לפקודה זו:
למידע נוסף על איך להריץ פקודות ופלייבוקים של Ansible, נא לעיין במדריך שלנו על איך להתקין ולהגדיר את Ansible על Ubuntu 18.04.
סיכום
אנסיבל הוא כלי אוטומציה עבור טכנולוגיות מידע ותקשורת מינימליסטי המצוי בעל סף למידה נמוך, והוא משתמש ב־YAML
עבור התגלות סקריפטים שלו. הוא מכיל מספר רב של מודולים מובנים שניתן להשתמש בהם להפשטת משימות כגון התקנת חבילות ועבודה עם תבניות. דרישות התשתיות הפשוטות שלו והשפה הפשוטה שלו עשויה להתאים למי שמתחיל בניהול הגדרות. עם זאת, יתכן כי יחסרו לו תכונות מתקדמות שניתן למצוא בכלים מורכבים יותר כמו Puppet ו־Chef.
בחלק הבא בסדרת זו, נראה סקירה מעשית של Puppet, כלי ניהול ההגדרות הפופולרי והמוכח שמשתמש ב־DSL מותאם אישית, בסיסי ועוצמתי המבוסס על Ruby לכתיבת סקריפטים להפעלה.