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 deste artigo.

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

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

Neste artigo, você aprenderá como:

  • Configurar duas máquinas virtuais de teste
  • Adicionar marcas a máquinas virtuais do Azure
  • Gerar um inventário dinâmico
  • Usar grupos condicionais e chaveados para preencher associações de grupo
  • Executar guias estratégicos em grupos dentro do estoque dinâmico

Pré-requisitos

  • Assinatura do Azure: caso você não tenha 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 manter as máquinas virtuais para este tutorial.

    Importante

    O grupo de recursos do Azure criado nesta etapa deve ter um nome inteiramente em 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 do Linux no Azure usando uma das seguintes técnicas:

    • Guia estratégico do Ansible: os artigos 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 mostram como criar uma máquina virtual usando 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> pela sua senha.

Adicionar marcas de função de aplicativo

As marcas são usadas para organizar e categorizar os recursos do Azure. Quando atribui uma função de aplicativo a VMs do Azure, você pode usar as marcas como nomes de grupo no estoque dinâmico do Azure.

Execute os seguintes comandos para atualizar as marcas de 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 etapas a seguir mostram o 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-chave:

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

    ansible-inventory -i myazure_rm.yml --graph
    
  3. Depois de 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 filho do grupo all no estoque do Ansible.

Ponto-chave:

  • Por padrão, o plug-in de estoque dinâmico do Azure retorna nomes globalmente exclusivos. Por esse motivo, os nomes das VMs podem conter caracteres extras. Para desabilitar esse comportamento, adicione plain_host_names: yes ao inventário dinâmico.

Encontrar hostvars da VM do Azure

Execute o seguinte comando para ver 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 obter informações do Azure, o estoque dinâmico preenche o hostvars para cada VM do Azure. Em seguida, os hostvars são usados para determinar as associações de grupo de VM dentro do estoque 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 linux-vm.

Abra o estoque dinâmico myazure_rm.yml e adicione o conditional_group seguinte:

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 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 grupo ungrouped. Em vez disso, cada VM é atribuída a um novo grupo criado pelo inventário dinâmico.

Ponto-chave:

  • Os grupos condicionais permitem nomear grupos específicos no estoque e preenchê-los usando hostvars.

Atribuir associação de grupo com keyed_groups

Os grupos chaveados atribuem a associação da mesma maneira que os grupos condicionais, mas o nome também é preenchido automaticamente ao usar um grupo chaveado.

Adicione o seguinte keyed_group ao estoque dinâmico myazure_rm.yml:

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 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. Com o grupo chaveado, a marcação applicationRole preenche os nomes e as associações do grupo.

Ponto-chave:

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

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

Use os grupos criados pelo estoque 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 guia estratégico win_ping.yml.

    ansible-playbook win_ping.yml -i myazure_rm.yml
    

    Quando solicitado, insira username e password da 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 ocorrer o erro winrm or requests is not installed: No module named 'winrm', instale o pywinrm com este comando: pip install "pywinrm>=0.3.0"

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

    ansible-playbook ping.yml -i myazure_rm.yml
    

    Quando solicitado, insira username e password da VM do 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