Esercitazione: Configurare gli inventari dinamici delle risorse di Azure usando Ansible
Importante
Per eseguire i playbook di esempio contenuti in questo articolo, è necessario Ansible 2.8 (o versione successiva).
La funzionalità di inventario dinamico di Ansible elimina il carico di manutenzione dei file di inventario statici.
In questa esercitazione si usa il plug-in di inventario dinamico di Azure per popolare l'inventario ansible.
In questo articolo vengono illustrate le operazioni seguenti:
- Configurare due macchine virtuali di test.
- Aggiungere tag alle macchine virtuali di Azure
- Generare un inventario dinamico
- Usare gruppi condizionali e con chiave per popolare le appartenenze ai gruppi
- Eseguire playbook sui gruppi all'interno dell'inventario dinamico
Prerequisiti
- Sottoscrizione di Azure: se non si ha una sottoscrizione di Azure, creare un account gratuito prima di iniziare.
- Entità servizio di Azure: creare un'entità servizio, prendere nota dei valori seguenti: appId, displayName, password e tenant.
Installare Ansible: eseguire una delle opzioni seguenti:
- Installare e configurare Ansible in una macchina virtuale Linux
- Configurare Azure Cloud Shell e, se non si ha accesso a una macchina virtuale Linux, creare una macchina virtuale con Ansible.
Creare macchine virtuali di Azure
Accedere al portale di Azure.
Aprire Cloud Shell.
Creare un gruppo di risorse di Azure in cui includere le macchine virtuali per questa esercitazione.
Importante
Il nome del gruppo di risorse di Azure creato in questo passaggio deve essere interamente in lettere minuscole. In caso contrario, la generazione dell'inventario dinamico avrà esito negativo.
az group create --resource-group ansible-inventory-test-rg --location eastus
Creare due macchine virtuali Linux in Azure con una delle tecniche seguenti:
Playbook ansible: l'articolo Creare una macchina virtuale Linux di base in Azure con Ansible e Creare una macchina virtuale Windows di base in Azure con Ansible illustra come creare una macchina virtuale da un playbook ansible.
Interfaccia della riga di comando di Azure: eseguire ognuno dei comandi seguenti in Cloud Shell per creare le due macchine virtuali:
az vm create \ --resource-group ansible-inventory-test-rg \ --name win-vm \ --image MicrosoftWindowsServer:WindowsServer:2019-Datacenter:latest \ --admin-username azureuser \ --admin-password <password> az vm create \ --resource-group ansible-inventory-test-rg \ --name linux-vm \ --image Ubuntu2204 \ --admin-username azureuser \ --admin-password <password>
Sostituire la
<password>
password.
Aggiungere tag del ruolo applicazione
I tag vengono usati per organizzare e classificare le risorse di Azure. L'assegnazione delle macchine virtuali di Azure a un ruolo applicazione consente di usare i tag come nomi di gruppo all'interno dell'inventario dinamico di Azure.
Eseguire i comandi seguenti per aggiornare i tag della macchina virtuale:
az vm update \
--resource-group ansible-inventory-test-rg \
--name linux-vm \
--set tags.applicationRole='message-broker'
az vm update \
--resource-group ansible-inventory-test-rg \
--name win-vm \
--set tags.applicationRole='web-server'
Per altre informazioni sulle strategie di assegnazione di tag di Azure, vedere Definire la strategia di assegnazione di tag.
Generare un inventario dinamico
Ansible offre un plug-in di inventario dinamico di Azure.
La procedura seguente illustra come usare il plug-in:
Creare un inventario dinamico denominato
myazure_rm.yml
plugin: azure_rm include_vm_resource_groups: - ansible-inventory-test-rg auth_source: auto
Punto chiave:
- Ansible usa il nome e l'estensione del file di inventario per identificare il plug-in di inventario da usare. Per usare il plug-in inventario dinamico di Azure, il file deve terminare con
azure_rm
e avere un'estensione diyml
oyaml
.
- Ansible usa il nome e l'estensione del file di inventario per identificare il plug-in di inventario da usare. Per usare il plug-in inventario dinamico di Azure, il file deve terminare con
Eseguire il comando seguente per eseguire una query sulle macchine virtuali all'interno del gruppo di risorse:
ansible-inventory -i myazure_rm.yml --graph
Quando si esegue il comando, vengono visualizzati risultati simili all'output seguente:
@all: |--@ungrouped: | |--linux-vm_cdb4 | |--win-vm_3211
Entrambe le macchine virtuali appartengono al ungrouped
gruppo, che è un elemento figlio del all
gruppo nell'inventario Ansible.
Punto chiave:
- Per impostazione predefinita, il plug-in inventario dinamico di Azure restituisce nomi univoci globali. Per questo motivo, i nomi delle macchine virtuali possono contenere caratteri aggiuntivi. È possibile disabilitare questo comportamento aggiungendo
plain_host_names: yes
all'inventario dinamico.
Trovare host di macchine virtuali di Azure
Eseguire il comando seguente per visualizzare tutti gli elementi hostvars
:
ansible-inventory -i myazure_rm.yml --list
{
"_meta": {
"hostvars": {
"linux-vm_cdb4": {
"ansible_host": "52.188.118.79",
"availability_zone": null,
"computer_name": "linux-vm",
"default_inventory_hostname": "linux-vm_cdb4",
"id": "/subscriptions/<subscriptionid>/resourceGroups/ansible-inventory-test-rg/providers/Microsoft.Compute/virtualMachines/linux-vm",
"image": {
"offer": "0001-com-ubuntu-server-jammy",
"publisher": "Canonical",
"sku": "22_04-lts-gen2",
"version": "latest"
},
...,
"tags": {
"applicationRole": "message-broker"
},
...
},
"win-vm_3211": {
"ansible_host": "52.188.112.110",
"availability_zone": null,
"computer_name": "win-vm",
"default_inventory_hostname": "win-vm_3211",
"id": "/subscriptions/<subscriptionid>/resourceGroups/ansible-inventory-test-rg/providers/Microsoft.Compute/virtualMachines/win-vm",
"image": {
"offer": "WindowsServer",
"publisher": "MicrosoftWindowsServer",
"sku": "2019-Datacenter",
"version": "latest"
},
...
"tags": {
"applicationRole": "web-server"
},
...
}
}
},
...
}
}
Eseguendo il pull delle informazioni da Azure, l'inventario dinamico popola per hostvars
ogni macchina virtuale di Azure. Si hostvars
tratta quindi di determinare le appartenenze ai gruppi di macchine virtuali all'interno dell'inventario Ansible.
Assegnare l'appartenenza al gruppo con conditional_groups
Ogni gruppo condizionale è costituito da due parti. Nome del gruppo e condizione per l'aggiunta di un membro al gruppo.
Usare la proprietà image.offer
per creare l'appartenenza al gruppo condizionale per linux-vm.
Aprire l'inventario myazure_rm.yml
dinamico e aggiungere quanto segue conditional_group
:
plugin: azure_rm
include_vm_resource_groups:
- ansible-inventory-test-rg
auth_source: auto
conditional_groups:
linux: "'ubuntu' in image.offer"
windows: "'WindowsServer' in image.offer"
ansible-inventory
Eseguire con l'opzione --graph
:
ansible-inventory -i myazure_rm.yml --graph
@all:
|--@linux:
| |--linux-vm_cdb4
|--@ungrouped:
|--@windows:
| |--win-vm_3211
Dall'output è possibile vedere che le macchine virtuali non sono più associate al ungrouped
gruppo. Ogni macchina virtuale viene invece assegnata a un nuovo gruppo creato dall'inventario dinamico.
Punto chiave:
- I gruppi condizionali consentono di assegnare nomi a gruppi specifici all'interno dell'inventario e di popolarli usando
hostvars
.
Assegnare l'appartenenza al gruppo con keyed_groups
I gruppi con chiave assegnano l'appartenenza al gruppo allo stesso modo in cui i gruppi condizionali eseguono la stessa operazione, ma quando si usa un gruppo con chiave anche il nome del gruppo viene popolato in modo dinamico.
Aggiungere i keyed_group seguenti all'inventario myazure_rm.yml
dinamico:
plugin: azure_rm
include_vm_resource_groups:
- ansible-inventory-test-rg
auth_source: auto
conditional_groups:
linux: "'ubuntu' in image.offer"
windows: "'WindowsServer' in image.offer"
keyed_groups:
- key: tags.applicationRole
ansible-inventory
Eseguire con l'opzione --graph
:
ansible-inventory -i myazure_rm.yml --graph
@all:
|--@_message_broker:
| |--linux-vm_cdb4
|--@_web_server:
| |--win-vm_3211
|--@linux:
| |--linux-vm_cdb4
|--@ungrouped:
|--@windows:
| |--win-vm_3211
Nell'output vengono visualizzati altri due gruppi _message_broker
e _web_server
. Usando un gruppo con chiave, il applicationRole
tag popola i nomi dei gruppi e le appartenenze ai gruppi.
Punto chiave:
- Per impostazione predefinita, i gruppi con chiave includono un separatore. Per rimuovere il separatore, aggiungere
separator: ""
sotto la proprietà della chiave.
Eseguire playbook con modelli di nome gruppo
Usare i gruppi creati dall'inventario dinamico per i sottogruppi di destinazione.
Creare un playbook denominato
win_ping.yml
con il contenuto seguente:--- - hosts: windows gather_facts: false vars_prompt: - name: username prompt: "Enter local username" private: false - name: password prompt: "Enter password" vars: ansible_user: "{{ username }}" ansible_password: "{{ password }}" ansible_connection: winrm ansible_winrm_transport: ntlm ansible_winrm_server_cert_validation: ignore tasks: - name: run win_ping win_ping:
Eseguire il
win_ping.yml
playbook.ansible-playbook win_ping.yml -i myazure_rm.yml
Quando richiesto, immettere
username
epassword
per la macchina virtuale Windows di Azure.Enter local username: azureuser Enter password: PLAY [windows] ************************************************************************************************************************************** TASK [run win_ping] ********************************************************************************************************************************* ok: [win-vm_3211] PLAY RECAP ****************************************************************************************************************************************** win-vm_3211 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Importante
Se viene visualizzato l'errore
winrm or requests is not installed: No module named 'winrm'
, installare pywinrm con il comando seguente:pip install "pywinrm>=0.3.0"
Creare un secondo playbook denominato
ping.yml
con il contenuto seguente:--- - hosts: all gather_facts: false vars_prompt: - name: username prompt: "Enter ssh user" - name: password prompt: "Enter password for ssh user" vars: ansible_user: "{{ username }}" ansible_password: "{{ password }}" ansible_ssh_common_args: '-o StrictHostKeyChecking=no' tasks: - name: run ping ping:
Eseguire il
ping.yml
playbook.ansible-playbook ping.yml -i myazure_rm.yml
Quando richiesto, immettere
username
epassword
per la macchina virtuale Linux di Azure.Enter ssh username: azureuser Enter password for ssh user: PLAY [linux] ******************************************************************************************************* TASK [run ping] **************************************************************************************************** ok: [linux-vm_cdb4] PLAY RECAP ********************************************************************************************************* linux-vm_cdb4 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Pulire le risorse
Eseguire az group delete per eliminare il gruppo di risorse. Tutte le risorse all'interno del gruppo di risorse vengono eliminate.
az group delete --name <resource_group>
Verificare che il gruppo di risorse sia stato eliminato usando az group show.
az group show --name <resource_group>