Compartir a través de


Tutorial: Configuración de inventarios dinámicos de los recursos de Azure mediante Ansible

Importante

Se requiere Ansible 2.8 (o posterior) para ejecutar los cuadernos de estrategias de ejemplo de este artículo.

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:

  • Configure dos máquinas virtuales de prueba.
  • Adición de etiquetas a máquinas virtuales de Azure
  • Generación de un inventario dinámico
  • Uso de grupos condicionales y basados en claves para rellenar las membresías de grupos
  • Ejecución de cuadernos de estrategias en grupos dentro del inventario dinámico

Prerrequisitos

  • Suscripción de Azure: si no tiene una suscripción de Azure, cree una cuenta gratuita antes de comenzar.

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 de este tutorial.

    Importante

    El grupo de recursos de Azure que cree en este paso debe tener un nombre que sea totalmente 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 estrategias de Ansible: en el artículo 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 se muestra cómo crear una máquina virtual a partir de un cuaderno de estrategias de Ansible.

    • CLI de Azure : emita 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 la <password> contraseña.

Adición de etiquetas de rol de aplicación

Las etiquetas se usan para organizar y clasificar los recursos de Azure. La asignación de las máquinas virtuales de Azure a un rol de aplicación permite usar las etiquetas como nombres de grupo dentro del inventario dinámico de Azure.

Ejecute los comandos siguientes para actualizar las etiquetas de 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 pasos siguientes le guiarán por 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 se va a usar. Para usar el complemento de inventario dinámico de Azure, el archivo debe terminar con azure_rm y tener una extensión de yml o yaml.
  2. Ejecute el siguiente comando para consultar las máquinas virtuales dentro del grupo de recursos:

    ansible-inventory -i myazure_rm.yml --graph
    
  3. Al ejecutar el comando, verá resultados similares a los siguientes:

    @all:
      |--@ungrouped:
      |  |--linux-vm_cdb4
      |  |--win-vm_3211
    

Ambas máquinas virtuales pertenecen al ungrouped grupo, que es un elemento secundario del all grupo en el 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 ese comportamiento agregando plain_host_names: yes al inventario dinámico.

Encuentre variables de hosts de máquina virtual de Azure

Ejecute el siguiente comando para ver todos los hostvarselementos :

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 en hostvars para cada VM de Azure. A hostvars continuación, se utilizan para determinar las pertenencias a grupos de máquinas virtuales dentro del inventario de Ansible.

Asignar membresía de grupo con conditional_groups

Cada grupo condicional se compone de 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 myazure_rm.yml inventario dinámico y agregue lo 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 el 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 ungrouped grupo. 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 asignar un nombre a grupos específicos dentro del inventario y rellenarlos mediante hostvars.

Asignar pertenencia a grupos con keyed_groups

Los grupos con claves asignan la pertenencia a grupos de la misma manera que los grupos condicionales, pero cuando se usa un grupo con claves, el nombre del grupo también se rellena dinámicamente.

Agregue los siguientes keyed_group al myazure_rm.yml inventario 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

Ejecute el 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án dos grupos más _message_broker y _web_server. Mediante el uso de un grupo con clave, la applicationRole etiqueta rellena los nombres de grupo y las pertenencias a grupos.

Punto clave:

  • De forma predeterminada, los grupos con claves incluyen un separador. Para quitar el separador, agregue separator: "" en la propiedad clave.

Ejecutar cuadernos de estrategias con patrones de nombre de grupo

Use los grupos creados por el inventario dinámico para dirigirse a subgrupos.

  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 win_ping.yml estrategias.

    ansible-playbook win_ping.yml -i myazure_rm.yml
    

    Cuando se le solicite, introduzca el username y el 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 comando siguiente: pip install "pywinrm>=0.3.0"

  3. Cree un segundo cuaderno de estrategias denominado 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 ping.yml estrategias.

    ansible-playbook ping.yml -i myazure_rm.yml
    

    Cuando se le solicite, escriba los valores de 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 eliminan todos los recursos del grupo de recursos.

    az group delete --name <resource_group>
    
  2. Compruebe que el grupo de recursos se eliminó mediante az group show.

    az group show --name <resource_group>
    

Pasos siguientes