9 Ansible Playbooks Příklad pro správu Windows

Představím vám několik operací, které administrátor může provádět na vzdáleném systému Windows pomocí Ansible playbooků.

Ansible se v současnosti řadí mezi nejpopulárnější nástroje DevOps na trhu. Nabízí rozsáhlou sadu modulů pro systémy Windows, které se používají ke konfiguraci a správě serverů s tímto operačním systémem. Předpokládám, že máte Ansible již nainstalovaný na počítači s Windows, ze kterého chcete spravovat vzdálené servery Windows.

Následují příklady některých často používaných úloh, které správci systémů Windows provádějí každý den. Možná budete překvapeni, jak snadno lze Windows spravovat pomocí Ansible.

IP adresa mého počítače s Ansible, který bude provádět správu, je 192.168.0.106, a IP adresa mého vzdáleného systému Windows je 192.168.0.102. Před zahájením se ujistěte, že jste úspěšně spustili modul win_ping, abyste ověřili, že se dokážete připojit ke vzdálenému serveru Windows.

[email protected] ~
$ ansible win -m win_ping
192.168.0.102 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

Mé spojení se vzdáleným hostitelem je tedy úspěšné.

Začněme tedy pracovat s Ansible Playbooky…

Kopírování souborů

Modul `win_copy` umožňuje zkopírovat soubor z místního serveru na vzdálený hostitel Windows. Tento modul využiji pro kopírování souboru PDF.

Níže je uveden příklad kódu YAML, ve kterém musíte specifikovat zdrojovou a cílovou cestu.

[email protected] ~
$ vi copy.yml
---

- hosts: win

  tasks:

  - name: Copy File

    win_copy:

      src: C:output.pdf

      dest: C:ansible_examples
     
      remote_src: yes

Pro spuštění kopírování souboru použijte příkaz `ansible-playbook` s výše uvedeným YAML souborem.

[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

Soubor byl úspěšně zkopírován do cílové lokace na vzdáleném systému Windows.

Instalace a odinstalace MSI

Pro instalaci aplikace pomocí souboru MSI je nutné nejprve stáhnout soubor MSI pomocí modulu `win_get_url` a poté jej nainstalovat s pomocí modulu `win_package`. Stav `present` zajistí, že MSI bude nainstalováno a aplikace bude v aktuálním stavu.

V tomto příkladu instaluji aplikaci Apache.

Následující YAML kód je potřeba použít:

[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

Pro spuštění instalace pomocí MSI použijte příkaz `ansible-playbook` s definovaným YAML souborem.

[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

Nyní se můžete přihlásit do systému Windows a ověřit, zda byla aplikace Apache úspěšně nainstalována.

C:Usersetechblog.cz>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

Aplikaci můžete nainstalovat pomocí MSI také s definovanými argumenty. Níže je uveden stejný příklad jako výše, ale místo stavu `present` používáme argumenty `/install` pro instalaci Apache.

YAML kód pro tento případ:

---

- 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

Pro odinstalaci aplikace pomocí souboru MSI je nutné použít modul `win_package`. Stav `absent` zajistí, že aplikace bude odinstalována pomocí souboru MSI.

Zde odinstaluji aplikaci 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

Spusťte `ansible-playbook` s definovaným YAML souborem pro odinstalaci pomocí MSI.

[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

Nyní po kontrole verze Apache byste měli obdržet výstup, který potvrzuje, že aplikace byla odinstalována.

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.

Odinstalace software (.EXE)

Můžete odinstalovat software i pomocí souboru .exe, a to za použití ID produktu tohoto softwaru.

[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

Spusťte Ansible playbook pro odinstalaci 7-Zip.

[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

Zastavení, spuštění a restartování služeb Windows

Modul `win_service` Ansible se používá pro spouštění, zastavování nebo restartování služeb. Ukážu vám, jak zastavit službu Tomcat.

V YAML souboru musíte zadat název služby a nastavit stav na `stopped`.

[email protected] ~
$ vi service.yml
---
- hosts: win 

  tasks: 

   - name: Stop service Tomcat

     win_service:

       name: Tomcat8

       state: stopped

Spusťte `ansible-playbook` pro zastavení služby Tomcat.

[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

Pokud zkontrolujete službu Tomcat v systému Windows, bude nyní ve stavu „Zastaveno“.

Pro změnu stavu služby můžete nastavit stav na `started`, `restarted` nebo `paused`.

Získávání informací o disku

Modul Ansible `win_disk_facts` umožňuje získat veškeré informace o discích cílového hostitele.

[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'

Spusťte `ansible-playbook` pro získání informací o disku.

[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

Pomocí modulu `win_command` Ansible můžete spouštět příkazy na vzdáleném hostiteli a získávat informace o CPU, podrobnosti o zařízení a mnoho dalšího.

[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 }}"

Spusťte `ansible-playbook` pro získání informací o vzdáleném systému.

[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

Spouštění příkazů

Jakékoli příkazy, které spouštíte v okně příkazové řádky, můžete spouštět i prostřednictvím modulu `win_command` Ansible. Stačí zadat příkaz v souboru YAML. Zde vytvářím nový adresář.

[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

Spusťte `ansible-playbook` pro provedení operací pomocí `win_command`.

[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

Proměnné prostředí

Systém Windows má mnoho proměnných prostředí, například `JAVA_HOME`. Modul `win_environment` Ansible umožňuje přidávat nebo upravovat proměnné prostředí v systému Windows. V tomto příkladu přidávám novou proměnnou do seznamu proměnných prostředí.

[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

Spusťte `ansible-playbook` pro přidání proměnné prostředí na vzdáleném počítači s Windows.

[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

Přejděte do okna proměnných prostředí; uvidíte, že nová proměnná, kterou jste právě přidali, je zde přítomna.

Přidání nebo úprava registru

Modul `win_regedit` Ansible se používá pro přidávání nebo úpravu podrobností registru na vzdáleném počítači Windows. Musíte zadat cestu k registru a obsah, který se má přidat/aktualizovat. Zde vytvářím novou položku registru `etechblog.cz` v cestě `HKLM:SOFTWARE` a následně do tohoto registru přidávám název a data.

[email protected] ~
$ vi registry.yml
---

- hosts: win 

  tasks:

   - name: Creating a registry

     win_regedit:

      path: HKLM:SOFTWAREetechblog.cz

   - name: Modifying a registry, adding name and data

     win_regedit:

      path: HKLM:SOFTWAREetechblog.cz

      name: Geek

      data: Flare

Spusťte `ansible-playbook` pro přidání záznamu registru.

[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

Pokud přejdete do Editoru registru ve vzdáleném systému, uvidíte, že tento záznam registru byl úspěšně přidán s parametry „Název“ a „Data“.

Smazání protokolů událostí

Modul `win_eventlog` Ansible se používá pro přidávání, mazání nebo odstraňování protokolů událostí systému Windows ze systému Windows.

Přihlaste se do prostředí Windows Powershell a vypište seznam EventLogs na vzdáleném počítači s Windows.

PS C:Usersetechblog.cz> 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

Nyní ukážu, jak odstranit protokoly ze všech zdrojů pro Internet Explorer.

[email protected] ~
$ vi log.yml
---
- hosts: win 
  tasks:
   - name: Remove Internet Explorer Logs
     win_eventlog:
      name: Internet Explorer
      state: absent

Spusťte `ansible-playbook` pro odstranění protokolů Internet Exploreru ze vzdáleného počítače Windows.

[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

Pokud nyní znovu vypíšete `EventLogs`, uvidíte, že protokoly Internet Exploreru byly odstraněny.

PS C:Usersetechblog.cz> 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

To je vše, co se týče Ansible playbooků, které lze využít pro vzdálenou správu systémů Windows. Neváhejte si vyzkoušet tyto příklady. Můžete se podívat i na další moduly Ansible pro Windows, které jsou k dispozici.