? Ansible auf Windows beherrschen: Ihr Experte für alle Fälle

Obwohl Ansible dafür bekannt ist, Linux-Nodes mit SSH zu verwalten, wussten Sie, dass Ansible auf Windows genauso gut funktioniert? Mithilfe von Windows Remote Management (WinRM) kann Ansible auf Windows effektiv alle Ihre Windows-Nodes 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 durchführen.

In diesem Tutorial erfahren Sie, wie Sie Ihren ersten Windows-Node einrichten, der mit Ansible verwaltet wird, 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 auf Ihrem Ansible-Controller-Host installiert – In diesem Tutorial wird Python v2 verwendet, aber v3 sollte genauso gut funktionieren.
  • Das pip-Paket 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 unter Windows

Bevor Ansible mit einem entfernten Windows-Knoten kommunizieren kann, muss es in der Lage sein, eine Verbindung zu ihm herzustellen. Dies geschieht über das Microsoft-Protokoll WinRM. WinRM ist das gleiche Protokoll, das PowerShell Remoting verwendet, um Remote-Befehle innerhalb von PowerShell auszuführen.

Zum Zeitpunkt dieses Schreibens unterstützt Ansible zwar SSH als Verwaltungsprotokoll, aber es handelt sich dabei zurzeit um ein experimentelles Feature.

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

Obwohl das von Red Hat bereitgestellte PowerShell-Skript zur Konfiguration von WinRM getestet wurde und sicher ist, sollten Sie es durchlesen und auf hohem Niveau verstehen, was es tut.

Ihre erste Aufgabe besteht darin, das Konfigurationsskript herunterzuladen und Ansible auf dem Windows-Knoten auszuführen. Gehen Sie davon aus, dass Sie bereits PowerShell Remoting aktiviert haben auf Ihrem Ziel-Windows-Computer und Sie an einem Windows-Arbeitsplatz sind:

Downloaden Sie das PowerShell-Skript ConfigureRemotingForAnsible.ps1 auf Ihren lokalen Windows-Computer. Dieses Tutorial geht davon aus, dass es in ~\Downloads gespeichert ist.

Führen Sie das Konfigurationsskript auf dem Windows-Knoten aus, den Ansible verwalten wird, und verwenden Sie dazu den Befehl Invoke-Command. Der folgende Befehl wird das Kommando auf den beiden Demomaschinen des Tutorials ausführen und Sie nach dem Passwort für das lokale adminuser-Konto auf den Windows-Knoten fragen.

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 Sie den Ansible-Controller, um ihm zu zeigen, wie er mit Ansible kommunizieren soll.

1. Verbinden Sie sich über SSH mit Ihrem Ansible-Controller-Host unter Verwendung Ihres bevorzugten SSH-Clients.

2. Installieren Sie das Python-Modul pywinrm. Das Python-Modul pywinrm ist erforderlich, damit Ansible unter 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 entfernten Hosts, die in einer Datei entweder durch ihren Hostnamen oder ihre IP-Adresse definiert sind. Sobald sie definiert sind, können Sie Ansible-Inventare mit Befehlen und Playbooks anvisieren, wie Sie bald sehen werden.

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

Die folgende Beispielinventardatei erstellt eine windows Hostgruppe, 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 eine Verbindung zu den Windows-Hosts in der Inventardatei herstellt, als windows:vars-Gruppe.

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

5. Verwenden Sie nun das Ansible win_ping-Modul, um einen einfachen Verbindungstest mit den Hosts innerhalb der windows-Hostgruppe auszuführen, die in Schritt #3 definiert wurde.

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

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

Successful win_ping connection

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

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

Zu diesem Zeitpunkt sind Sie bereit, damit Ansible Ihre Windows-Knoten zu steuern. Lassen Sie uns dies 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.

Zeigen wir ad-hoc-Befehle, indem wir ein Windows-Feature auf den in der Bestandsdatei definierten Windows-Knoten installieren. Dazu, vorausgesetzt, dass Sie immer noch über SSH in Ihren Ansible-Controller-Knoten eingeloggt sind:

1. Anstelle des win_ping-Moduls rufen Sie dieses Mal das win_feature-Modul (-m) auf und übergeben ihm zwei Argumente (-a), nämlich 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 erfolgreich eine Verbindung zu allen Knoten in der windows-Hostgruppe herstellen und den Befehl win_feature auf jedem 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 sicherzugehen, stellen Sie manuell eine Verbindung zu den Windows-Knoten über PowerShell her und überprüfen Sie, ob das Windows-Feature Telnet Client jetzt installiert ist. Auf Ihrem lokalen Windows-Arbeitsplatz führen Sie 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!

Erstellung und Ausführung von Ansible-Playbooks unter Windows

Sobald Sie die Kunst der Ausführung von Ad-hoc-Befehlen auf verwalteten Windows-Nodes gemeistert haben, besteht Ihre nächste Aufgabe darin, 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ührung 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 mit dem Namen ansible-windows-demo und wechseln Sie zu diesem. Dieser Ordner wird Ihr Playbook enthalten.

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

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

Ansible-Playbooks werden in YAML geschrieben

3. Kopieren Sie nun das unten stehende Playbook in die Datei ansible-windows.yml, um eine einzelne Aufgabe zu erstellen. Dieses Playbook führt den Windows-Befehl netstat mithilfe des win_command-Moduls von Ansible auf allen Hosts in der Hostgruppe windows aus.

Das Modul win_command führt Befehle auf einem Windows-Remote-Host aus. Es erlaubt keine Befehle, die Variablen wie Sonderzeichen, Zeilenumbrüche, größer als Symbol, 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, sollten Sie eine Ausgabe wie unten sehen.

Ansible successfully executed the netstat command using win_command module

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

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

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

Auf Ihrem lokalen Windows-Arbeitsplatz:

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

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

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

2. Kopieren Sie das one.ps1 PowerShell-Skript 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 BeispielpowerShell-Skript auf dem Windows-Knoten ist, verbinden Sie sich mit Ihrem Ansible-Controller-Host und öffnen erneut Ihren bevorzugten Texteditor. Diesmal erstellen und speichern Sie ein weiteres Playbook namens ansible-windows-shell.yml im gleichen ~/ansible-windows-demo Verzeichnis.

4. Kopieren und fügen Sie das folgende Playbook in die Datei ansible-windows-shell.yml ein. Dieses Playbook führt zwei Aufgaben aus, um das win_shell Modul 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 des PowerShell-Codes an das win_shell-Modul zu übergeben, verwenden Sie das | Pipe-Zeichen.

---
 - name: Ansible win_shell module example 
   remote_user: localadmin # lokaler Windows-Benutzer zum Verbinden
   hosts: windows # Gruppe des entfernten Hosts
   tasks:
    - name: Single line PowerShell # Ausführung 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 entfernten Host, aber 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-Aussagen zurückgeben, die darauf hinweisen, dass die Dateien jetzt vorhanden sind.

Schlussfolgerung

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

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

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