Dentro de los distintos sistemas de resolución de nombres con lo que contamos en servidores basados en GNU/Linux disponemos del basado en el contenido del fichero /etc/hosts, que en condiciones normales es el primero en comprobarse y utilizarse. Aunque no es habitual introducir en él múltiples datos, sí lo es añadir aquellos que queremos que se resuelvan de forma específica para un servidor en concreto (y con menor latencia al ser un proceso local). Suelen contener, como mínimo, la resolución local (para el nombre localhost, la IP 127.0.0.1) aunque, dependiendo de las necesidades, puede contener más asociaciones nombre-ip. Cuando el número de servidores de tu infraestructura es de cierto tamaño, cambiar un datos de este fichero (o incluso simplemente tener “controlado” su contenido) puede ser un proceso largo y tedioso.
Dentro de nuestra colección de playbooks de Ansible para automatizar la infraestructura IT del centro, tenemos uno, hostsFile.yml, que permite modificar la configuración del fichero /etc/hosts de todos los servidores, excepto aquellos que aparezcan en el grupo nohostsFile (con Ansible, recordemos, esto se realiza de manera centralizada y en un solo paso). Con este playbook podemos modificar todos los servidores, solo uno o un grupo, con el parámetro –limit nombreServidor o nombreGrupo. Como siempre, antes de ejecutar el playbook en cada servidor, se comprueba la sintaxis y, en caso de error, deshace los cambios y continua ejecutando la configuración anterior. Los cambios se realizan modificando unas variables que (a través de un template) terminarán generando el fichero de configuración /etc/hosts para cada servidor. La orden para ejecutar este playbook es: ansible-playbook hostsFile.yml
Las variables se declaran en el fichero general group_vars/all/hostsFile (aunque es posible sobreescribir los valores en los ficheros por grupo o por host, no es lo normal ya que en el fichero general existen variables para grupos y servidores específicos):
- hostsFileGlobal -> Configuración de /etc/hosts para todos los servidores. Se trata de una lista con atributos para definir las entradas del fichero con la IP el nombre completo del servidor (FQDN) y los alias. Cada item de la lista puede tener estos atributos:
- label -> Este atributo tiene una doble función: por un lado servirá de comentario en el fichero, y por otro lado es la clave del item. Esto quiere decir que si más adelante queremos hacer referencia a una entrada (para eliminarla o sobreescribirla), lo haremos por este atributo.
- host -> Se trata de una cadena de texto con el hostname de la entrada. Hay una excepción a la regla: si escribimos la cadena hostname, se escribirá el nombre del servidor (variable inventory_hostname) en la entrada.
-
- IP -> Se trata de una cadena de texto con la dirección IP de la entrada. Este atributo es opcional, si no está definida se obtendrá la cadena del resultado de ejecutar el comando host al nombre del servidor (inventory_hostname).
-
- fqdn -> Se trata de una cadena de texto con el nombre completo de la entrada. Este atributo es opcional, si no está definida se obtendrá la cadena a partir del atributo host más el dominio DNS (variable global domain). Si el atributo host tiene el valor hostname, se obtendrá la cadena del resultado de ejecutar el comando host al nombre del servidor (inventory_hostname).
-
- extra -> Se trata de una cadena de texto con el resto de alias que quieran añadirse en la entrada (si no es suficiente con los campos anteriores). Este atributo es opcional.
Los atributos label y host son obligatorios y deben existir ya que si no la entrada no se pasará al fichero de configuración. Un ejemplo de configuración de esta variable es:
hostsFileGlobal:
- label: Localhost
host: localhost
fqdn: localhost.locadomain
IP: 127.0.0.1
- label: IP local
host: hostname
- hostsFileGroup -> Configuración de /etc/hosts para un grupo específico. Se trata de una lista de variables, cada una de ellas con dos atributos. Un primer atributo llamado group con el nombre del grupo al que se le aplicarán las declaraciones, y otro atributo que incluye las entradas a aplicar (este atributo en en realidad una lista). La lista de entradas incluye para cada item cinco atributos idénticos a los que existían en la variable hostsFileGlobal (label, host, IP, fqdn y extra), y que se comportan de idéntica manera. Podemos sobreescribir o eliminar las entradas globales desde esta variable (en esta lista de entradas por grupo). Para realizar estas operaciones habrá que:
-
- Sobreescribir entradas globales -> Declaramos el atributo label con el mismo texto que el atributo global, y definimos el resto de atributos con los valores que queramos en este caso concreto.
-
- Eliminar entradas globales -> Declaramos el atributo label con el mismo texto que el atributo global, y no declaramos el resto de atributos (no quiero decir que se declaran con valor nulo, sino que en la entrada sólo existirá el atributo ‘label’)
El resto de entradas que se escriban (y no coincida el label con ninguna ‘global’) se añadiran en el fichero a las globales. Ejemplo de configuración:
hostsFileGroup:
- group: serversP1
rules:
- label:alias dns server
host: server_11
IP: 172.20.1.11
- group: serversP2
rules:
- label: alias dns server
host: server_21
IP: 172.20.2.21
- hostsFileHost -> Configuración de /etc/hosts para un servidor específico y al igual que la anterior, es una lista de variables, cada una de ellas con dos atributos, donde el primer atributo (host) se corresponde con el nombre del servidor al que se le aplicarán las declaraciones. El otro incluye las entradas a aplicar y, al igual que ocurre con el segundo atributo de hostsFileGroup, para cada item disponemos de cinco atributos (label, host, IP’, fqdn y extra) que se comportan de idéntica manera. Ejemplo de configuración de esta variable:
HostsFileHost:
- host: ansible_server
rules:
- label:sentinel
host:sentinel
IP: 172.20.1.15
¡Esperamos que os sea útil!