Con Ansible podemos administrar diferentes infraestructuras en diferentes entornos, para ello deberemos tener un inventario de los nodos a administrar.

Como se había mencionado en el capitulo anterior, los nodos se definen en /etc/ansible/hosts pero con la opción --inventory o -i podemos especificar otro fichero que contenga una lista de los diferentes nodos.

El formato de estos ficheros debe de ser siguiendo la nomenglatura de YAML (YALM Ain't Markup Language) por lo que deberéis de revisar como funciona a nivel de sintaxis.

Inventario

Generalmente vamos a encontrar que tendemos muchos servidores que administrar y tendremos que hacer un pequeño "inventario". Cuando en Ansible hablamos del Inventario nos referimos a esas IP’s, hosts o máquinas que estamos gestionando y que hacemos un listado de todas ellas.

Si tenemos cuatro servidores en nuestra infraestructura donde dos son servidores web y otros dos son servidores de correo, nuestro inventario constará de esas cuatro máquinas. Y las podremos apuntar en el inventario por su IP o por el nombre de dominio principal -o incluso rangos, pero todo a su tiempo-. Además podremos hacer dos grupos, el grupo de los servidores web y el grupo de los servidores de correo.

Además dentro del inventario podemos agrupar los nodos en grupos y los grupos en grupos superiores. La definición de un grupo se define utilizando los corchetes y la lista de servidores que pertenecen a ese grupo justo debajo.

Los grupos son útiles para agrupar servidores con cierta afinidad:

  • Geograficamente: Madrid, Alemania, Datacenter1, etc
  • Aplicación que sirven: webs, bases de datos, nodejs, backup, etc
  • Tipo de sistema operativo: GNU/Linux, Windows, FreeBSD, Solaris, etc
  • Entorno del nodo: producción, desarrollo, escenario, etc
  • Y más...

Configurar inventario en Ansible

Como hemos mencionado anteriormente, se pueden agrupar en diferentes formas y vamos a ver diferentes ejemplos de lo mencionado.

Imaginemos que en nuestro Inventario tenemos lo siguiente:

nodo1.tuto.top
nodo2.tuto.top
nodo3.tuto.top
nodo4.tuto.top

Esto significa que en nuestro inventario tenemos 4 máquinas sin agrupar. Pero podemos tenerlo separado en grupos:

[web]
nodo1.tuto.top
nodo2.tuto.top
[bd]
nodo3.tuto.top
[correo]
nodo4.tuto.top

En este caso tenemos tres grupos, uno con dos servidores web, uno con un servidor de bases de datos y otro con otro servidor para el correo.

Y el nombre del nodo se puede poner ya sea con un subdominio que apunte a él o bien directamente con la IP.

Pero imaginemos que tenemos 4 servidores para bases de datos, dos servidores web y uno de correo. ¿Seria necesario hacer esto?:

db1.tutos.top
db2.tutos.top
db3.tutos.top
db4.tutos.top
web1.tutos.top
web2.tutos.top
mail.tutos.top

Pues si, puedes listar tu inventario de esta manera sin ningún problema. Pero quizás, si tienes muchas más maquinas que esas, sea un poco rollazo tener que escribir todos los hosts ¿Verdad? Pues en el Inventario de Ansible permite configurar rangos y podemos representar en una sola línea 4 maquinas:

db[1:4].voidnull.es
web[1:2].voidnull.es
mail.voidnull.es

¿Mola, verdad?

Definir variables a los nodos

A un nodo especifico se le puede definir diferentes parámetros para utilizar durante la automatización de tareas.

Dichas variables pueden ser (las más utilizadas):

  • ansible_user: Permite definir el usuario con el que nos conectaremos al nodo.
  • ansible_host: Permite definir la IP con la que conectarse al nodo.
  • ansible_port: Permite definir el puerto de acceso.
  • ansible_ssh_pass: Permite definir la contraseña para la conexión por SSH (no recomendado por motivos de seguridad).
  • ansible_become: Permite definir si debe de utilizar sudo para ejecutar las tareas.
  • ansible_connection: Permite definir el tipo de conexión (SSH, local, docker)
  • ansible_become_method: Permite definir el método a utilizar para escalar permisos (sudo, su, pbrun, pfexex, doas, dzdo, ksu)
  • ansible_become_user: Permite definir el usuario a utilizar para escalar los permisos.

Es posible definir estos parámetros directamente en nuestro inventario de la siguiente forma:

[web]
node1.tutos.top
[webs:vars]
ansible_port:2244
ansible_user:voidnull
[database]
node.tutos.top

Tanto los nodos como las variables de grupo se pueden separar en diferentes ficheros, y deben de seguir estra estructura:

/inventario/prod/servidores
/inventario/prod/host_vars
/inventario/prod/host_vars/all.yml
/inventario/prod/host_vars/nodo1.yml
/inventario/prod/host_vars/nodo2.yml
/inventario/prod/group_vars
/inventario/prod/group_vars/all.yml
/inventario/prod/group_vars/web.yml
/inventario/prod/group_vars/database.yml

Por ejemplo en /inventario/prod/hosts_vars/all.yml podemos definir una variable llamada entorno:

entorno: prod

Y en /inventario/prod/hosts_vars/nodo1.yml podemos definir lo siguiente:

ansible_host: 192.168.1.23
ansible_port: 2244
ansible_user: voidnull

Inventario en formato YAML

A partir de la versión 2.4 de Ansible es posible definir el inventario en formato YAML, por ejemplo:

webs:
  hosts:
    node1.tutos.top
    node2.tutos.top
  vars:
    entorno: prod
    ansible_user: voidnull
all:
  vars:
    ansible_port: 22

Y eso es todo, una vez tengas configurado tu inventario, es momento de empezar con algunos comandos básicos.

Haz que cada palabra cuente: tu donación nos inspira a seguir creando contenido. Accede al apartado de Donación para hacer tu aportación