Dominare Ansible su Windows: La tua Guida Esperta di Riferimento

Anche se Ansible è conosciuto per gestire nodi Linux tramite SSH, sapevi che Ansible su Windows funziona altrettanto bene? Utilizzando Windows Remote Management (WinRM), Ansible su Windows può gestire efficacemente tutti i tuoi nodi Windows!

Con Ansible su Windows, puoi eseguire attività come distribuire patch, gestire server Windows, eseguire script PowerShell e altro ancora.

In questo tutorial, imparerai come configurare il tuo primo nodo Windows da gestire con Ansible e vedrai come eseguire comandi e playbooks su di esso.

Prerequisiti

Se desideri seguire il tutorial, assicurati di avere quanto segue prima di iniziare:

  • Un host controller Ansible – Questo tutorial utilizzerà Ansible v2.9.18 su una macchina Ubuntu 18.04.5 LTS con indirizzo IP 10.111.4.53. Nota che Windows non è supportato come nodo di controllo, solo come nodo gestito.
  • Python installato sull’host controller Ansible – Questo tutorial utilizzerà Python v2, ma v3 dovrebbe funzionare altrettanto bene.
  • Il pacchetto pip installato sul controller Ansible.
  • A Windows 2012 R2 or greater computer for Ansible to manage – This tutorial will use two Windows Server 2012 R2 Standard machines as remote nodes with IP addresses of 52.242.251.213 and 10.111.4.106.
  • A Windows workstation – This tutorial will perform some basic pre-configuration to the node that Windows will manage with Ansible and will require you to sitting at a Windows workstation.
  • Il server Windows da gestire ha l’abilitazione al PowerShell Remoting
  • A user account in the local Administrators group on the Windows computer. This tutorial will use an account called adminuser.

Configurare il listener WinRM su Windows

Prima che Ansible possa comunicare con un nodo Windows remoto, deve essere in grado di stabilire una connessione con esso. Ciò avviene tramite il protocollo Microsoft WinRM. WinRM è lo stesso protocollo che viene utilizzato per eseguire comandi remoti da PowerShell.

Al momento della stesura di questo testo, Ansible supporta SSH come protocollo di gestione, ma è una funzionalità sperimentale.

Per consentire ad Ansible di utilizzare WinRM per comunicare con il nodo Windows, è necessario configurare WinRM. A tal scopo, Ansible fornisce uno script PowerShell che imposta varie opzioni di WinRM.

Sebbene lo script PowerShell fornito da Red Hat per configurare WinRM sia stato testato ed è sicuro, è consigliabile leggerlo e comprenderne, a grandi linee, il funzionamento.

Il tuo primo compito sarà scaricare lo script di configurazione ed eseguire Ansible sul nodo Windows. Per farlo, assumendo che tu abbia già abilitato PowerShell Remoting sul tuo computer Windows di destinazione e che tu sia su una postazione di lavoro Windows:

Scarica lo script PowerShell ConfigureRemotingForAnsible.ps1 sul tuo computer locale Windows. Questo tutorial presumirà che sia salvato in ~\Downloads.

Esegui lo script di configurazione sul nodo Windows che Ansible gestirà usando il comando Invoke-Command. Il comando seguente eseguirà il comando sui due computer dimostrativi del tutorial e ti chiederà la password per l’account adminuser locale sui nodi Windows.

Invoke-Command -ComputerName 52.242.251.213, 10.111.4.106 -FilePath '~\Downloads\ConfigureRemotingForAnsible.ps1' -Credential (Get-Credential -UserName adminuser)

Per impostazione predefinita, lo script di configurazione configurerà WinRM per l’autenticazione di base HTTP. Se desideri che Ansible utilizzi una connessione più sicura, impara Come configurare WinRM tramite HTTPS per Ansible.

Configurazione del Controller di Ansible su Windows

Ora che il nodo Windows è pronto per Ansible, configuriamo il controller di Ansible per mostrare ad Ansible come comunicare con esso.

1. Connettiti al tuo host controller di Ansible via SSH usando il tuo client SSH preferito.

2. Installa il modulo Python pywinrm. Il modulo Python pywinrm è necessario affinché Ansible su Windows comunichi con gli host tramite il protocollo WinRM.

pip install pywinrm

3. Definire i nodi Windows remoti in un file di inventario di Ansible. Un inventario di Ansible è una collezione di host remoti definiti in un file tramite il loro nome host o indirizzo IP. Una volta definiti, è possibile indirizzare gli inventari di Ansible con comandi e playbook, come vedrete presto.

Il file di inventario predefinito di Ansible si trova nella directory /etc/ansible/hosts.

Il file di inventario di esempio qui di seguito crea un gruppo di host windows che contiene ciascun nodo Windows. Il tutorial utilizza un gruppo di host qui per semplificare il targeting di tutti i nodi Windows (se ne hai più di uno) contemporaneamente in seguito.

[windows]
 54.242.251.213
 10.111.4.106

4. Successivamente, definire alcune variabili obbligatorie che Ansible utilizzerà durante la connessione agli host Windows nel file di inventario come gruppo windows:vars.

[windows:vars]
 ansible_user=localadmin ## l'username Windows per la comunicazione con Ansible
 ansible_password=s3crect ## la password Windows per la comunicazione con Ansible
 ansible_connection=winrm ## Il tipo di connessione che Ansible effettuerà con il nodo Windows remoto
 ansible_winrm_server_cert_validation=ignore ## Ignora la convalida del certificato perché utilizzeremo solo un certificato autofirmato fornito da Ansible

5. Ora, utilizza il modulo win_ping di Ansible per eseguire un semplice test di connessione agli host all’interno del gruppo host windows definito nel passo #3.

# windows è il gruppo di host
# -m dice ad Ansible di utilizzare il modulo win_ping
 ansible windows -m win_ping

Una volta eseguito, puoi vedere di seguito che Ansible restituisce testo verde con un messaggio SUCCESS che indica il tentativo di ping riuscito.

Successful win_ping connection

L’output conferma che l’host controller di Ansible può comunicare con successo con l’host remoto Windows tramite WinRM.

Esecuzione di comandi ad-hoc sugli host Windows

A questo punto, sei pronto per far iniziare ad Ansible il controllo dei tuoi nodi Windows. Testiamo ora ciò eseguendo un comando ad-hoc sugli host Windows per cambiarli. I comandi ad-hoc sono ottimi quando è necessario eseguire un comando semplice su nodi senza creare prima un playbook.

Dimostriamo i comandi ad-hoc installando una funzionalità Windows sugli host Windows definiti nel file di inventario nel gruppo host windows. Per farlo, assumendo che tu sia ancora connesso tramite SSH al tuo nodo controller di Ansible:

1. Invece del modulo win_ping questa volta, chiama il modulo win_feature (-m), passandogli due argomenti (-a) di nome e stato indicando il nome della funzionalità di Windows e lo stato in cui desideri che sia.

# windows qui è un gruppo di host
# win_feature è il nome del modulo
# stato=presente significa installare il pacchetto o il servizio
 ansible windows -m win_feature -a "name=Telnet-Client state=present"

Quando esegui il comando sopra, se tutto va bene, Ansible dovrebbe connettersi a tutti i nodi nel gruppo di host windows ed eseguire il comando win_feature su ciascuno controllando, e se non presente, installando la funzionalità di Windows Telnet-Client.

Ansible Windows Feature

2. Ansible mostra successo, ma per essere sicuri, connettiti manualmente ai nodi Windows con PowerShell e verifica che ora sia installata la funzionalità di Windows Telnet Client. Sulla tua workstation Windows locale, esegui Invoke-Command per eseguire il comando PowerShell Get-WindowsFeature su ciascun computer Windows.

Invoke-Command -ComputerName 52.242.251.213, 10.111.4.106 -ScriptBlock { Get-WindowsFeature -Name 'Telnet-Service' } -Credential (Get-Credential -UserName adminuser)

A questo punto, puoi eseguire qualsiasi modulo Windows che ti piace come comandi ad-hoc!

Creazione ed esecuzione di playbook Ansible su Windows

Una volta che hai padroneggiato l’arte di eseguire comandi ad-hoc su nodi gestiti da Windows, il tuo compito successivo è creare e eseguire i playbook. Un playbook di Ansible combina comandi in un unico punto e ti permette di scrivere logica complessa per eseguire scenari di automazione complessi.

Esecuzione di Comandi Windows Remoti con il Modulo win_command

Assumendo che tu sia ancora connesso al tuo host controller di Ansible:

1. Crea una cartella nella tua directory home chiamata ansible-windows-demo e cambia in essa. Questa cartella conterrà il tuo playbook.

mkdir ~/ansible-windows-demo 
cd ~/ansible-windows-demo 

2. Apri il tuo editor di testo preferito e crea e salva un file chiamato ansible-windows.yml nella directory ~/ansible-windows-demo.

I playbook di Ansible sono scritti in YAML

3. Ora, copia il playbook sottostante nel file ansible-windows.yml per creare un singolo task. Questo playbook eseguirà il comando Windows netstat utilizzando il modulo Ansible di Windows win_command su tutti gli host all’interno del gruppo host windows.

Il modulo win_command esegue comandi sull’host remoto di Windows. Non consente comandi che includono variabili come caratteri speciali, interruzioni di riga, simboli maggiori, ecc.

---
 - name: Ansible win_command module example  
   hosts: windows # gruppo host su cui eseguire il modulo
   tasks: 
   -  name: run an executable command on a remote Windows system
      win_command: netstat -e # win_command è un modulo Windows.

4. Eseguire il playbook ansible-windows.yml, che esegue il compito sull’host remoto eseguendo il seguente comando.

ansible-playbook ansible-windows.yml

Se tutto è andato bene, dovresti vedere un output come di seguito.

Ansible successfully executed the netstat command using win_command module

Esecuzione di comandi PowerShell remoti con il modulo win_shell

Hai creato un playbook per eseguire un comando remoto cmd.exe (netstat) su nodi gestiti Windows nell’esempio precedente. Adesso alziamo un po’ il livello e eseguiamo comandi PowerShell utilizzando il modulo win_shell.

Per impostazione predefinita, il modulo win_shell viene eseguito su PowerShell sull’host Windows

Sulla tua postazione locale Windows:

1. Prima, apri il tuo editor di testo preferito sulla tua postazione locale Windows e crea uno script PowerShell di esempio e copia il seguente codice al suo interno, salvandolo come one.ps1. Questo tutorial salverà lo script in ~\one.ps1.

Il codice sottostante crea un file di testo vuoto chiamato test2.txt nella directory C:\temp.

Set-Content -Path C:\temp\test2.txt -Value ''

2. Copia lo script PowerShell one.ps1 sui nodi gestiti Windows utilizzando il tuo metodo preferito. Questo tutorial supporrà che tu abbia copiato lo script one.ps1 nella cartella C:\Temp su ogni nodo Windows.

3. Una volta che lo script PowerShell di esempio è sul(i) nodo(i) Windows, connettiti al tuo host controller Ansible e riapri il tuo editor di testo preferito. Questa volta, crea e salva un altro playbook chiamato ansible-windows-shell.yml nella stessa directory ~/ansible-windows-demo.

4. Copia e incolla il seguente playbook nel file ansible-windows-shell.yml. Questo playbook eseguirà due attività per dimostrare il modulo win_shell. Invoca lo script PowerShell appena copiato dal passaggio n. 2 e inserisce il codice PowerShell direttamente nel playbook per dimostrare che lo script non è affatto necessario.

Per passare più righe di codice PowerShell al modulo win_shell, utilizza il carattere | pipe.

---
 - name: Ansible win_shell module example 
   remote_user: localadmin # utente locale di Windows per connettersi
   hosts: windows # gruppo host remoto
   tasks:
    - name: Single line PowerShell # Esecuzione di un singolo comando utilizzando il modulo win_shell
      win_shell: C:\temp\one.ps1
    - name: Run multi-lined shell commands 
      win_shell: |
        $text = ' Iam Author of ATA'
       Set-Content -Path C:\temp\test3.txt -Value $text 

5. Ora, invoca il secondo playbook ansible-windows-shell.yml, che si esegue sull’host remoto ma con PowerShell.

ansible-playbook ansible-windows-shell.yml
ansible-playbook ansible-windows-shell.yml

6. Se necessario, sul tuo computer locale Windows, verifica che il playbook abbia eseguito lo script esistente e il codice PowerShell nel playbook.

Invoke-Command -ComputerName 52.242.251.213, 10.111.4.106 -ScriptBlock { Test-Path -Path 'C:\Temp\test3.txt','C:\Temp\test2.txt' } -Credential (Get-Credential -UserName adminuser)

Se il playbook di Ansible è stato eseguito correttamente, PowerShell dovrebbe restituire due dichiarazioni True che indicano che i file esistono ora.

Conclusione

In questo tutorial, hai imparato come configurare il tuo primo nodo gestito Windows in Ansible. Anche se Ansible è tradizionalmente conosciuto come strumento Linux, può essere facilmente utilizzato anche per Windows!

Quali playbook e moduli Windows inizierai ad utilizzare per gestire Windows con Ansible?

Source:
https://adamtheautomator.com/ansible-on-windows/