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


Tal vez pueda interesarte


Compartí este artículo