9 Beispiel für Ansible Playbooks für die Windows-Verwaltung

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.