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.
Instale o Ansible: execute uma das seguintes opções:
- Instalar e configurar o Ansible em uma máquina virtual Linux
- Configure o Azure Cloud Shell e, se você não tiver acesso a uma máquina virtual Linux, crie uma máquina virtual com o Ansible.
Criar VMs do Azure
Inicie sessão no portal do Azure.
Abra o Cloud Shell.
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
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:
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 ouyml
yaml
.
- 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
Execute o seguinte comando para consultar as VMs dentro do grupo de recursos:
ansible-inventory -i myazure_rm.yml --graph
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
hostvars
o .
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.
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:
Execute o
win_ping.yml
playbook.ansible-playbook win_ping.yml -i myazure_rm.yml
Quando solicitado, insira o
username
epassword
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"
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:
Execute o
ping.yml
playbook.ansible-playbook ping.yml -i myazure_rm.yml
Quando solicitado, insira o
username
epassword
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)
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>