En Ansible, un patrón de host es una forma de especificar qué hosts (servidores) serán afectados por un playbook o tarea. Los patrones de host te permiten dirigirte a un solo servidor, a un grupo de servidores, o a servidores que cumplen con ciertos criterios, lo que facilita la administración de infraestructuras de gran escala.
Los hosts y grupos de servidores se definen en un archivo de inventario de Ansible, y los patrones te permiten elegir de manera flexible qué servidores ejecutar las tareas.
Antes de hablar de los patrones de host, es importante ver cómo se estructuran los archivos de inventario de Ansible. Un archivo de inventario básico puede verse así:
[webservers]
web1.example.com
web2.example.com
[dbservers]
db1.example.com
db2.example.com
En este ejemplo, hay dos grupos de servidores: webservers
y dbservers
.
Cuando ejecutas un playbook en Ansible, defines a qué hosts se aplicará mediante patrones. Estos patrones pueden ser tan simples o complejos como sea necesario. Aquí tienes algunos ejemplos de cómo utilizarlos:
Si solo deseas ejecutar el playbook en un servidor específico, puedes especificar su nombre directamente:
- hosts: web1.example.com
tasks:
- name: Verificar conexión
ping:
Para ejecutar un playbook en todos los servidores dentro de un grupo, puedes especificar el nombre del grupo definido en tu archivo de inventario:
- hosts: webservers
tasks:
- name: Instalar nginx
apt:
name: nginx
state: present
Este playbook instalará nginx
en todos los servidores dentro del grupo webservers
.
Puedes ejecutar un playbook en múltiples grupos de servidores al mismo tiempo usando el símbolo de dos puntos (:
):
- hosts: webservers:dbservers
tasks:
- name: Actualizar todos los paquetes
apt:
upgrade: dist
Aquí, el playbook se ejecutará tanto en los servidores webservers
como en los dbservers
.
Puedes excluir ciertos servidores o grupos de un patrón de host utilizando el símbolo de exclamación (!
). Esto te permite aplicar el playbook a todos los servidores menos a los que excluyas:
- hosts: webservers:!web2.example.com
tasks:
- name: Reiniciar los servidores web
service:
name: nginx
state: restarted
En este caso, se reiniciará nginx
en todos los servidores del grupo webservers
, excepto web2.example.com
.
Ansible también soporta patrones con comodines. Esto es útil cuando los servidores siguen un patrón de nombres similar:
- hosts: web*.example.com
tasks:
- name: Verificar conexión a todos los servidores web
ping:
Este patrón afectará a todos los servidores cuyo nombre comience con "web", como web1.example.com
y web2.example.com
.
Ansible permite seleccionar un subconjunto de hosts en función de su posición en el archivo de inventario. Esto puede ser útil cuando necesitas distribuir la carga de trabajo:
- hosts: webservers[0:1]
tasks:
- name: Ejecutar tarea en los dos primeros servidores web
ping:
Este playbook solo se ejecutará en los dos primeros servidores del grupo webservers
.
Los patrones de host en Ansible también permiten combinar operadores lógicos para realizar selecciones más complejas. Por ejemplo, puedes usar el operador &
(AND) para seleccionar servidores que pertenezcan a múltiples grupos:
- hosts: webservers&dbservers
tasks:
- name: Ejecutar tarea en servidores que son web y base de datos
ping:
Este playbook solo se ejecutará en los servidores que pertenezcan a ambos grupos, webservers
y dbservers
.
Aquí tienes un ejemplo de cómo combinar varios patrones de host en un solo playbook para gestionar diferentes servidores de manera flexible:
- hosts: webservers:!web2.example.com&dbservers
tasks:
- name: Actualizar paquetes en servidores web excepto web2 y que también son bases de datos
apt:
upgrade: dist
Este playbook se ejecutará solo en servidores que pertenezcan tanto a webservers
como a dbservers
, pero excluyendo web2.example.com
.
El uso de patrones de host en Ansible te permite seleccionar de manera precisa los servidores en los que deseas ejecutar tus playbooks, lo que es esencial para administrar grandes infraestructuras. Puedes dirigirte a grupos, combinarlos, excluir servidores, o usar comodines y operadores lógicos para crear patrones complejos, asegurando que las tareas se apliquen de manera eficiente y segura en los servidores adecuados.
Para más detalles, visita la documentación oficial de Ansible sobre patrones de host.
Jorge García
Fullstack developer