Ansible Playbooks für die Windows-Administration
In diesem Artikel zeige ich Ihnen verschiedene Aktionen, die ein Administrator mit Ansible Playbooks auf einem entfernten Windows-System durchführen kann.
Ansible hat sich zu einem der beliebtesten DevOps-Tools auf dem Markt entwickelt. Es stellt eine Reihe von Windows-Modulen bereit, die zur Konfiguration und Verwaltung von Windows-Servern dienen. Ich gehe davon aus, dass Sie Ansible bereits auf einem System mit Windows installiert haben, von dem aus Sie die Windows-Server verwalten möchten.
Im Folgenden finden Sie eine Auswahl häufig durchgeführter Aufgaben, die Windows-Administratoren täglich erledigen. Sie werden feststellen, wie einfach die Administration von Windows mit Ansible sein kann.
Die IP-Adresse meines Ansible-Windows-Kontrollrechners ist 192.168.0.106, während die IP-Adresse meines Remote-Windows-Systems 192.168.0.102 lautet. Bevor Sie beginnen, sollten Sie mit dem Modul win_ping
testen, ob die Verbindung zum Windows-Remoteserver möglich ist.
[email protected] ~ $ ansible win -m win_ping 192.168.0.102 | SUCCESS => { "changed": false, "ping": "pong" }
Die Verbindung zu einem Remote-Host ist also erfolgreich hergestellt.
Beginnen wir mit den Ansible Playbooks…
Dateiübertragung
Das Modul win_copy
in Ansible erlaubt das Kopieren von Dateien vom lokalen Server auf einen entfernten Windows-Host. Ich werde dieses Modul hier verwenden, um eine einzelne PDF-Datei zu übertragen.
Verwenden Sie folgenden YAML-Code und definieren Sie die Pfade für Quelle und Ziel.
[email protected] ~ $ vi copy.yml --- - hosts: win tasks: - name: Copy File win_copy: src: C:output.pdf dest: C:ansible_examples remote_src: yes
Führen Sie nun das Ansible-Playbook für win_copy
aus.
[email protected] ~ $ ansible-playbook copy.yml PLAY [win] *********************************************************************************************************************************** TASK [Gathering Facts] *********************************************************************************************************************** ok: [192.168.0.102] TASK [Copy File] ***************************************************************************************************************************** changed: [192.168.0.102] PLAY RECAP *********************************************************************************************************************************** 192.168.0.102 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Die Datei wurde erfolgreich zum Ziel auf dem Remote-Windows-System kopiert.
MSI-Installation und -Deinstallation
Um eine Anwendung mit einer MSI-Datei zu installieren, müssen Sie zunächst mit win_get_url
den Pfad der MSI-Datei zum Download angeben. Anschließend verwenden Sie das Modul win_package
zur Installation. Der Zustand „present“ bewirkt, dass die MSI auf dem Rechner installiert und die Anwendung in den aktuellen Status versetzt wird.
Hier installiere ich Apache.
YAML-Code:
[email protected] ~ $ vi msi.yml --- - name: Installing Apache MSI hosts: win tasks: - name: Download the Apache installer win_get_url: url: https://archive.apache.org/dist/httpd/binaries/win32/httpd-2.2.25-win32-x86-no_ssl.msi dest: C:ansible_exampleshttpd-2.2.25-win32-x86-no_ssl.msi - name: Install MSI win_package: path: C:ansible_exampleshttpd-2.2.25-win32-x86-no_ssl.msi state: present
Führen Sie das Ansible-Playbook aus, um die MSI zu installieren.
[email protected] ~ $ ansible-playbook msi.yml PLAY [Installing Apache MSI] ***************************************************************************************************************** TASK [Gathering Facts] *********************************************************************************************************************** ok: [192.168.0.102] TASK [Download the Apache installer] ********************************************************************************************************* changed: [192.168.0.102] TASK [Install MSI] *************************************************************************************************************************** changed: [192.168.0.102] PLAY RECAP *********************************************************************************************************************************** 192.168.0.102 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Überprüfen Sie auf dem Windows-System, ob die Apache-Anwendung erfolgreich installiert wurde.
C:Userswdzwdz>cd C:Program Files (x86)Apache Software FoundationApache2.2bin C:Program Files (x86)Apache Software FoundationApache2.2bin>httpd -v Server version: Apache/2.2.25 (Win32) Server built: Jul 10 2013 01:52:12
Sie können Anwendungen auch mithilfe der MSI und zusätzlichen Argumenten installieren. Das folgende Beispiel zeigt die Installation von Apache mit Argumenten anstelle eines Zustands.
YAML-Code:
--- - name: Installing Apache MSI hosts: win tasks: - name: Download the Apache installer win_get_url: url: https://archive.apache.org/dist/httpd/binaries/win32/httpd-2.2.25-win32-x86-no_ssl.msi dest: C:ansible_exampleshttpd-2.2.25-win32-x86-no_ssl.msi - name: Install MSI win_package: path: C:ansible_exampleshttpd-2.2.25-win32-x86-no_ssl.msi arguments: - /install - /passive - /norestart
Um eine Anwendung mithilfe der MSI-Datei zu deinstallieren, verwenden Sie das Modul win_package
. Der Zustand „absent“ bewirkt, dass die Anwendung mit der MSI-Datei deinstalliert wird.
Hier deinstalliere ich Apache.
[email protected] ~ $ vi uninstall_msi.yml --- - name: UnInstalling Apache MSI hosts: win tasks: - name: UnInstall MSI win_package: path: C:ansible_exampleshttpd-2.2.25-win32-x86-no_ssl.msi state: absent
Führen Sie das Ansible-Playbook zum Deinstallieren mit der MSI aus.
[email protected] ~ $ ansible-playbook uninstall_msi.yml PLAY [UnInstalling Apache MSI] ***************************************************************************************************************** TASK [Gathering Facts] *********************************************************************************************************************** ok: [192.168.0.102] TASK [UnInstall MSI] ************************************************************************************************************************* changed: [192.168.0.102] PLAY RECAP *********************************************************************************************************************************** 192.168.0.102 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Wenn ich jetzt die Apache-Version prüfe, wird nach der Deinstallation die folgende Ausgabe angezeigt.
C:Program Files (x86)Apache Software FoundationApache2.2bin>httpd -v 'httpd' is not recognized as an internal or external command, operable program or batch file.
Software-Deinstallation (.EXE)
Sie können Software auch mit einer .exe-Datei deinstallieren, indem Sie die Produkt-ID der Software angeben.
[email protected] ~ $ vi uninstall.yml --- - hosts: win tasks: - name: Uninstall 7-Zip from the exe win_package: path: C:Program Files7-ZipUninstall.exe product_id: 7-Zip arguments: /S state: absent
Führen Sie das Ansible-Playbook aus, um 7-Zip zu deinstallieren.
[email protected] ~ $ ansible-playbook uninstall.yml PLAY [win] ************************************************************************************************************************************************************************************* TASK [Gathering Facts] ************************************************************************************************************************************************************************* ok: [192.168.0.102] TASK [Uninstall 7-Zip from the exe] *********************************************************************************************************************************************************** changed: [192.168.0.102] PLAY RECAP ************************************************************************************************************************************************************************************* 192.168.0.102 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Windows-Dienste stoppen, starten und neu starten
Das Ansible-Modul win_service
dient zum Starten, Stoppen oder Neustarten von Diensten. Ich zeige Ihnen hier, wie Sie den Tomcat-Dienst stoppen können.
Sie müssen den Namen des Dienstes in der YAML-Datei angeben und den Status auf gestoppt setzen.
[email protected] ~ $ vi service.yml --- - hosts: win tasks: - name: Stop service Tomcat win_service: name: Tomcat8 state: stopped
Führen Sie das Ansible-Playbook aus, um den Tomcat-Dienst zu beenden.
[email protected] ~ $ ansible-playbook service.yml PLAY [win] *********************************************************************************************************************************** TASK [Gathering Facts] *********************************************************************************************************************** ok: [192.168.0.102] TASK [Stop service Tomcat] **************************************************************************************************************** changed: [192.168.0.102] PLAY RECAP *********************************************************************************************************************************** 192.168.0.102 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Wenn Sie den Tomcat-Dienst auf dem Windows-System überprüfen, wird er nun als gestoppt angezeigt.
Sie können den Status auf gestartet, neu gestartet oder angehalten definieren, um den Status des Dienstes zu ändern.
Fakten sammeln
Mit dem Ansible-Modul win_disk_facts
können Sie alle Informationen zu den Festplatten des Zielhosts abrufen.
[email protected] ~ $ vi disk.yml --- - hosts: win tasks: - name: Get disk facts win_disk_facts: - name: Output first disk size debug: var: ansible_facts.disks[0].size - name: Convert first system disk into various formats debug: msg: '{{ disksize_gib }} vs {{ disksize_gib_human }}' vars: # Get first system disk disk: '{{ ansible_facts.disks|selectattr("system_disk")|first }}' # Show disk size in Gibibytes disksize_gib_human: '{{ disk.size|filesizeformat(true) }}' disksize_gib: '{{ (disk.size/1024|pow(3))|round|int }} GiB'
Führen Sie das Ansible-Playbook aus, um die Datenträgerinformationen zu erhalten.
[email protected] ~ $ ansible-playbook disk.yml PLAY [win] *********************************************************************************************************************************** TASK [Gathering Facts] *********************************************************************************************************************** ok: [192.168.0.102] TASK [Get disk facts] ************************************************************************************************************************ ok: [192.168.0.102] TASK [Output first disk size] **************************************************************************************************************** ok: [192.168.0.102] => { "ansible_facts.disks[0].size": "1000204886016" } TASK [Convert first system disk into various formats] **************************************************************************************** ok: [192.168.0.102] => { "msg": "932 GiB vs 931.5 GiB" } PLAY RECAP *********************************************************************************************************************************** 192.168.0.102 : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Mit dem Ansible-Modul win_command
können Sie Befehle auf dem Remote-Host ausführen und Informationen zur CPU, Gerätedetails und mehr abrufen.
[email protected] ~ $ vi check.yml --- - hosts: win tasks: - name: Get disk facts win_command: wmic cpu get caption, deviceid, name, numberofcores, maxclockspeed, status register: usage - debug: msg="{{ usage.stdout }}"
Führen Sie das Ansible-Playbook aus, um Informationen des Remote-Systems zu erhalten.
[email protected] ~ $ ansible-playbook check.yml PLAY [win] *********************************************************************************************************************************** TASK [Gathering Facts] *********************************************************************************************************************** ok: [192.168.0.102] TASK [Get facts] ************************************************************************************************************************ changed: [192.168.0.102] TASK [debug] ********************************************************************************************************************************* ok: [192.168.0.102] => { "msg": "Caption DeviceID MaxClockSpeed Name NumberOfCores Status rrnIntel64 Family 6 Model 142 Stepping 9 CPU0 2712 Intel(R) Core(TM) i5-7200U CPU @ 2.50GHz 2 OK rrnrrn" } PLAY RECAP *********************************************************************************************************************************** 192.168.0.102 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Ausführen von Befehlen
Alle Befehle, die Sie in einem Fenster ausführen, können auch über das Ansible-Modul win_command
ausgeführt werden. Sie müssen den Befehl lediglich in Ihrer YAML-Datei angeben. Hier erstelle ich ein Verzeichnis.
[email protected] ~ $ vi commands.yml --- - hosts: win tasks: - name: run an executable using win_command win_command: whoami.exe - name: run a cmd command win_command: cmd.exe /c mkdir C:test
Führen Sie das Ansible-Playbook aus, um die win_command
-Operationen auszuführen.
[email protected] ~ $ ansible-playbook commands.yml PLAY [win] *********************************************************************************************************************************** TASK [Gathering Facts] *********************************************************************************************************************** ok: [192.168.0.102] TASK [run an executable using win_command] *************************************************************************************************** changed: [192.168.0.102] TASK [run a cmd command] ********************************************************************************************************************* changed: [192.168.0.102] PLAY RECAP *********************************************************************************************************************************** 192.168.0.102 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Umgebungsvariablen
Ein Windows-System hat mehrere Umgebungsvariablen, wie z.B. JAVA_HOME. Mit dem Ansible-Modul win_environment
können Sie Umgebungsvariablen auf einem Windows-System hinzufügen oder ändern. In diesem Beispiel füge ich eine neue Variable zur Liste der Windows-Umgebungsvariablen hinzu.
[email protected] ~ $ vi env.yml --- - hosts: win tasks: - name: Set an environment variable for all users win_environment: state: present name: NewVariable value: New Value level: machine
Führen Sie das Ansible-Playbook aus, um die Umgebungsvariable auf dem Remote-Windows-Rechner zu definieren.
[email protected] ~ $ ansible-playbook env.yml PLAY [win] *********************************************************************************************************************************** TASK [Gathering Facts] *********************************************************************************************************************** ok: [192.168.0.102] TASK [Set an environment variable for all users] ********************************************************************************************* changed: [192.168.0.102] PLAY RECAP *********************************************************************************************************************************** 192.168.0.102 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Gehen Sie zum Fenster der Umgebungsvariablen, dort werden Sie die neu hinzugefügte Variable finden.
Registry hinzufügen/bearbeiten
Das Ansible-Modul win_regedit
dient zum Hinzufügen oder Bearbeiten von Registry-Details auf einem entfernten Windows-Computer. Sie müssen den Pfad der Registry und den Inhalt angeben, der hinzugefügt oder aktualisiert werden soll. Hier erstelle ich einen neuen Registry-Eintrag namens ‚wdzwdz‘ unter dem Pfad HKLM:SOFTWARE
und füge dieser Registry dann einen Namen und Daten hinzu.
[email protected] ~ $ vi registry.yml --- - hosts: win tasks: - name: Creating a registry win_regedit: path: HKLM:SOFTWAREwdzwdz - name: Modifying a registry, adding name and data win_regedit: path: HKLM:SOFTWAREwdzwdz name: Geek data: Flare
Führen Sie das Ansible-Playbook aus, um die Registry hinzuzufügen.
[email protected] ~ $ ansible-playbook registry.yml PLAY [win] *********************************************************************************************************************************** TASK [Gathering Facts] *********************************************************************************************************************** ok: [192.168.0.102] TASK [Creating a registry] ******************************************************************************************************************* changed: [192.168.0.102] TASK [Modifying a registry, adding name and data] ******************************************************************************************** changed: [192.168.0.102] PLAY RECAP *********************************************************************************************************************************** 192.168.0.102 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Wenn Sie auf dem Remote-System zum Registrierungseditor navigieren, können Sie sehen, dass diese Registry erfolgreich mit den Namens- und Datenparametern hinzugefügt wurde.
Protokoll löschen
Das Ansible-Modul win_eventlog
dient zum Hinzufügen, Löschen oder Entfernen von Windows-Ereignisprotokollen aus einem Windows-System.
Wechseln Sie zu Windows PowerShell und listen Sie die EventLogs auf, die auf dem entfernten Windows-Computer vorhanden sind.
PS C:Userswdzwdz> Get-EventLog -List Max(K) Retain OverflowAction Entries Log ------ ------ -------------- ------- --- 20,480 0 OverwriteAsNeeded 33,549 Application 20,480 0 OverwriteAsNeeded 0 HardwareEvents 512 7 OverwriteOlder 20 Internet Explorer 20,480 0 OverwriteAsNeeded 0 Key Management Service 128 0 OverwriteAsNeeded 190 OAlerts Security 20,480 0 OverwriteAsNeeded 44,828 System 15,360 0 OverwriteAsNeeded 3,662 Windows PowerShell
Jetzt zeige ich Ihnen, wie Sie Protokolle aus allen Quellen für den Internet Explorer entfernen.
[email protected] ~ $ vi log.yml --- - hosts: win tasks: - name: Remove Internet Explorer Logs win_eventlog: name: Internet Explorer state: absent
Führen Sie das Ansible-Playbook aus, um das Internet Explorer-Protokoll vom Remote-Windows-Computer zu entfernen.
[email protected] ~ $ ansible-playbook log.yml PLAY [win] ************************************************************************************************************************************************************************************* TASK [Gathering Facts] ************************************************************************************************************************************************************************* ok: [192.168.0.102] TASK [Remove Internet Explorer Logs] ********************************************************************************************************************************************** changed: [192.168.0.102] PLAY RECAP ************************************************************************************************************************************************************************************* 192.168.0.102 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Wenn Sie nun die EventLogs erneut auflisten, werden Sie sehen, dass die Internet Explorer-Protokolle entfernt wurden.
PS C:Userswdzwdz> Get-EventLog -List Max(K) Retain OverflowAction Entries Log ------ ------ -------------- ------- --- 20,480 0 OverwriteAsNeeded 33,549 Application 20,480 0 OverwriteAsNeeded 0 HardwareEvents 20,480 0 OverwriteAsNeeded 0 Key Management Service 128 0 OverwriteAsNeeded 190 OAlerts Security 20,480 0 OverwriteAsNeeded 44,835 System 15,360 0 OverwriteAsNeeded 56 Windows PowerShell
Das war eine Zusammenfassung der Ansible-Playbooks für die Remote-Windows-Administration. Probieren Sie diese Playbooks aus. Sie können auch andere Ansible Windows Module ausprobieren, die Ihnen zur Verfügung stehen.