Continuando con mi instalación de Ansible, llegó el momento de configurar el inventario (conjunto de servidores a administrar de forma remota y centralizada) agrupando los hosts de la manera más organizada y conveniente posible. Este artículo explica cómo crear grupos, grupos de grupos (grupos anidados) y variables globales (configuraciones que afecten a todos los hosts del inventario).
Tal como comenté en mi artículo anterior dedicado al inventario de Ansible, voy a organizar mis servidores de acuerdo a su rol (desarrollo, testing, producción) y a su versión de sistema operativo (Debian 7, Debian 8, CentOS 6, etc.). Por ejemplo, el grupo "devel-debian8" contiene todos los servidores de desarrollo que corren Debian 8:
[devel-debian8] db5-devel.linuxito.com ns1d.linuxito.com ns2d.linuxito.com
A su vez, el grupo "devel-debian7" contiene todos los servidores de desarrollo que corren Debian 7. Sin embargo, me gustaría contar también con un grupo que contenga todos los servidores de desarrollo que corren Debian a secas (sin importar la versión). Para ello es posible definir grupos de grupos (es decir, anidar grupos dentro de otros) utilizando la palabra clave "children" en el nombre del grupo. Por ejemplo, defino el grupo "devel-debian":
[devel-debian8] db5-devel.linuxito.com ns1d.linuxito.com ns2d.linuxito.com [devel-debian7] www-devel.linuxito.com proxy-devel.linuxito.com smb-devel.linuxito.com db2-devel.linuxito.com db-devel.linuxito.com [devel-debian:children] devel-debian7 devel-debian8
De esta forma, el grupo "devel-debian" engloba todos los hosts contenidos en los grupos "devel-debian7" y "devel-debian8".
Por otro lado, es posible notar que en cada host he omitido la configuración de puerto de SSH y nombre de usuario con el cual autenticar. Esto se debe a que he incluido tal información de manera global. En mi granja, Ansible autenticará en todos los servidores utilizando el mismo puerto y nombre de usuario.
Para definir variables a nivel grupo, es posible recurrir al identificador "vars". Por ejemplo es posible definir el puerto y nombre de usuario para todos los hosts del grupo "devel-debian8" de la siguiente forma:
[devel-debian8] db5-devel.linuxito.com ns1d.linuxito.com ns2d.linuxito.com [devel-debian8:vars] ansible_port=2222 ansible_user=ansible
Así se evita repetir la configuración en cada línea, cuando esta es idéntica entre todos los hosts del grupo:
[devel-debian8] db5-devel.linuxito.com ansible_port=2222 ansible_user=ansible ns1d.linuxito.com ansible_port=2222 ansible_user=ansible ns2d.linuxito.com ansible_port=2222 ansible_user=ansible
Pero además, es posible definir variables globales (que afecten a todos los hosts) recurriendo al grupo reservado "all":
[all:vars] ansible_port=2222 ansible_user=ansible
Esto es práctico para los casos en que todos los hosts poseen la misma configuración (escenario típico en clusters y granjas de servidores).
La configuración de mi inventario hasta el momento es la siguiente:
[devel-debian8] db5-devel.linuxito.com ns1d.linuxito.com ns2d.linuxito.com [devel-debian7] www-devel.linuxito.com proxy-devel.linuxito.com smb-devel.linuxito.com db2-devel.linuxito.com db-devel.linuxito.com [devel-debian:children] devel-debian7 devel-debian8 [devel-centos7] template.linuxito.com [devel-centos6] db3-devel.linuxito.com webapp-backend.linuxito.com webapp-db.linuxito.com webapp-frontend.linuxito.com www2.linuxito.com [devel-centos:children] devel-centos6 devel-centos7 [all:vars] ansible_port=2222 ansible_user=ansible
Por otro lado, Ansible califica los nombres de hosts, en caso de no poseer un nombre de host FQDN, de acuerdo a la configuración de dominio presente en el sistema operativo donde corre. Esto significa que es posible utilizar el nombre de host "db3-devel", y Ansible automáticamente calificará el nombre agregando el dominio "linuxito.com" (si así está configurado el host donde se ha instalado) resultando "db3-devel.linuxito.com".
Referencias