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

Attenzione

Questo articolo fa riferimento a CentOS, una distribuzione Linux prossima allo stato EOL (End of Life, fine del ciclo di vita). Prendere in considerazione l'uso e il piano di conseguenza. Per altre informazioni, vedere le linee guida per la fine della vita di CentOS.

La funzionalità di inventario dinamico di Ansible elimina il carico di manutenzione dei file di inventario statici.

In questa esercitazione si userà 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.

Creare macchine virtuali di Azure

  1. Accedere al portale di Azure.

  2. Aprire Cloud Shell.

  3. 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
    
  4. 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 CentOS85Gen2 \
      --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:

  1. 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 di yml o yaml.
  2. Eseguire il comando seguente per eseguire una query sulle macchine virtuali all'interno del gruppo di risorse:

    ansible-inventory -i myazure_rm.yml --graph
    
  3. 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. Questo è il motivo per i caratteri aggiuntivi dopo i nomi delle macchine virtuali. È possibile disabilitare questa funzionalità 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": "CentOS",
                    "publisher": "OpenLogic",
                    "sku": "7.7",
                    "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: "'CentOS' 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 gruppo è stato invece assegnato 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: "'CentOS' 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 verranno visualizzati altri due gruppi _message_broker e _web_server. Usando un gruppo con chiave, il applicationRole tag ha popolato 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 aggiunto 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.

  1. 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:
    
  2. Eseguire il win_ping.yml playbook.

    ansible-playbook win_ping.yml -i myazure_rm.yml
    

    Quando richiesto, immettere username e password 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"

  3. 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:
    
  4. Eseguire il ping.yml playbook.

    ansible-playbook ping.yml -i myazure_rm.yml
    

    Quando richiesto, immettere username e password 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

  1. Eseguire az group delete per eliminare il gruppo di risorse. Tutte le risorse presenti nel gruppo di risorse verranno eliminate.

    az group delete --name <resource_group>
    
  2. Verificare che il gruppo di risorse sia stato eliminato usando az group show.

    az group show --name <resource_group>
    

Passaggi successivi