שליטה ב- Ansible על Windows: מדריך המומחה שלך

אפילו ש-Ansible ידועה בניהול צמתי Linux באמצעות SSH, האם את/ה יודע/ת שה-Ansible עובדת גם בווינדוס? באמצעות Windows Remote Management (WinRM), ה-Ansible יכולה לנהל ביעילות גם את כל צמתי הווינדוס שלך!

עם ה-Ansible בווינדוס, תוכל/י לבצע משימות כמו התקנת תיקונים, ניהול שרתי Windows, ביצוע סקריפטים ב-PowerShell, ועוד.

במדריך זה, תלמד/י איך להגדיר את הצומת הראשונה שלך בווינדוס כך שתיתן לנהל אותה באמצעות ה-Ansible, וכיצד להריץ פקודות ו-Playbooks עליה.

דרישות מוקדמות

אם ברצונך לעקוב אחרי המדריך, וודא/י שיש לך את התקנים הבאים לפני התחלת התהליך:

  • מחשב מארח לשליטה ב-Ansible – במדריך זה ישמש מחשב Ubuntu 18.04.5 LTS עם כתובת IP של 10.111.4.53 וה-Ansible גרסה 2.9.18. שים לב ש-Windows אינה נתמכת כצומת שליטה, אלא כצומת מנוהל.
  • התקנת Python במחשב המארח שלך – במדריך זה ישתמשו ב-Python גרסה 2, אך גרסה 3 אמורה לעבוד כמו כן.
  • ה-חבילת pip מותקנת במחשב המארח של ה-Ansible.
  • A Windows 2012 R2 or greater computer for Ansible to manage – This tutorial will use two Windows Server 2012 R2 Standard machines as remote nodes with IP addresses of 52.242.251.213 and 10.111.4.106.
  • A Windows workstation – This tutorial will perform some basic pre-configuration to the node that Windows will manage with Ansible and will require you to sitting at a Windows workstation.
  • שרת ה-Windows שתרצה לנהל יכול/ה להפעיל את הפעלת ניהול ב-PowerShell
  • A user account in the local Administrators group on the Windows computer. This tutorial will use an account called adminuser.

הגדרת המאזין של WinRM בווינדוס

לפני ש-Ansible יכולה לתקשר עם נוד Windows רחוק, עליה להצליח להתחבר אליו. היא עושה זאת דרך פרוטוקול ה-Microsoft WinRM. WinRM הוא אותו פרוטוקול ששימש PowerShell Remoting להפעלת פקודות רחוקות מתוך PowerShell.

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

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

אף שה-סקריפט PowerShell שמספקת Red Hat להגדרת WinRM עבר בדיקות והוא בטוח, כדאי לקרוא אותו ולהבין, ברמה גבוהה, מה הוא עושה.

המשימה הראשונה שלך תהיה להוריד את סקריפט ההגדרה ולהפעיל את Ansible על הנוד של Windows. כדי לעשות זאת, בהנחה שכבר יש לך PowerShell Remoting מופעל במחשב ה-Windows שלך ואתה נמצא בתחנת עבודה של Windows:

הורד את התסריט PowerShell ConfigureRemotingForAnsible.ps1 למחשב Windows המקומי שלך. המדריך יניח שהוא נשמר ב־~\Downloads.

הרץ את תסריט התצורה על גבי ה־Windows node שבו ינהל Ansible באמצעות הפקודה Invoke-Command. הפקודה למטה תפעיל את הפקודה על שני מכונות הדמו של המדריך ותבקש ממך את הסיסמה עבור חשבון ה־adminuser המקומי על ה־Windows nodes.

Invoke-Command -ComputerName 52.242.251.213, 10.111.4.106 -FilePath '~\Downloads\ConfigureRemotingForAnsible.ps1' -Credential (Get-Credential -UserName adminuser)

באופן ברירת מחדל, תסריט התצורה יגדיר את WinRM עבור אימות HTTP בסיסי. אם ברצונך ש־Ansible ישתמש בחיבור מאובטח יותר, למד איך להגדיר את WinRM על פי HTTPS עבור Ansible.

הגדרת הבקר של Ansible על Windows

עכשיו שה־Windows node מוכן עבור Ansible, בוא נגדיר את בקר ה־Ansible כדי להראות ל־Ansible כיצד לתקשר איתו.

1. התחבר למארח ה־Ansible controller שלך באמצעות SSH באמצעות לקוח SSH האהוב עליך.

2. התקן את המודול Python pywinrm. המודול Python pywinrm דרוש ל־Ansible על Windows כדי לתקשר עם מארחים באמצעות פרוטוקול WinRM.

pip install pywinrm

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

קובץ המלאי המוגדר כברירת מחדל של Ansible נמצא בתיקייה /etc/ansible/hosts.

קובץ המלאי לדוגמה למטה יוצר קבוצת windows קבוצה של מארחים הכוללת כל צומת Windows. המדריך משתמש בקבוצת מארחים כאן כדי להקל על ייעוץ לכל צמתי Windows (אם יש לך יותר מאחד) בו זמנית מאוחר יותר.

[windows]
 54.242.251.213
 10.111.4.106

4. לאחר מכן, הגדר מספר משתנים דרושים שישמשו את Ansible בעת התחברות למארחי Windows בקובץ המלאי כקבוצת windows:vars.

[windows:vars]
 ansible_user=localadmin ## שם המשתמש של Windows לתקשורת של Ansible
 ansible_password=s3crect ## סיסמת Windows לתקשורת של Ansible
 ansible_connection=winrm ## סוג החיבור של Ansible יכול לעשות עם צומת Windows מרוחק
 ansible_winrm_server_cert_validation=ignore ## התעלמות מאימות תעודות מכיוון שנשתמש רק בתעודה שלא נחתמה שבאה עם Ansible

שלום! הנה התרגום לעברית:

5. כעת, השתמש במודול win_ping של Ansible כדי לבצע בדיקת חיבור פשוטה למארחים בתוך קבוצת המארחים windows שהוגדרה בשלב מספר 3.

# windows היא קבוצת המארחים
# -m אומר ל-Ansible להשתמש במודול win_ping
 ansible windows -m win_ping

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

Successful win_ping connection

הפלט מאשר כי מארח השליטה של Ansible יכול לתקשר בהצלחה עם מארח ה- Windows מרחוק דרך WinRM.

הרצת פקודות זמניות על מארחים ב-Windows

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

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

1. במקום המודול win_ping הפעם, קראו למודול win_feature (-m), והעבירו לו שני ארגומנטים (-a) של name ו־state המציינים את שם התכונה של Windows ואת המצב שבו אתם רוצים שיהיה בו.

# כאן ווינדוז הוא קבוצת מארחים
# win_feature הוא שם המודול
# state=present אומר להתקין את החבילה או השירות
 ansible windows -m win_feature -a "name=Telnet-Client state=present"

כאשר אתם מפעילים את הפקודה לעיל, אם הכל הולך כפי שצוי, Ansible צריכה להתחבר לכל הצמתים בקבוצת המארחים windows ולהריץ את הפקודה win_feature על כל אחד, בודקת ואם התכונה לא קיימת, מתקינה את התכונה Telnet-Client של Windows.

Ansible Windows Feature

2. Ansible מציגה הצלחה, אך כדי להיות בטוחים, התחברו לצמתי Windows באופן ידני באמצעות PowerShell ווודאו שהתכונה של Telnet Client מותקנת כעת. על התחנת Windows המקומית שלך, הריצו את Invoke-Command כדי להריץ את הפקודה של PowerShell Get-WindowsFeature על כל מחשב Windows.

Invoke-Command -ComputerName 52.242.251.213, 10.111.4.106 -ScriptBlock { Get-WindowsFeature -Name 'Telnet-Service' } -Credential (Get-Credential -UserName adminuser)

בנקודה זו, תוכלו להריץ כל מודול של Windows שתרצו כפקודות יחידות!

יצירת והרצת סקריפטי Ansible על Windows

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

הפעלת פקודות מרחוק ב-Windows עם מודול win_command

בהנחיית שאתה עדיין מחובר למארח שלך של אנסיבל:

1. צור תיקייה בתחתית ספריית הבית שלך בשם ansible-windows-demo ושנה אליה. תיקייה זו תחזיק את הפלייבוק שלך.

mkdir ~/ansible-windows-demo 
cd ~/ansible-windows-demo 

2. פתח את עורך הטקסט האהוב עליך וצור ושמור קובץ בשם ansible-windows.yml בתיקייה ~/ansible-windows-demo.

פלייבוקים של אנסיבל נכתבים בפורמט YAML

3. עתה, העתק את הפלייבוק למטה לתוך קובץ ansible-windows.yml כדי ליצור משימה יחידה. הפלייבוק יפעיל את פקודת ה-netstat בחלונות באמצעות win_command – מודול אנסיבל ל-Windows על כל המארחים בתוך קבוצת המארחים windows.

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

---
 - name: Ansible win_command module example  
   hosts: windows # קבוצת מארחים להפעלת המודול עליה       
   tasks: 
   -  name: run an executable command on a remote Windows system
      win_command: netstat -e # win_command הוא מודול של Windows. 

4. הפעל את ה-ansible-windows.yml playbook, שמבצע את המשימה על המארח המרוחק על ידי הפעלת הפקודה הבאה.

ansible-playbook ansible-windows.yml

אם הכל התבצע כהולך, אתה אמור לראות פלט כמו שמוצג למטה.

Ansible successfully executed the netstat command using win_command module

הרצת פקודות PowerShell רחוקות עם המודול win_shell

יצרת playbook להריץ פקודת cmd.exe רחוקה (netstat) על נודים שניהלו ב-Windows בדוגמה הקודמת. בוא נתריע עכשיו ונריץ פקודות PowerShell באמצעות המודול win_shell.

כברירת מחדל, המודול win_shell רץ ב-PowerShell על המארח של Windows

על התחנה העבודה שלך במערכת Windows:

1. ראשית, פתח את העורך הטקסט המועדף עליך בתחנת העבודה המקומית שלך שעל מערכת ההפעלה Windows וצור סקריפט PowerShell דוגמה והעתק את הקוד הבא אליו, שמור אותו בשם one.ps1. במדריך ~\one.ps1.

הקוד למטה יוצר קובץ טקסט ריק בשם test2.txt בתיקייה C:\temp.

Set-Content -Path C:\temp\test2.txt -Value ''

2. העתק את סקריפט ה-PowerShell one.ps1 לצומתי ה-Windows שלך באמצעות השיטה שאתה מעדיף. במדריך זה אנו מניחים שהעתקת את סקריפט ה-PowerShell one.ps1 לתיקיית C:\Temp בכל צומת Windows.

3. לאחר שסקריפט ה-PowerShell דוגמה נמצא בצומת או בצמתי ה-Windows, התחבר לשרת הבקרת Ansible שלך ופתח שוב את העורך הטקסט המועדף עליך. הפעם, צור ושמור פלייבוק נוסף בשם ansible-windows-shell.yml באותו המדריך ~/ansible-windows-demo.

4. העתק והדבק את הפלייבוק הבא אל תוך הקובץ ansible-windows-shell.yml. פלייבוק זה ירוץ שתי משימות כדי להדגים את המודול win_shell. הוא מפעיל את סקריפט ה-PowerShell שהועתק מהשלב #2 ומכניס את קוד ה-PowerShell ישירות לפלייבוק כדי להדגים שאין צורך בסקריפט.

כדי להעביר מספר שורות של קוד PowerShell למודול win_shell, השתמש בתו | (צינור).

---
 - name: Ansible win_shell module example 
   remote_user: localadmin # משתמש Windows מקומי להתחברות
   hosts: windows # קבוצת מארחים רחוקים
   tasks:
    - name: Single line PowerShell # הפעלת פקודה יחידה באמצעות המודול win_shell
      win_shell: C:\temp\one.ps1
    - name: Run multi-lined shell commands 
      win_shell: |
        $text = ' Iam Author of ATA'
       Set-Content -Path C:\temp\test3.txt -Value $text 

5. כעת, הפעל את הפלייבוק השני ansible-windows-shell.yml, שמבצע פעולה על המארח הרחוק אך עם PowerShell.

ansible-playbook ansible-windows-shell.yml
ansible-playbook ansible-windows-shell.yml

6. אם נדרש, בעמדת ה-Workstation שלך של Windows, אמת כי הפלייבוק הפעיל את הסקריפט הקיים וקוד ה-PowerShell בפלייבוק.

Invoke-Command -ComputerName 52.242.251.213, 10.111.4.106 -ScriptBlock { Test-Path -Path 'C:\Temp\test3.txt','C:\Temp\test2.txt' } -Credential (Get-Credential -UserName adminuser)

אם פלייבוק של Ansible הופעל בהצלחה, PowerShell צריך להחזיר שני פעולות True המציינות שהקבצים כעת קיימים.

מסקנה

במדריך זה, למדת כיצד להגדיר את ה-Managed Node הראשון שלך ב-Windows ב-Aansible. אף ש- Ansible ידועה מסורתית ככלי של Linux, יש אפשרות להשתמש בה גם עבור Windows!

אילו פלייבוקים ו-מודולי Windows תתחיל להשתמש כדי לנהל את Windows באמצעות Ansible?

Source:
https://adamtheautomator.com/ansible-on-windows/