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.