Get it on Google Play
Tu partner Freelance para tus proyectos IT

Inventarios dinámicos en Ansible y con ejemplo con contenedores Docker

24-07-2020
Ansible dynamic inventory

Ansible dynamic inventory

Esta semana hemos hecho otra formación Ansible Online cerrada a un equipo de una gran(histórica) multinacional tecnológica(Disculpad que nunca de nombre pero tengo una legión de comerciales siguiendome para cazar mis clientes, todos me critican, pero si todos me copian y persiguen es que…).

El tema es que ha funcionado muy bien y mucha gente ha preguntado si se podía apuntar, lamentablemente no ha podido ser. Pero aquí os traigo un ejemplo de un inventario dinámico que si lo sumáis a los artículos y vídeos “Formación Ansible: Instalación y primeros pasos“, “Despliegue automático DevOps de aplicaciones con Ansible y Clouding.io
“, “Ansible automation script: Videoconferencias y formación online con Jitsi
” creo que aprenderéis mucho.

Inventarios en Ansible

Los inventarios representan el conjunto de máquinas que Ansible va a gestionar automaticamente mediante los playbooks. En los inventarios además de especificar el listado de máquinas también podemos clasificarlas en grupos(Por ejemplo, maquinas de frontend, de BBDD, de Backups, etc.) y especificarles variables personalizadas por grupo o máquina concreta. Un buen diseño del inventario hará que nuestras automatizaciones(A través de ‘playbooks’) sean mucho mas sencillas.

Existen dos tipos de inventarios, los mas habituales son los inventarios estáticos que ya se han visto en los artículos de arriba. Estos son un fichero de texto donde uno detalla a mano estos servidores, sus agrupaciones y las variables que los configuran.

En determinadas ocasiones se necesita que este inventario no venga de un fichero estático, por ejemplo, ahora que se hace todo en el cloud y que existen contenedores o máquinas volátiles que pueden desaparecer y aparecer en cualquier momento. En esto casos es mas fácil crear un script que lea dinámicamente esta configuración.

En Ansible podemos crear estos scripts en cualquier lenguage(bash, python, javascript,etc.) y debe devolver un fichero en formato JSON donde tengamos las distintas máquinas con la misma información(Pero distinto formato).

Inventario dinámico para Ansible

El siguiente script bash, llamado ‘inventory.sh’, lee de Docker todos los contenedores que tenemos funcionando y genera el fichero de inventario JSON:

#!/bin/bash

hosts=$(docker inspect -f '"{{.NetworkSettings.IPAddress }}",' $(docker ps -q));
hostvars=$(docker inspect -f '"{{.NetworkSettings.IPAddress }}": {},' $(docker ps -q));

echo '{
    "group001": {
        "hosts": ['

echo "${hosts%?}"

echo '               ],
        "vars": {
            "ansible_ssh_user": "root"
            }
        },
    "_meta": {
        "hostvars": {'

echo "${hostvars%?}"

echo '       }
        }
    }'

Después podemos usarlo para ejecutar playbooks como si de un inventario estático se tratara:

ansible-playbook -i inventory.sh mi-playbook.yml

Para hacerlo un poco mas óptimo las últimas versiones de Ansible admiten pesarle los parámetros: ‘–list’ para que todo el fichero JSON o ‘–host ‘ para que solo devuelve un objeto JSON con las variables de dicho host. Por si queréis hacerlo mas inteligente.

Como veis es muy simple de implementar y adaptar a cualquier necesidad.

Si te ha servido, por favor comparte

Interesado en formación Docker?

 

Leave a Reply