Tutorial: Configuración de inventarios dinámicos de los recursos de Azure con Ansible
Importante
Para ejecutar los cuadernos de estrategias de ejemplo de este tutorial, se requiere Ansible 2.8 (o cualquier versión posterior).
La característica de inventario dinámico de Ansible elimina la carga de mantener archivos de inventario estáticos.
En este tutorial usará el complemento de inventario dinámico de Azure para rellenar el inventario de Ansible.
En este artículo aprenderá a:
- Configurar dos máquinas virtuales de prueba.
- Incorporación de etiquetas a las máquinas virtuales de Azure
- Generación de un inventario dinámico
- Uso de grupos condicionales y con clave para rellenar las pertenencias a grupos
- Ejecución de cuadernos de estrategias en grupos dentro del inventario dinámico
Requisitos previos
- Suscripción de Azure: si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.
- Entidad de servicio de Azure: cree una entidad de servicio y tome nota de los siguientes valores: appId, displayName, password y tenant.
Instalación de Ansible: realice una de las siguientes opciones:
- Instalar y configurar Ansible en una máquina virtual Linux
- Configurar Azure Cloud Shell y, si no tiene acceso a una máquina virtual Linux, crear una máquina virtual con Ansible.
Creación de VM de Azure
Inicie sesión en Azure Portal.
Abra Cloud Shell.
Cree un grupo de recursos de Azure para almacenar las máquinas virtuales para este tutorial.
Importante
El grupo de recursos de Azure que crea en este paso debe tener un nombre que está completamente en minúsculas. De lo contrario, se producirá un error en la generación del inventario dinámico.
az group create --resource-group ansible-inventory-test-rg --location eastus
Cree dos máquinas virtuales Linux en Azure mediante una de las técnicas siguientes:
Cuaderno de Ansible: los artículos Creación de una máquina virtual Linux básica en Azure con Ansible y Creación de una máquina virtual Windows básica en Azure con Ansible ilustran cómo crear una máquina virtual a partir de un cuaderno de estrategias de Ansible.
CLI de Azure: Use cada uno de los siguientes comandos en Cloud Shell para crear las dos máquinas virtuales:
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>
Reemplace
<password>
por su contraseña.
Incorporación de etiquetas de rol de aplicación
Las etiquetas se usan para organizar y clasificar los recursos de Azure. La asignación de un rol de aplicación a las máquinas virtuales de Azure permite usar las etiquetas como nombres de grupo dentro del inventario dinámico de Azure.
Ejecute los siguientes comandos para actualizar las etiquetas de la máquina virtual:
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'
Obtenga más información sobre las estrategias de etiquetado de Azure en Definición de la estrategia de etiquetado.
Generación de un inventario dinámico
Ansible proporciona un complemento de inventario dinámico de Azure.
Los siguientes pasos le guiarán en el uso del complemento:
Creación de un inventario dinámico denominado
myazure_rm.yml
plugin: azure_rm include_vm_resource_groups: - ansible-inventory-test-rg auth_source: auto
Punto clave:
- Ansible usa el nombre de archivo de inventario y la extensión para identificar qué complemento de inventario usar. Para usar el complemento de inventario dinámico de Azure, el archivo debe terminar por
azure_rm
y tener una extensiónyml
oyaml
.
- Ansible usa el nombre de archivo de inventario y la extensión para identificar qué complemento de inventario usar. Para usar el complemento de inventario dinámico de Azure, el archivo debe terminar por
Ejecute el siguiente comando para consultar las máquinas virtuales del grupo de recursos:
ansible-inventory -i myazure_rm.yml --graph
Tras ejecutar el comando, debería ver resultados similares a la siguiente salida:
@all: |--@ungrouped: | |--linux-vm_cdb4 | |--win-vm_3211
Ambas máquinas virtuales pertenecen al grupo ungrouped
, que es un elemento secundario del grupo all
del inventario de Ansible.
Punto clave:
- De forma predeterminada, el complemento de inventario dinámico de Azure devuelve nombres únicos globales. Por este motivo, los nombres de máquina virtual pueden contener caracteres adicionales. Puede deshabilitar este comportamiento si agrega
plain_host_names: yes
al inventario dinámico.
Búsqueda de hostvars en las máquinas virtuales de Azure
Ejecute el siguiente comando para ver todos los elementos 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"
},
...
}
}
},
...
}
}
Al extraer información de Azure, el inventario dinámico rellena hostvars
cada máquina virtual de Azure. Esos hostvars
sirven después para determinar la pertenencia a grupos de las máquinas virtuales dentro del inventario de Ansible.
Asignación de pertenencia a grupos con conditional_groups
Cada grupo condicional está formado por dos partes. El nombre del grupo y la condición para agregar un miembro al grupo.
Use la propiedad image.offer
para crear la pertenencia a grupos condicionales para linux-vm.
Abra el inventario dinámico myazure_rm.yml
y agregue el siguiente 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"
Ejecute ansible-inventory
con la opción --graph
:
ansible-inventory -i myazure_rm.yml --graph
@all:
|--@linux:
| |--linux-vm_cdb4
|--@ungrouped:
|--@windows:
| |--win-vm_3211
En la salida, puede ver que las máquinas virtuales ya no están asociadas al grupo ungrouped
. En su lugar, cada máquina virtual se asigna a un nuevo grupo creado por el inventario dinámico.
Punto clave:
- Los grupos condicionales permiten dar nombre a grupos específicos dentro del inventario y rellenarlos mediante
hostvars
.
Asignación de pertenencia a grupos con keyed_groups
Los grupos con clave asignan la pertenencia a grupos de la misma manera que los grupos condicionales, pero cuando se usa un grupo con clave, el nombre del grupo también se rellena dinámicamente.
Agregue el siguiente keyed_group al inventario 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
Ejecute ansible-inventory
con la opción --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
En la salida, verá dos grupos más: _message_broker
y _web_server
. Al usar un grupo con clave, la etiqueta applicationRole
rellena los nombres de grupo y las pertenencias a grupos.
Punto clave:
- De forma predeterminada, los grupos con clave incluyen un separador. Para quitar el separador, agregue
separator: ""
debajo de la propiedad de clave.
Ejecución de cuadernos de estrategias con patrones de nombre de grupo
Use los grupos creados por el inventario dinámico para los subgrupos de destino.
Cree un cuaderno de estrategias llamado
win_ping.yml
con el siguiente contenido:--- - 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:
Ejecute el cuaderno de estrategias
win_ping.yml
.ansible-playbook win_ping.yml -i myazure_rm.yml
Cuando se le solicite, escriba
username
ypassword
para la máquina virtual Windows de 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
Si recibe el error
winrm or requests is not installed: No module named 'winrm'
, instale pywinrm con el siguiente comando:pip install "pywinrm>=0.3.0"
.Cree un segundo cuaderno de estrategias llamado
ping.yml
con el siguiente contenido:--- - 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:
Ejecute el cuaderno de estrategias
ping.yml
.ansible-playbook ping.yml -i myazure_rm.yml
Cuando se le solicite, escriba
username
ypassword
para la máquina virtual Linux de 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
Limpieza de recursos
Ejecute az group delete para eliminar el grupo de recursos. Se eliminarán todos los recursos del grupo de recursos.
az group delete --name <resource_group>
Compruebe que se ha eliminado el grupo de recursos mediante az group show.
az group show --name <resource_group>