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.
- Entidade de serviço do Azure: crie uma entidade de serviço anotando os seguintes valores: appId, displayName, password e tenant.
Instalar o Ansible: escolha uma das seguintes opções:
- Instalar e configurar o Ansible em uma máquina virtual do Linux
- Configurar o Azure Cloud Shell e, se você não tiver acesso a uma máquina virtual do Linux, criar uma máquina virtual com o Ansible.
Criar VMs do Azure
Entre no portal do Azure.
Abra o Cloud Shell.
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
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:
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ãoyml
ouyaml
.
- 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
Execute o seguinte comando para consultar as VMs no grupo de recursos:
ansible-inventory -i myazure_rm.yml --graph
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.
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:
Execute o guia estratégico
win_ping.yml
.ansible-playbook win_ping.yml -i myazure_rm.yml
Quando solicitado, insira
username
epassword
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"
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:
Execute o guia estratégico
ping.yml
.ansible-playbook ping.yml -i myazure_rm.yml
Quando solicitado, insira
username
epassword
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
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>
Verifique se o grupo de recursos foi excluído usando az group show.
az group show --name <resource_group>