Descubriendo el inventario
Objetivos del capítulo y requisitos
En el capítulo anterior, vio cómo se instalaba Ansible y cómo ejecutar algunos comandos en la máquina local. Ahora verá como enviar sus acciones a distintas máquinas y beneficiarse de la capacidad de ejecución de operaciones en paralelo de Ansible.
1. Contexto y requisitos
Los ejemplos que se tratarán en este capítulo darán por sentado que:
-
dispone de máquinas Linux en las que ha efectuado el intercambio de clave SSH (ver capítulo Iniciarse en Ansible);
-
dispone de permisos root en las máquinas.
2. Archivos descargables
Puede encontrar los ejemplos de los directorios inventarios y variables en el archivo comprimido capitulo-03.tar.gz que se encuentra en la página del libro en el sitio de Ediciones ENI.
Estructura de un inventario
El inventario en Ansible es un archivo de formato INI. La declaración de un grupo se hace usando el nombre del grupo entre corchetes. Las máquinas vinculadas a este grupo están simplemente incluidas después de la declaración del grupo (una máquina por cada línea).
Tome un ejemplo con los elementos siguientes:
-
un grupo apache compuesto por la máquina rec-apache-1;
-
un grupo mysql con la máquina rec-mysql-1.
Aquí abajo encontrará un archivo de inventario que corresponde a esta declaración:
[apache]
rec-apache-1
[mysql]
rec-mysql-1
Tenga en cuenta que es posible almacenar esta declaración bajo la forma de un archivo YAML. En este caso, la declaración tendrá la forma siguiente:
apache:
hosts:
rec-apache-1: {}
mysql:
hosts:
rec-mysql-1: {}
A partir de ahora, el archivo se llamará archivo de host o archivo de inventario. Se podrá acceder a él bajo el nombre receta.inv (en formato INI) o receta.yml (en formato YAML).
Para llamarlo, habrá que utilizar la opción -i en el comando ansible con el nombre del archivo.
Con el fin de comprobar que la comunicación con las máquinas remotas funciona correctamente, puede ejecutar ansible con el módulo ping (utilizando el nombre del módulo con la opción -m).
He aquí un ejemplo del comando usando un inventario YAML:
$ ansible -i receta.yml -m ping all
Si todo va bien, Ansible debería darnos el resultado siguiente:
rec-mysql-1 | SUCCESS => {
"changed": false,
"ping": "pong"
}
rec-apache-1 | SUCCESS => {
"changed": false,
"ping": "pong"
}
1. Grupos por defecto
Además de los que declara en su inventario, existen dos grupos más: all y ungrouped. El primero contiene todas las máquinas del inventario. Las máquinas que no están vinculadas a ningún grupo (es el caso de localhost si no lo declara en su inventario) formarán parte del grupo ungrouped.
Una manera simple de consultar esta lista es a través del comando...
Fusión de inventarios
Ansible es capaz de fusionar distintos archivos de inventarios que se encuentren en el mismo directorio. El problema de esta técnica es que no es posible controlar los archivos que se utilizan como parámetro en Ansible a no ser que se copien temporalmente los archivos en el directorio de trabajo. El problema es exactamente el mismo en el caso de que los archivos se encuentren en directorios diferentes.
Las versiones recientes de Ansible permiten acumular en la línea de comando la lista de los inventarios. De este modo, en lugar de enviar una ubicación donde están almacenados los archivos de inventarios, se pueden llamar uno a uno usando la opción --inventory (o -i).
Por lo tanto, para ejecutar el módulo ping en el conjunto de las máquinas de los inventarios receta.yml y produccion.yml, el comando que se tiene que ejecutar sería:
$ ansible -m debug -I receta.yml -I produccion.yml all
Aquí encontrará el resultado del comando:
prod-haproxy | SUCCESS => {
"msg": "Hello world!"
}
...
active-directory-1 | SUCCESS => {
"msg": "Hello world!"
}
container-1 | SUCCESS => {
"msg": "Hello world!"
}