Compartilhar via


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 guias estratégicos de exemplo neste artigo.

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

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

Neste artigo, você 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 grupos com chave para preencher associações de grupo
  • Executar playbooks contra grupos no inventário dinâmico

Pré-requisitos

  • Assinatura do Azure: Se você não tiver uma assinatura do Azure, crie uma conta gratuita antes de começar.

Criar VMs do Azure

  1. Entre no portal do Azure.

  2. Abra o Cloud Shell.

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

    Importante

    O grupo de recursos do Azure que você criar nesta etapa deve ter um nome totalmente em minúsculas. 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:

    • Guia estratégico do Ansible – O artigo, Criar uma máquina virtual básica do Linux 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 guia estratégico 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 <password> sua senha.

Adicionar tags de função de aplicativo

As tags são usadas para organizar e categorizar recursos do Azure. Atribuir as VMs do Azure a 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 etiquetas da 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 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 seguintes etapas orientam você usando o 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-chave:

    • O Ansible usa o nome do arquivo de inventário e a extensão 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 yml ou yaml.
  2. Execute o seguinte comando para consultar as VMs no grupo de recursos:

    ansible-inventory -i myazure_rm.yml --graph
    
  3. Ao executar o comando, você verá resultados semelhantes à seguinte saída:

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

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

Ponto-chave:

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

Localizar 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 a hostvars de cada VM do Azure. Em hostvars seguida, eles devem 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 é feito de 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 opção --graph:

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-chave:

  • Os grupos condicionais permitem que você nomeie grupos específicos em seu inventário e os preencha usando hostvars.

Atribuir associação de grupo com keyed_groups

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

Adicione o seguinte grupo_chave 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 opção --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

Na saída, você verá mais dois grupos _message_broker e _web_server. Usando um grupo baseado em chave, a tag applicationRole popula os nomes dos grupos e as associações de grupos.

Ponto-chave:

  • Por padrão, os grupos chaveados incluem um separador. Para remover o separador, adicione separator: "" na propriedade de chave.

Executar guias estratégicos com padrões de nome de grupo

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

  1. Crie um guia estratégico 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 roteiro.

    ansible-playbook win_ping.yml -i myazure_rm.yml
    

    Quando solicitado, insira o username e password na VM do Azure Windows.

    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 o pywinrm com o seguinte comando: pip install "pywinrm>=0.3.0"

  3. Crie um segundo guia estratégico 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 roteiro.

    ansible-playbook ping.yml -i myazure_rm.yml
    

    Quando solicitado, insira o username e password na 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  
    

Limpar os 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óximas etapas