Tutorial: Configuración de inventarios dinámicos de los recursos de Azure con AnsibleTutorial: Configure dynamic inventories of your Azure resources using Ansible

Ansible puede utilizarse para extraer información de inventario de varios orígenes (incluidos orígenes en la nube como Azure) en un inventario dinámico.Ansible can be used to pull inventory information from various sources (including cloud sources such as Azure) into a dynamic inventory.

En este tutorial, se usa Ansible para:In this tutorial, Ansible is used to:

  • Configurar dos máquinas virtuales de prueba.Configure two test virtual machines.
  • Etiquetar una de las máquinas virtuales.Tag one of the virtual machines
  • Instalar Nginx en las máquinas virtuales etiquetadas.Install Nginx on the tagged virtual machines
  • Configurar un inventario dinámico que incluya los recursos de Azure configurados.Configure a dynamic inventory that includes the configured Azure resources

PrerequisitesPrerequisites

  • Suscripción de Azure: Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.Azure subscription: If you don't have an Azure subscription, create a free account before you begin.
  • Entidad de servicio de Azure: Cree una entidad de servicio, tomando nota de los siguientes valores: appId, displayName, password y tenant.Azure service principal: Create a service principal, making note of the following values: appId, displayName, password, and tenant.

Creación de las máquinas virtuales de pruebaCreate the test VMs

  1. Inicie sesión en Azure Portal.Sign in to the Azure portal.

  2. Abra Cloud Shell.Open Cloud Shell.

  3. Cree un grupo de recursos de Azure para almacenar las máquinas virtuales para este tutorial.Create an Azure resource group to hold the virtual machines for this tutorial.

    Importante

    El grupo de recursos de Azure que crea en este paso debe tener un nombre que está completamente en minúsculas.The Azure resource group you create in this step must have a name that is entirely lower-case. De lo contrario, se producirá un error en la generación del inventario dinámico.Otherwise, the generation of the dynamic inventory will fail.

    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:Create two Linux virtual machines on Azure using one of the following techniques:

    • Guión de procedimientos de Ansible: el artículo Creación de una máquina virtual básica en Azure con Ansible explica cómo crear una máquina virtual a partir de un guión de procedimientos de Ansible.Ansible playbook - The article, Create a basic virtual machine in Azure with Ansible illustrates how to create a virtual machine from an Ansible playbook. Si usa un guión de procedimientos para definir una o las dos máquinas virtuales, asegúrese de que se utiliza la conexión SSH en lugar de una contraseña.If you use a playbook to define one or both of the virtual machines, ensure that the SSH connection is used instead of a password.

    • CLI de Azure: Use cada uno de los siguientes comandos en Cloud Shell para crear las dos máquinas virtuales:Azure CLI - Issue each of the following commands in the Cloud Shell to create the two virtual machines:

      az vm create --resource-group ansible-inventory-test-rg \
                   --name ansible-inventory-test-vm1 \
                   --image UbuntuLTS --generate-ssh-keys
      
      az vm create --resource-group ansible-inventory-test-rg \
                   --name ansible-inventory-test-vm2 \
                   --image UbuntuLTS --generate-ssh-keys
      

Etiquetado de una máquina virtualTag a VM

Puede usar etiquetas para organizar los recursos de Azure por categorías definidas por el usuario.You can use tags to organize your Azure resources by user-defined categories.

Uso de versiones de Ansible anteriores a 2.8Using Ansible version < 2.8

Escriba el comando az resource tag siguiente para etiquetar la máquina virtual ansible-inventory-test-vm1 con la clave nginx:Enter the following az resource tag command to tag the virtual machine ansible-inventory-test-vm1 with the key nginx:

az resource tag --tags nginx --id /subscriptions/<YourAzureSubscriptionID>/resourceGroups/ansible-inventory-test-rg/providers/Microsoft.Compute/virtualMachines/ansible-inventory-test-vm1

Uso de versiones de Ansible anteriores o iguales a 2.8Using Ansible version >= 2.8

Escriba el comando az resource tag siguiente para etiquetar la máquina virtual ansible-inventory-test-vm1 con la clave Ansible=nginx:Enter the following az resource tag command to tag the virtual machine ansible-inventory-test-vm1 with the key Ansible=nginx:

az resource tag --tags Ansible=nginx --id /subscriptions/<YourAzureSubscriptionID>/resourceGroups/ansible-inventory-test-rg/providers/Microsoft.Compute/virtualMachines/ansible-inventory-test-vm1

Generación de un inventario dinámicoGenerate a dynamic inventory

Una vez definidas y etiquetadas las máquinas virtuales, es el momento de generar el inventario dinámico.Once you have your virtual machines defined (and tagged), it's time to generate the dynamic inventory.

Uso de versiones de Ansible anteriores a 2.8Using Ansible version < 2.8

Ansible proporciona un script de Python llamado azure_rm.py que genera un inventario dinámico de sus recursos de Azure.Ansible provides a Python script named azure_rm.py that generates a dynamic inventory of your Azure resources. Los pasos siguientes le guían en el uso del script azure_rm.py para conectarse a sus dos máquinas virtual de Azure de prueba:The following steps walk you through using the azure_rm.py script to connect to your two test Azure virtual machines:

  1. Use el comando wget de GNU para recuperar el script azure_rm.py:Use the GNU wget command to retrieve the azure_rm.py script:

    wget https://raw.githubusercontent.com/ansible/ansible/devel/contrib/inventory/azure_rm.py
    
  2. Use el comando chmod para cambiar los permisos de acceso al script azure_rm.py.Use the chmod command to change the access permissions to the azure_rm.py script. El siguiente comando usa el parámetro +x para permitir la ejecución del archivo especificado (azure_rm.py):The following command uses the +x parameter to allow for execution (running) of the specified file (azure_rm.py):

    chmod +x azure_rm.py
    
  3. Use el comando ansible para conectarse al grupo de recursos:Use the ansible command to connect to your resource group:

    ansible -i azure_rm.py ansible-inventory-test-rg -m ping 
    
  4. Una vez conectado, debería ver resultados similares a lo siguiente:Once connected, you see results similar to the following output:

    ansible-inventory-test-vm1 | SUCCESS => {
        "changed": false,
        "failed": false,
        "ping": "pong"
    }
    ansible-inventory-test-vm2 | SUCCESS => {
        "changed": false,
        "failed": false,
        "ping": "pong"
    }
    

Ansible versión 2.8 y posterioresAnsible version >= 2.8

A partir de la versión 2.8, Ansible proporciona un complemento de inventario dinámico de Azure.Starting with Ansible 2.8, Ansible provides an Azure dynamic-inventory plug-in. Los siguientes pasos le guiarán en el uso del complemento:The following steps walk you through using the plug-in:

  1. El complemento de inventario requiere un archivo de configuración.The inventory plug-in requires a configuration file. El archivo de configuración debe terminar con azure_rm y tener la extensión yml o yaml.The configuration file must end in azure_rm and have an extension of either yml or yaml. Para este ejemplo del tutorial, guarde el siguiente cuaderno de estrategias como myazure_rm.yml:For this tutorial example, save the following playbook as myazure_rm.yml:

        plugin: azure_rm
        include_vm_resource_groups:
        - ansible-inventory-test-rg
        auth_source: auto
    
        keyed_groups:
        - prefix: tag
          key: tags
    
  2. Ejecute el siguiente comando para hacer ping a las máquinas virtuales del grupo de recursos:Run the following command to ping VMs in the resource group:

    ansible all -m ping -i ./myazure_rm.yml
    
  3. Al ejecutar el comando anterior, podría recibir el siguiente error:When running the preceding command, you could receive the following error:

    Failed to connect to the host via ssh: Host key verification failed.
    

    Si recibe el error "host-key verification" (comprobación de la clave de host), agregue la siguiente línea al archivo de configuración de Ansible.If you do receive the "host-key verification" error, add the following line to the Ansible configuration file. El archivo de configuración de Ansible se encuentra en /etc/ansible/ansible.cfg o en ~/.ansible.cfg.The Ansible configuration file is located at /etc/ansible/ansible.cfg or ~/.ansible.cfg.

    host_key_checking = False
    
  4. Tras ejecutar el cuaderno de estrategias, debería ver resultados similares a la siguiente salida:When you run the playbook, you see results similar to the following output:

    ansible-inventory-test-vm1_0324 : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
    ansible-inventory-test-vm2_8971 : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
    

Habilitación de la etiqueta de la máquina virtualEnable the VM tag

Si usa versiones de Ansible anteriores a 2.8:If you're using Ansible < 2.8,

  • Una vez que ha establecido una etiqueta, debe "habilitarla".Once you've set a tag, you need to "enable" that tag. Una manera de habilitar una etiqueta es exportarla a una variable de entorno llamada AZURE_TAGS mediante el comando export:One way to enable a tag is by exporting the tag to an environment variable AZURE_TAGS via the export command:

    export AZURE_TAGS=nginx
    
  • Ejecute el siguiente comando:Run the following command:

    ansible -i azure_rm.py ansible-inventory-test-rg -m ping
    

    Ahora verá solo una máquina virtual (aquella cuya etiqueta coincida con el valor exportado a la variable de entorno AZURE_TAGS):You now see only one virtual machine (the one whose tag matches the value exported into the AZURE_TAGS environment variable):

       ansible-inventory-test-vm1 | SUCCESS => {
        "changed": false,
        "failed": false,
        "ping": "pong"
    }
    

Si usa la versión 2.8 de Ansible o versiones anteriores:If you're using Ansible >= 2.8

  • Ejecute el comando ansible-inventory -i myazure_rm.yml --graph para obtener la siguiente salida:Run the command ansible-inventory -i myazure_rm.yml --graph to get the following output:

        @all:
          |--@tag_Ansible_nginx:
          |  |--ansible-inventory-test-vm1_9e2f
          |--@ungrouped:
          |  |--ansible-inventory-test-vm2_7ba9
    
  • También puede ejecutar el siguiente comando para probar la conexión a la máquina virtual de Nginx:You can also run the following command to test connection to the Nginx VM:

    ansible -i ./myazure_rm.yml -m ping tag_Ansible_nginx
    

Configuración de Nginx en la máquina virtual etiquetadaSet up Nginx on the tagged VM

El objetivo de las etiquetas es permitir que se pueda trabajar de forma rápida y sencilla con subgrupos de las máquinas virtuales.The purpose of tags is to enable the ability to quickly and easily work with subgroups of your virtual machines. Por ejemplo, supongamos que desea instalar Nginx solo en las máquinas virtuales a las que ha asignado una etiqueta de nginx.For example, let's say you want to install Nginx only on virtual machines to which you've assigned a tag of nginx. Los siguientes pasos muestran lo fácil que puede hacerlo:The following steps illustrate how easy that is to accomplish:

  1. Cree un archivo llamado nginx.yml:Create a file named nginx.yml:

    code nginx.yml
    
  2. Pegue el siguiente código de ejemplo en el editor:Paste the following sample code into the editor:

        ---
        - name: Install and start Nginx on an Azure virtual machine
          hosts: all
          become: yes
          tasks:
          - name: install nginx
            apt: pkg=nginx state=present
            notify:
            - start nginx
    
          handlers:
            - name: start nginx
              service: name=nginx state=started
    
  3. Guarde el archivo y salga del editor.Save the file and exit the editor.

  4. Use el comando ansible-playbook para ejecutar el cuaderno de estrategias:Run the playbook using the ansible-playbook command:

    • Ansible versiones anteriores a 2.8:Ansible < 2.8:

      ansible-playbook -i azure_rm.py nginx.yml
      
    • Ansible 2.8 y versiones posteriores:Ansible >= 2.8:

      ansible-playbook  -i ./myazure_rm.yml  nginx.yml --limit=tag_Ansible_nginx
      
  5. Tras ejecutar el cuaderno de estrategias, debería ver resultados similares a los siguientes:After running the playbook, you see output similar to the following results:

    PLAY [Install and start Nginx on an Azure virtual machine] 
    
    TASK [Gathering Facts] 
    ok: [ansible-inventory-test-vm1]
    
    TASK [install nginx] 
    changed: [ansible-inventory-test-vm1]
    
    RUNNING HANDLER [start nginx] 
    ok: [ansible-inventory-test-vm1]
    
    PLAY RECAP 
    ansible-inventory-test-vm1 : ok=3    changed=1    unreachable=0    failed=0
    

Prueba de la instalación de NginxTest Nginx installation

En esta sección se muestra una técnica para probar que Nginx está instalado en la máquina virtual.This section illustrates one technique to test that Nginx is installed on your virtual machine.

  1. Use el comando az vm list-ip-addresses para recuperar la dirección IP de la máquina virtual ansible-inventory-test-vm1.Use the az vm list-ip-addresses command to retrieve the IP address of the ansible-inventory-test-vm1 virtual machine. El valor devuelto (dirección IP de la máquina virtual) se utiliza entonces como parámetro del comando SSH para conectarse a la máquina virtual.The returned value (the virtual machine's IP address) is then used as the parameter to the SSH command to connect to the virtual machine.

    ssh `az vm list-ip-addresses \
    -n ansible-inventory-test-vm1 \
    --query [0].virtualMachine.network.publicIpAddresses[0].ipAddress -o tsv`
    
  2. Mientras esté conectado a la máquina virtual ansible-inventory-test-vm1, ejecute el comando nginx - v comando para determinar si Nginx está instalado.While connected to the ansible-inventory-test-vm1 virtual machine, run the nginx -v command to determine if Nginx is installed.

    nginx -v
    
  3. Una vez que ejecute el comando nginx -v, verá la versión de Nginx (segunda línea) que indica que Nginx está instalado.Once you run the nginx -v command, you see the Nginx version (second line) that indicates that Nginx is installed.

    tom@ansible-inventory-test-vm1:~$ nginx -v
    
    nginx version: nginx/1.10.3 (Ubuntu)
    
    tom@ansible-inventory-test-vm1:~$
    
  4. Presione la combinación de teclado <Ctrl>D para desconectar la sesión de SSH.Click the <Ctrl>D keyboard combination to disconnect the SSH session.

  5. Al realizar los anteriores pasos para la máquina virtual ansible-inventory-test-vm2, aparece un mensaje informativo que indica dónde puede obtener Nginx (lo que implica que no lo tiene instalado en este momento):Doing the preceding steps for the ansible-inventory-test-vm2 virtual machine yields an informational message indicating where you can get Nginx (which implies that you don't have it installed at this point):

    tom@ansible-inventory-test-vm2:~$ nginx -v
    The program 'nginx' can be found in the following packages:
    * nginx-core
    * nginx-extras
    * nginx-full
    * nginx-lightTry: sudo apt install <selected package>
    tom@ansible-inventory-test-vm2:~$
    

Pasos siguientesNext steps