Compartir vía


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.

Creación de VM de Azure

  1. Inicie sesión en Azure Portal.

  2. Abra Cloud Shell.

  3. 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
    
  4. 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:

  1. 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ón yml o yaml.
  2. Ejecute el siguiente comando para consultar las máquinas virtuales del grupo de recursos:

    ansible-inventory -i myazure_rm.yml --graph
    
  3. 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.

  1. 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:
    
  2. Ejecute el cuaderno de estrategias win_ping.yml.

    ansible-playbook win_ping.yml -i myazure_rm.yml
    

    Cuando se le solicite, escriba username y password 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".

  3. 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:
    
  4. Ejecute el cuaderno de estrategias ping.yml.

    ansible-playbook ping.yml -i myazure_rm.yml
    

    Cuando se le solicite, escriba username y password 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

  1. 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>
    
  2. Compruebe que se ha eliminado el grupo de recursos mediante az group show.

    az group show --name <resource_group>
    

Pasos siguientes