9 Esempio di Ansible Playbook per l’amministrazione di Windows

In questo articolo, esploreremo diverse operazioni che un amministratore può eseguire su un sistema Windows remoto usando Ansible Playbook.

Ansible si è affermato come uno degli strumenti DevOps più popolari del momento. Offre un’ampia gamma di moduli Windows appositamente progettati per la configurazione e la gestione dei server Windows. Si presume che Ansible sia già installato sul tuo sistema Windows, da dove intendi amministrare i server Windows.

Di seguito sono riportate alcune delle attività che gli amministratori di Windows svolgono abitualmente su base quotidiana. Sarai sorpreso di vedere quanto sia semplice gestire Windows con l’ausilio di Ansible.

L’indirizzo IP della mia macchina controller Ansible Windows è 192.168.0.106, mentre l’indirizzo IP del mio sistema Windows remoto è 192.168.0.102. Prima di procedere, è fondamentale eseguire un modulo win_ping per accertare se la connessione al server remoto Windows è fattibile.

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

Come dimostrato, la mia connessione a un host remoto è stata stabilita con successo.

Pertanto, iniziamo ad analizzare i Playbook di Ansible…

Trasferimento di File

Il modulo win_copy di Ansible consente di trasferire un file dal server locale a un host Windows remoto. Utilizzerò questo modulo per copiare un singolo file PDF.

Utilizza il codice YAML mostrato di seguito, specificando i percorsi di origine e destinazione in modo appropriato.

[email protected] ~
$ vi copy.yml
---
- hosts: win
  tasks:
    - name: Copy File
      win_copy:
        src: C:output.pdf
        dest: C:ansible_examples
        remote_src: yes

Lancia l’esecuzione di Ansible Playbook per il modulo win_copy.

[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

Il file è stato trasferito correttamente nella posizione di destinazione sul sistema Windows remoto.

Installazione e Disinstallazione di MSI

Per installare un’applicazione utilizzando un file MSI, è necessario prima utilizzare il modulo win_get_url per specificare il percorso del file MSI da scaricare, e poi il modulo win_package per eseguire l’installazione. Lo stato impostato su “present” garantisce che l’MSI venga installato sulla macchina, portando l’applicazione allo stato desiderato.

In questo esempio, installerò Apache.

Ecco il codice YAML da utilizzare:

[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

Avvia l’esecuzione di Ansible Playbook per l’installazione tramite MSI.

[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

Ora, accedi al sistema Windows e verifica se l’applicazione Apache è stata installata correttamente.

C:Userswinadmin.it>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

È anche possibile installare applicazioni tramite MSI con argomenti specifici. Di seguito, lo stesso esempio precedente, ma invece dello stato, utilizziamo un argomento di installazione per installare Apache.

Ecco il codice YAML da utilizzare:

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

Per disinstallare un’applicazione utilizzando un file MSI, è necessario avvalersi del modulo win_package. Impostando lo stato su “absent”, l’applicazione verrà disinstallata tramite il file MSI.

Qui disinstallerò 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

Avvia l’esecuzione di Ansible Playbook per disinstallare tramite 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

Ora, verificando la versione di Apache, si otterrà il seguente output, indicando che l’applicazione è stata disinstallata.

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.

Rimozione di Software (.EXE)

È possibile disinstallare il software tramite file .exe utilizzando l’ID del prodotto del software in questione.

[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

Avvia l’esecuzione di Ansible Playbook per disinstallare 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

Arresto, Avvio e Riavvio di Servizi Windows

Il modulo win_service di Ansible è lo strumento ideale per avviare, arrestare o riavviare un servizio. Qui, illustrerò come arrestare il servizio Tomcat.

È necessario specificare il nome del servizio nel file YAML e impostare lo stato su “stop”.

[email protected] ~
$ vi service.yml
---
- hosts: win
  tasks:
   - name: Stop service Tomcat
     win_service:
       name: Tomcat8
       state: stopped

Avvia l’esecuzione di Ansible Playbook per arrestare il servizio 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

Verificando il servizio Tomcat sul sistema Windows, si noterà che si trova nello stato “arrestato”.

È possibile definire lo stato come “started”, “restarted” o “paused” per modificare lo stato del servizio.

Raccolta di Informazioni

Grazie al modulo win_disk_facts di Ansible, è possibile recuperare tutti i dettagli relativi ai dischi dell’host di destinazione.

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

Avvia l’esecuzione di Ansible Playbook per acquisire le informazioni sul disco.

[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

Utilizzando il modulo win_command di Ansible, è possibile eseguire comandi sull’host remoto e acquisire informazioni sulla CPU, dettagli sul dispositivo e altro ancora.

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

Avvia l’esecuzione di Ansible Playbook per ottenere informazioni sul sistema remoto.

[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

Esecuzione di Comandi

Qualsiasi comando eseguito in ambiente Windows può essere replicato utilizzando il modulo win_command di Ansible. È sufficiente specificare il comando all’interno del file YAML. Qui, creerò una semplice directory.

[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

Avvia l’esecuzione di Ansible Playbook per eseguire l’operazione con 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

Variabili d’Ambiente

Un sistema Windows dispone di diverse variabili d’ambiente, come ad esempio JAVA_HOME. Con il modulo win_environment di Ansible, è possibile aggiungere o modificare le variabili d’ambiente su un sistema Windows. In questo esempio, aggiungerò una nuova variabile alla lista delle variabili d’ambiente di Windows.

[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

Avvia l’esecuzione di Ansible Playbook per aggiungere la variabile d’ambiente su una macchina Windows remota.

[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

Accedendo alla finestra delle variabili d’ambiente, si potrà notare la presenza della nuova variabile appena aggiunta.

Aggiunta e Modifica del Registro di Sistema

Il modulo win_regedit di Ansible è lo strumento ideale per aggiungere o modificare i dettagli del registro su una macchina Windows remota. È necessario fornire il percorso del registro e il contenuto da aggiungere o aggiornare. Qui creerò una nuova voce di registro winadmin.it nel percorso HKLM:\SOFTWARE, aggiungendo nome e dati a questo registro.

[email protected] ~
$ vi registry.yml
---
- hosts: win
  tasks:
   - name: Creating a registry
     win_regedit:
      path: HKLM:SOFTWAREwinadmin.it
   - name: Modifying a registry, adding name and data
     win_regedit:
      path: HKLM:SOFTWAREwinadmin.it
      name: Geek
      data: Flare

Avvia l’esecuzione di Ansible Playbook per aggiungere il registro.

[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

Accedendo all’Editor del Registro di Sistema sul sistema remoto, sarà possibile verificare che il registro è stato aggiunto correttamente, con i parametri Nome e Dati.

Rimozione del Registro Eventi

Il modulo win_eventlog di Ansible consente di aggiungere, cancellare o eliminare i registri eventi di Windows dal sistema.

Accedi a Windows PowerShell ed elenca gli EventLog presenti sul computer Windows remoto.

PS C:Userswinadmin.it> 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

Ora, mostrerò come eliminare i registri da tutte le fonti relative a Internet Explorer.

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

Avvia l’esecuzione di Ansible Playbook per rimuovere Internet Explorer dal computer Windows remoto.

[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

Ora, rielencando gli EventLog, si noterà che i registri di Internet Explorer sono stati rimossi.

PS C:Userswinadmin.it> 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

Questo è quanto riguardo ai Playbook di Ansible che possono essere utilizzati per l’amministrazione remota di Windows. Incoraggio a sperimentare questi playbook. È possibile esplorare anche altri Moduli Windows Ansible disponibili.