Ansible auf Windows beherrschen: Ihr Expertenführer

Obwohl Ansible dafür bekannt ist, Linux-Knoten mit SSH zu verwalten, wussten Sie, dass Ansible auf Windows genauso gut funktioniert? Mit Windows Remote Management (WinRM) kann Ansible auf Windows effektiv alle Ihre Windows-Knoten verwalten!

Mit Ansible auf Windows können Sie Aufgaben wie das Bereitstellen von Patches, das Verwalten von Windows-Servern, das Ausführen von PowerShell-Skripten und mehr ausführen.

In diesem Tutorial erfahren Sie, wie Sie Ihren ersten Windows-Knoten einrichten, der mit Ansible verwaltet werden soll, und wie Sie Befehle und Playbooks dagegen ausführen können.

Voraussetzungen

Wenn Sie dem Tutorial folgen möchten, stellen Sie bitte sicher, dass Sie Folgendes haben, bevor Sie beginnen:

  • Einen Ansible-Controller-Host – In diesem Tutorial wird Ansible v2.9.18 auf einem Ubuntu 18.04.5 LTS-Rechner mit der IP-Adresse 10.111.4.53 verwendet. Beachten Sie, dass Windows nicht als Steuerknoten unterstützt wird, sondern nur als verwalteter Knoten.
  • Python installiert auf Ihrem Ansible-Controller-Host – In diesem Tutorial wird Python v2 verwendet, aber v3 sollte genauso gut funktionieren.
  • Das Paket pip installiert auf dem Ansible-Controller.
  • 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.
  • Der zu verwaltende Windows-Server hat PowerShell Remoting aktiviert
  • A user account in the local Administrators group on the Windows computer. This tutorial will use an account called adminuser.

Einrichten des WinRM-Listeners auf Windows

Bevor Ansible mit einem entfernten Windows-Knoten kommunizieren kann, muss es eine Verbindung dazu herstellen können. Dies geschieht über das Microsoft-Protokoll WinRM. WinRM ist dasselbe Protokoll, das PowerShell Remoting verwendet, um Remote-Befehle von innerhalb von PowerShell auszuführen.

Zum Zeitpunkt dieses Schreibens unterstützt Ansible SSH als Verwaltungsprotokoll, aber es handelt sich um eine experimentelle Funktion zu diesem Zeitpunkt.

Damit Ansible WinRM zur Kommunikation mit dem Windows-Knoten verwenden kann, müssen Sie WinRM konfigurieren. Hierzu bietet Ansible ein PowerShell-Skript an, das verschiedene WinRM-Optionen festlegt.

Obwohl das PowerShell-Skript, das von Red Hat bereitgestellt wird, um WinRM zu konfigurieren, getestet wurde und sicher ist, sollten Sie es durchlesen und auf einer hohen Ebene verstehen, was es tut.

Ihre erste Aufgabe wird darin bestehen, das Konfigurationsskript herunterzuladen und Ansible auf dem Windows-Knoten auszuführen. Dazu, unter der Annahme, dass Sie bereits PowerShell Remoting aktiviert haben auf Ihrem Ziel-Windows-Computer und Sie sich an einer Windows-Arbeitsstation befinden:

Laden Sie das ConfigureRemotingForAnsible.ps1 PowerShell-Skript auf Ihren lokalen Windows-Computer herunter. In diesem Tutorial wird angenommen, dass es unter ~\Downloads gespeichert ist.

Führen Sie das Konfigurationsskript auf dem Windows-Knoten aus, den Ansible verwalten wird, indem Sie das Invoke-Command-Befehl verwenden. Der folgende Befehl führt den Befehl auf den beiden Demomaschinen des Tutorials aus und fordert Sie auf, das Kennwort für das lokale adminuser-Konto auf den Windows-Knoten einzugeben.

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

Standardmäßig konfiguriert das Konfigurationsskript WinRM für die grundlegende HTTP-Authentifizierung. Wenn Sie möchten, dass Ansible eine sicherere Verbindung verwendet, erfahren Sie, wie Sie WinRM über HTTPS für Ansible konfigurieren.

Konfigurieren des Controllers von Ansible auf Windows

Jetzt, da der Windows-Knoten für Ansible bereit ist, konfigurieren wir den Ansible-Controller, um Ansible zu zeigen, wie er mit ihm kommunizieren soll.

1. Verbinden Sie sich über SSH mit Ihrem bevorzugten SSH-Client mit Ihrem Ansible-Controller-Host.

2. Installieren Sie das pywinrm-Python-Modul. Das pywinrm-Python-Modul ist erforderlich, damit Ansible auf Windows über das WinRM-Protokoll mit Hosts kommunizieren kann.

pip install pywinrm

3. Definieren Sie die entfernten Windows-Knoten in einer Ansible-Inventardatei. Ein Ansible-Inventar ist eine Sammlung von Remote-Hosts, die in einer Datei entweder nach ihrem Hostnamen oder ihrer IP-Adresse definiert sind. Sobald definiert, können Sie dann mit Befehlen und Playbooks auf Ansible-Inventare abzielen, wie Sie bald sehen werden.

Die Standard-Ansible-Inventardatei befindet sich im Verzeichnis /etc/ansible/hosts.

Die folgende Beispieldatei wird mit einer windows Hostgruppe erstellt, die jeden Windows-Knoten enthält. Das Tutorial verwendet hier eine Hostgruppe, um es später einfacher zu machen, alle Windows-Knoten (falls vorhanden) auf einmal anzusprechen.

[windows]
 54.242.251.213
 10.111.4.106

4. Definieren Sie als nächstes einige erforderliche Variablen, die Ansible verwenden wird, wenn es sich mit den Windows-Hosts in der Inventardatei verbindet, als windows:vars-Gruppe.

[windows:vars]
 ansible_user=localadmin ## der Windows-Benutzername, mit dem Ansible kommunizieren soll
 ansible_password=s3crect ## das Windows-Passwort, mit dem Ansible kommunizieren soll
 ansible_connection=winrm ## Die Art der Verbindung, die Ansible mit dem entfernten Windows-Knoten herstellen wird
 ansible_winrm_server_cert_validation=ignore ## Zertifikatsüberprüfung ignorieren, da wir nur ein selbstsigniertes Zertifikat verwenden, das mit Ansible geliefert wird

5. Verwenden Sie nun das Ansible win_ping Modul, um einen einfachen Verbindungstest zu den Hosts innerhalb der windows Hostgruppe durchzuführen, wie in Schritt #3 definiert.

# windows ist die Hostgruppe
# -m teilt Ansible mit, das win_ping Modul zu verwenden
 ansible windows -m win_ping

Nach der Ausführung sehen Sie unten, dass Ansible grünen Text mit einer ERFOLG-Nachricht zurückgibt, die den erfolgreichen Ping-Versuch anzeigt.

Successful win_ping connection

Die Ausgabe bestätigt, dass der Ansible-Controller-Host erfolgreich über WinRM mit dem Windows-Remote-Host kommunizieren kann.

Ausführung von Ad-hoc-Befehlen auf Windows-Hosts

Zu diesem Zeitpunkt sind Sie bereit, Ansible zu nutzen, um Ihre Windows-Knoten zu steuern. Lassen Sie uns das nun testen, indem wir einen Ad-hoc-Befehl auf den Windows-Knoten ausführen, um sie zu ändern. Ad-hoc-Befehle sind großartig, wenn Sie einen einfachen Befehl auf Knoten ausführen müssen, ohne zuerst ein Playbook zu erstellen.

Wir demonstrieren Ad-hoc-Befehle, indem wir ein Windows-Feature auf den in der Inventardatei definierten Windows-Knoten installieren. Dazu, vorausgesetzt, Sie sind immer noch per SSH mit Ihrem Ansible-Controller-Knoten verbunden:

1. Anstelle des win_ping-Moduls rufen Sie dieses Mal das win_feature-Modul (-m) auf und übergeben ihm zwei Argumente (-a) für name und state, die den Namen des Windows-Features und den gewünschten Zustand angeben.

# windows hier ist eine Gruppe von Hosts
# win_feature ist der Name des Moduls
# state=present bedeutet, das Paket oder den Dienst zu installieren
 ansible windows -m win_feature -a "name=Telnet-Client state=present"

Wenn Sie den obigen Befehl ausführen, sollte Ansible bei Erfolg eine Verbindung zu allen Knoten in der Hostgruppe windows herstellen und auf jedem den Befehl win_feature ausführen, um das Windows-Feature Telnet-Client zu überprüfen und falls nicht vorhanden, zu installieren.

Ansible Windows Feature

2. Ansible zeigt Erfolg an, aber um sicher zu gehen, stellen Sie manuell eine Verbindung zu den Windows-Knoten mit PowerShell her und überprüfen Sie, ob das Windows-Feature „Telnet Client“ jetzt installiert ist. Führen Sie auf Ihrer lokalen Windows-Workstation Invoke-Command aus, um den PowerShell-Befehl Get-WindowsFeature auf jedem Windows-Computer auszuführen.

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

Zu diesem Zeitpunkt können Sie jedes Windows-Modul als Ad-hoc-Befehle ausführen!

Erstellen und Ausführen von Ansible auf Windows-Playbooks

Sobald Sie die Kunst des Ausführens von Ad-hoc-Befehlen auf Windows-Verwaltungsinstanzen gemeistert haben, ist Ihre nächste Aufgabe, Playbooks zu erstellen und auszuführen. Ein Ansible-Playbook kombiniert Befehle an einem einzigen Ort und ermöglicht es Ihnen, komplexe Logik zu schreiben, um komplexe Automatisierungsszenarien durchzuführen.

Ausführen von Remote-Windows-Befehlen mit dem win_command-Modul

Vorausgesetzt, Sie sind immer noch mit Ihrem Ansible-Controller-Host verbunden:

1. Erstellen Sie einen Ordner unter Ihrem Home-Verzeichnis namens ansible-windows-demo und wechseln Sie dorthin. Dieser Ordner wird Ihr Playbook enthalten.

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

2. Öffnen Sie Ihren bevorzugten Texteditor und erstellen Sie eine Datei namens ansible-windows.yml im Verzeichnis ~/ansible-windows-demo und speichern Sie sie.

Ansible-Playbooks werden in YAML geschrieben.

3. Kopieren Sie nun das folgende Playbook in die Datei ansible-windows.yml, um eine einzelne Aufgabe zu erstellen. Dieses Playbook wird den netstat-Windows-Befehl mithilfe des win_command-Windows-Ansible-Moduls auf allen Hosts in der windows-Hostgruppe ausführen.

Das Modul win_command führt Befehle auf einem entfernten Windows-Host aus. Es erlaubt keine Befehle, die Variablen wie Sonderzeichen, Zeilenumbrüche, das Größer-als-Zeichen usw. enthalten.

---
 - name: Ansible win_command module example  
   hosts: windows # Hostgruppe, auf der das Modul ausgeführt werden soll
   tasks: 
   -  name: run an executable command on a remote Windows system
      win_command: netstat -e # win_command ist ein Windows-Modul.

4. Rufen Sie das Playbook ansible-windows.yml auf, das die Aufgabe auf dem Remote-Host ausführt, indem Sie den folgenden Befehl ausführen.

ansible-playbook ansible-windows.yml

Wenn alles gut gelaufen ist, sollte die Ausgabe wie folgt aussehen.

Ansible successfully executed the netstat command using win_command module

Ausführen von Remote-PowerShell-Befehlen mit dem win_shell-Modul

Sie haben ein Playbook erstellt, um einen Remote-cmd.exe-Befehl (netstat) auf verwalteten Windows-Knoten im vorherigen Beispiel auszuführen. Lassen Sie uns jetzt etwas mehr Gas geben und PowerShell-Befehle mit dem win_shell-Modul ausführen.

Standardmäßig wird das win_shell-Modul auf PowerShell auf dem Windows-Host ausgeführt.

Auf Ihrem lokalen Windows-Arbeitsplatz:

1. Öffnen Sie zuerst Ihren bevorzugten Texteditor auf Ihrem lokalen Windows-Arbeitsplatz und erstellen Sie ein Beispiel für ein PowerShell-Skript und kopieren Sie den folgenden Code hinein, speichern Sie ihn als one.ps1. Dieses Tutorial wird das Skript unter ~\one.ps1 speichern.

Der unten stehende Code erstellt eine leere Textdatei namens test2.txt im Verzeichnis C:\temp.

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

2. Kopieren Sie das PowerShell-Skript one.ps1 auf Ihre verwalteten Windows-Knoten mit Ihrer bevorzugten Methode. Dieses Tutorial geht davon aus, dass Sie das Skript one.ps1 in den Ordner C:\Temp auf jedem Windows-Knoten kopiert haben.

3. Sobald das Beispiel für das PowerShell-Skript auf dem Windows-Knoten oder den Windows-Knoten vorhanden ist, stellen Sie eine Verbindung zu Ihrem Ansible-Controller-Host her und öffnen Sie erneut Ihren bevorzugten Texteditor. Erstellen Sie dieses Mal ein weiteres Playbook namens ansible-windows-shell.yml im selben ~/ansible-windows-demo-Verzeichnis und speichern Sie es.

4. Kopieren Sie das folgende Playbook in die Datei ansible-windows-shell.yml. Dieses Playbook führt zwei Aufgaben aus, um das Modul win_shell zu demonstrieren. Es ruft das PowerShell-Skript auf, das gerade im Schritt #2 kopiert wurde, auf und fügt den PowerShell-Code direkt in das Playbook ein, um zu zeigen, dass das Skript überhaupt nicht benötigt wird.

Um mehrere Zeilen PowerShell-Code an das Modul win_shell zu übergeben, verwenden Sie das Zeichen | (senkrechter Strich).

---
 - name: Ansible win_shell module example 
   remote_user: localadmin # lokaler Windows-Benutzer zum Verbinden
   hosts: windows # Remote-Host-Gruppe
   tasks:
    - name: Single line PowerShell # Ausführen eines einzelnen Befehls mit dem win_shell-Modul
      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. Rufen Sie jetzt das zweite Playbook ansible-windows-shell.yml auf, das auf dem Remote-Host, jedoch mit PowerShell, ausgeführt wird.

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

6. Überprüfen Sie bei Bedarf auf Ihrem lokalen Windows-Arbeitsplatz, ob das Playbook das vorhandene Skript und den PowerShell-Code im Playbook ausgeführt hat.

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)

Wenn das Ansible-Playbook erfolgreich ausgeführt wurde, sollte PowerShell zwei True-Anweisungen zurückgeben, die anzeigen, dass die Dateien jetzt vorhanden sind.

​Schlussfolgerung

In diesem Tutorial haben Sie gelernt, wie Sie Ihren ersten von Ansible verwalteten Windows-Knoten einrichten. Obwohl Ansible traditionell als Linux-Tool bekannt ist, kann es auch problemlos für Windows verwendet werden!

Welche Playbooks und Windows-Module werden Sie verwenden, um Windows mit Ansible zu verwalten?

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