Guía para gestionar inventario dinámico y estático con Ansible

Domine la gestión de inventario de Ansible con esta guía completa. Aprenda a definir, agrupar y verificar hosts utilizando tanto archivos estáticos INI/YAML como fuentes de inventario dinámico. Explore ejemplos prácticos y las banderas esenciales del comando `ansible-inventory` como `--graph`, `--host` y `--list` para asegurar que su automatización se dirija a los sistemas correctos de manera efectiva.

Guía para Gestionar el Inventario Dinámico y Estático con Ansible

El inventario de Ansible responde a una pregunta práctica: ¿qué sistemas debe tocar esta automatización? Si tu inventario es incorrecto, un buen playbook aún puede apuntar al host equivocado, saltarse un nuevo servidor o usar las variables de conexión incorrectas.

Esta guía cubre archivos de inventario estático, fuentes de inventario dinámico y las comprobaciones de ansible-inventory que te ayudan a confirmar que Ansible ve la misma infraestructura que esperas.

Entendiendo el Inventario de Ansible

En esencia, un inventario de Ansible es una lista de hosts y grupos. Ansible usa esta información para determinar a qué máquinas conectarse y en cuáles ejecutar tareas. La ubicación predeterminada del archivo de inventario es /etc/ansible/hosts, pero puedes especificar un archivo de inventario diferente para cualquier comando o playbook de Ansible usando la bandera -i.

Hay dos formas principales de gestionar tu inventario:

  • Inventario Estático: Implica definir manualmente hosts y grupos en un archivo (formato INI o YAML).
  • Inventario Dinámico: Utiliza scripts o plugins para generar dinámicamente un inventario de hosts desde fuentes externas como proveedores de nube (AWS, Azure, GCP), plataformas de virtualización (VMware) o CMDBs.

Archivos de Inventario Estático

Los inventarios estáticos son sencillos para entornos con un conjunto estable de servidores. Generalmente se escriben en un formato similar a INI o en YAML.

Formato INI

En el formato INI, los hosts se listan y se pueden organizar en grupos. También puedes definir variables para hosts o grupos.

Ejemplo /etc/ansible/hosts (formato INI):

[webservers]
web1.example.com
web2.example.com ansible_user=deployer

[databases]
db1.example.com
db2.example.com

[all:vars]
ansible_ssh_private_key_file=~/.ssh/id_rsa
ansible_python_interpreter=/usr/bin/python3

En este ejemplo:

  • [webservers] y [databases] definen grupos.
  • web1.example.com y web2.example.com son hosts dentro del grupo webservers.
  • ansible_user=deployer establece un usuario SSH específico para web2.example.com.
  • [all:vars] define variables que se aplican a todos los hosts en el inventario.

Formato YAML

El formato YAML ofrece más flexibilidad para estructuras de inventario complejas y definiciones de variables.

Ejemplo /etc/ansible/hosts (formato YAML):

all:
  children:
    webservers:
      hosts:
        web1.example.com:
        web2.example.com:
          ansible_user: deployer
    databases:
      hosts:
        db1.example.com:
        db2.example.com:
  vars:
    ansible_ssh_private_key_file: ~/.ssh/id_rsa
    ansible_python_interpreter: /usr/bin/python3

Esta estructura YAML logra la misma agrupación y asignación de variables que el ejemplo INI.

Inventario Dinámico

Los inventarios dinámicos son esenciales para entornos nativos de la nube donde los servidores se aprovisionan y desaprovisionan con frecuencia. Ansible soporta inventarios dinámicos a través de plugins y scripts personalizados.

Usando Plugins de Inventario Dinámico

Ansible viene con una amplia gama de plugins de inventario dinámico integrados para proveedores de nube y servicios populares. Para usar uno, normalmente creas un archivo de configuración de inventario (a menudo en YAML) que especifica el plugin y sus parámetros.

Ejemplo: Configuración de Inventario Dinámico para AWS EC2 (aws_ec2.yml)

plugin: amazon.aws.aws_ec2
regions:
  - us-east-1
  - us-west-2
keyed_groups:
  # Agrupa instancias por sus etiquetas de instancia EC2
  - key: tags
    prefix: tag
filters:
  # Solo incluye instancias que estén en ejecución
  instance-state-name: running
compose:
  # Establece ansible_host a la dirección IP privada
  ansible_host: private_ip_address

Para usar esto con Ansible, ejecutarías un comando como:

ansible-inventory -i aws_ec2.yml --graph

Este comando consultaría a AWS por instancias en ejecución en las regiones especificadas y las mostraría en un gráfico jerárquico basado en sus etiquetas y otros atributos.

Necesitas la colección apropiada instalada para muchos plugins de inventario en la nube. Para AWS EC2, eso generalmente significa amazon.aws, además de credenciales de AWS funcionales en tu entorno, perfil o rol de instancia.

Scripts de Inventario Dinámico Personalizados

Si un plugin integrado no satisface tus necesidades, puedes escribir tu propio script (en Python, por ejemplo) que genere datos de inventario en formato JSON. Este script debe ser ejecutable y devolver un objeto JSON que represente tu inventario.

Ejemplo de script Python (my_dynamic_inventory.py):

#!/usr/bin/env python

import json

# Simula la obtención de datos de inventario
hosts_data = {
    "_meta": {
        "hostvars": {
            "host1.example.com": {"ansible_user": "admin"},
            "host2.example.com": {"ansible_user": "user"}
        }
    },
    "webservers": {
        "hosts": ["host1.example.com", "host2.example.com"]
    },
    "databases": {
        "hosts": ["db1.example.com"]
    }
}

print(json.dumps(hosts_data))

Haz el script ejecutable:

chmod +x my_dynamic_inventory.py

Y luego úsalo con Ansible:

ansible-inventory -i my_dynamic_inventory.py --list

Gestionando el Inventario con ansible-inventory

El comando ansible-inventory es una utilidad poderosa para inspeccionar y gestionar tu inventario. Puede analizar diferentes fuentes de inventario y mostrar los hosts y sus variables asociadas.

Visualizando Hosts Activos

Para ver una lista plana de todos los hosts en tu inventario:

ansible-inventory -i /ruta/a/tu/inventario --list

Este comando generará una estructura JSON que representa todo tu inventario, incluyendo grupos y variables de host.

Agrupando Sistemas

Como se demostró en los ejemplos de inventario estático, la agrupación es esencial para apuntar a conjuntos específicos de máquinas. Puedes crear grupos para diferentes roles (servidores web, bases de datos, servidores de aplicaciones), entornos (producción, staging) o cualquier categorización lógica que tenga sentido para tu infraestructura.

Ansible crea automáticamente grupos basados en tu archivo de inventario. También puedes definir grupos especiales como all (que incluye cada host) y ungrouped (hosts no asignados a ningún grupo específico).

Usando Banderas de Comando de Inventario Integradas

El comando ansible-inventory ofrece varias banderas para una inspección detallada:

  • --graph: Muestra el inventario en un formato de árbol jerárquico, mostrando los grupos y sus miembros.

    ansible-inventory -i /etc/ansible/hosts --graph
    

    Ejemplo de Salida:

    @all
    ├──@databases
    │  ├──db1.example.com
    │  └──db2.example.com
    └──@webservers
       ├──web1.example.com
       └──web2.example.com
    
  • --host <nombrehost>: Muestra todas las variables asociadas con un host específico.

    ansible-inventory -i /etc/ansible/hosts --host web2.example.com
    

    Ejemplo de Salida:

    {
        "ansible_user": "deployer",
        "ansible_ssh_private_key_file": "~/.ssh/id_rsa",
        "ansible_python_interpreter": "/usr/bin/python3"
    }
    
  • --list: Genera todo el inventario en formato JSON. Esto es útil para depurar o integrar con otras herramientas.

    ansible-inventory -i /etc/ansible/hosts --list
    

Consejos y Mejores Prácticas

  • Usa Nombres de Grupo Descriptivos: Haz que los nombres de tus grupos sean intuitivos (ej., production-webservers, staging-appservers).
  • Centraliza las Variables: Define variables comunes en secciones vars a nivel de grupo o de all para evitar la repetición.
  • Aprovecha el Inventario Dinámico: Para entornos de nube o que cambian con frecuencia, el inventario dinámico es imprescindible. Explora los plugins disponibles.
  • Verifica Regularmente el Inventario: Usa ansible-inventory -i inventario.yml --graph para asegurarte de que tu inventario esté estructurado como se espera.
  • Control de Versiones de tu Inventario: Trata tus archivos de inventario estático y scripts de configuración de inventario dinámico como código y almacénalos en un sistema de control de versiones.

Conclusión

Una buena gestión del inventario mantiene a Ansible predecible. Usa archivos estáticos para hosts estables, plugins dinámicos para infraestructura cambiante y ansible-inventory -i <fuente> --graph antes de ejecuciones arriesgadas para detectar agrupaciones incorrectas o hosts faltantes a tiempo.