Tutorial: Configurar inventários dinâmicos de seus recursos do Azure usando o Ansible

Importante

O Ansible 2.8 (ou posterior) é necessário para executar os playbooks de exemplo neste artigo.

O recurso de inventário dinâmico do Ansible elimina a carga de manter arquivos de inventário estáticos.

Neste tutorial, você usa o plug-in de inventário dinâmico do Azure para preencher seu inventário do Ansible.

Neste artigo, vai aprender a:

  • Configure duas máquinas virtuais de teste.
  • Adicionar tags a máquinas virtuais do Azure
  • Gerar um inventário dinâmico
  • Usar grupos condicionais e com chave para preencher associações de grupo
  • Execute playbooks em grupos dentro do inventário dinâmico

Pré-requisitos

  • Subscrição do Azure: se não tem uma subscrição do Azure, crie uma conta gratuita antes de começar.
  • Entidade de serviço do Azure: crie uma entidade de serviço, anotando os seguintes valores: appId, displayName, senha e locatário.

Criar VMs do Azure

  1. Inicie sessão no portal do Azure.

  2. Abra o Cloud Shell.

  3. Crie um grupo de recursos do Azure para armazenar as máquinas virtuais para este tutorial.

    Importante

    O grupo de recursos do Azure criado nesta etapa deve ter um nome totalmente minúsculo. Caso contrário, a geração do inventário dinâmico falhará.

    az group create --resource-group ansible-inventory-test-rg --location eastus
    
  4. Crie duas máquinas virtuais Linux no Azure usando uma das seguintes técnicas:

    • Manual do Ansible - O artigo Criar uma máquina virtual Linux básica no Azure com o Ansible e Criar uma máquina virtual básica do Windows no Azure com o Ansible ilustra como criar uma máquina virtual a partir de um manual do Ansible.

    • CLI do Azure - Emita cada um dos seguintes comandos no Cloud Shell para criar as duas máquinas virtuais:

      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>
      

      Substitua a <password> sua palavra-passe.

Adicionar tags de função do aplicativo

As tags são usadas para organizar e categorizar recursos do Azure. Atribuir às VMs do Azure uma função de aplicativo permite que você use as marcas como nomes de grupo no inventário dinâmico do Azure.

Execute os seguintes comandos para atualizar as tags VM:

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' 

Saiba mais sobre as estratégias de marcação do Azure em Definir sua estratégia de marcação.

Gerar um inventário dinâmico

O Ansible fornece um plug-in de inventário dinâmico do Azure.

As etapas a seguir o orientam pelo uso do plug-in:

  1. Criar um inventário dinâmico chamado myazure_rm.yml

    plugin: azure_rm
    include_vm_resource_groups:
      - ansible-inventory-test-rg
    auth_source: auto
    

    Ponto principal:

    • O Ansible usa o nome e a extensão do arquivo de inventário para identificar qual plug-in de inventário usar. Para usar o plug-in de inventário dinâmico do Azure, o arquivo deve terminar com azure_rm e ter uma extensão de um ou yml yaml.
  2. Execute o seguinte comando para consultar as VMs dentro do grupo de recursos:

    ansible-inventory -i myazure_rm.yml --graph
    
  3. Quando você executa o comando, você vê resultados semelhantes à seguinte saída:

    @all:
      |--@ungrouped:
      |  |--linux-vm_cdb4
      |  |--win-vm_3211
    

Ambas as VMs pertencem ao ungrouped grupo, que é um filho do all grupo no inventário do Ansible.

Ponto principal:

  • Por padrão, o plug-in de inventário dinâmico do Azure retorna nomes globalmente exclusivos. Por esse motivo, os nomes de VM podem conter caracteres extras. Você pode desativar esse comportamento adicionando plain_host_names: yes ao inventário dinâmico.

Encontre hostvars de VM do Azure

Execute o seguinte comando para exibir todos os 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"
                },
                ...
            }
        }
    },
    ...
    }
}

Ao extrair informações do Azure, o inventário dinâmico preenche o hostvars para cada VM do Azure. Esses hostvars são, então, para determinar as associações de grupo de VM dentro do inventário do Ansible.

Atribuir associação de grupo com conditional_groups

Cada grupo condicional é composto por duas partes. O nome do grupo e a condição para adicionar um membro ao grupo.

Use a propriedade image.offer para criar associação de grupo condicional para o linux-vm.

Abra o myazure_rm.yml inventário dinâmico e adicione o seguinte 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"

Execute o ansible-inventory com a --graph opção:

ansible-inventory -i myazure_rm.yml --graph
@all:
  |--@linux:
  |  |--linux-vm_cdb4
  |--@ungrouped:
  |--@windows:
  |  |--win-vm_3211

Na saída, você pode ver que as VMs não estão mais associadas ao ungrouped grupo. Em vez disso, cada VM é atribuída a um novo grupo criado pelo inventário dinâmico.

Ponto principal:

  • Os grupos condicionais permitem nomear grupos específicos dentro do seu inventário e preenchê-los usando hostvarso .

Atribuir associação de grupo com keyed_groups

Os grupos com chave atribuem a associação ao grupo da mesma forma que os grupos condicionais, mas ao usar um grupo com chave, o nome do grupo também é preenchido dinamicamente.

Adicione as seguintes keyed_group ao myazure_rm.yml inventário dinâmico:

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

Execute o ansible-inventory com a --graph opção:

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

A partir da saída, você vê mais dois grupos _message_broker e _web_server. Usando um grupo com chave, a applicationRole tag preenche os nomes e associações de grupo.

Ponto principal:

  • Por padrão, os grupos com chave incluem um separador. Para remover o separador, adicione separator: "" sob a propriedade key.

Executar playbooks com padrões de nome de grupo

Use os grupos criados pelo inventário dinâmico para segmentar subgrupos.

  1. Crie um playbook chamado win_ping.yml com o seguinte conteúdo:

    ---
    - 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. Execute o win_ping.yml playbook.

    ansible-playbook win_ping.yml -i myazure_rm.yml
    

    Quando solicitado, insira o username e password para a VM do Windows do 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 você receber o erro winrm or requests is not installed: No module named 'winrm', instale pywinrm com o seguinte comando: pip install "pywinrm>=0.3.0"

  3. Crie um segundo playbook nomeado ping.yml com o seguinte conteúdo:

    ---
    - 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. Execute o ping.yml playbook.

    ansible-playbook ping.yml -i myazure_rm.yml
    

    Quando solicitado, insira o username e password para a VM Linux do 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  
    

Clean up resources (Limpar recursos)

  1. Execute az group delete para excluir o grupo de recursos. Todos os recursos dentro do grupo de recursos são excluídos.

    az group delete --name <resource_group>
    
  2. Verifique se o grupo de recursos foi excluído usando az group show.

    az group show --name <resource_group>
    

Próximos passos