Introducción
En Ansible, los manejadores (handlers) son una característica poderosa que permite ejecutar tareas específicas en respuesta a cambios en el estado del sistema. Los manejadores se utilizan comúnmente para reiniciar servicios, recargar configuraciones o realizar cualquier acción que deba ejecutarse solo cuando se detecta un cambio.
Conceptos Clave
- Manejador (Handler): Una tarea especial que se ejecuta solo cuando es notificada por otra tarea.
- Notificación (Notify): Una instrucción en una tarea que indica que un manejador debe ejecutarse si la tarea cambia el estado del sistema.
Estructura de un Manejador
Un manejador se define de manera similar a una tarea regular en un playbook, pero se coloca bajo la sección handlers
. Aquí hay un ejemplo básico:
--- - name: Ejemplo de Playbook con Manejadores hosts: localhost tasks: - name: Crear un archivo de configuración copy: src: /path/to/source/file dest: /path/to/destination/file notify: Reiniciar servicio handlers: - name: Reiniciar servicio service: name: my_service state: restarted
Explicación del Código
-
Definición del Playbook:
name
: Nombre descriptivo del playbook.hosts
: Define los hosts en los que se ejecutará el playbook (en este caso,localhost
).
-
Tareas:
name
: Nombre descriptivo de la tarea.copy
: Módulo de Ansible que copia un archivo desde una ubicación de origen a una ubicación de destino.notify
: Instrucción que notifica al manejadorReiniciar servicio
si la tarea cambia el estado del sistema (por ejemplo, si el archivo se copia correctamente).
-
Manejadores:
name
: Nombre del manejador.service
: Módulo de Ansible que gestiona servicios del sistema.name
: Nombre del servicio que se va a gestionar.state
: Estado deseado del servicio (restarted
en este caso).
Ejemplo Práctico
Vamos a crear un playbook más completo que incluye un manejador para reiniciar un servicio web cuando se actualiza su archivo de configuración.
--- - name: Configurar y Reiniciar Servicio Web hosts: webservers become: yes tasks: - name: Copiar archivo de configuración de Nginx copy: src: /path/to/nginx.conf dest: /etc/nginx/nginx.conf notify: Reiniciar Nginx handlers: - name: Reiniciar Nginx service: name: nginx state: restarted
Explicación del Código
-
Definición del Playbook:
name
: Nombre descriptivo del playbook.hosts
: Define los hosts en los que se ejecutará el playbook (webservers
en este caso).become
: Escalado de privilegios para ejecutar tareas como superusuario.
-
Tareas:
name
: Nombre descriptivo de la tarea.copy
: Módulo de Ansible que copia un archivo desde una ubicación de origen a una ubicación de destino.notify
: Instrucción que notifica al manejadorReiniciar Nginx
si la tarea cambia el estado del sistema (por ejemplo, si el archivo se copia correctamente).
-
Manejadores:
name
: Nombre del manejador.service
: Módulo de Ansible que gestiona servicios del sistema.name
: Nombre del servicio que se va a gestionar (nginx
en este caso).state
: Estado deseado del servicio (restarted
en este caso).
Ejercicio Práctico
Ejercicio
Crea un playbook que realice las siguientes acciones:
- Instale el paquete
httpd
(Apache) en un servidor. - Copie un archivo de configuración personalizado para Apache.
- Reinicie el servicio
httpd
solo si el archivo de configuración se ha copiado correctamente.
Solución
--- - name: Instalar y Configurar Apache hosts: webservers become: yes tasks: - name: Instalar paquete httpd yum: name: httpd state: present - name: Copiar archivo de configuración de Apache copy: src: /path/to/httpd.conf dest: /etc/httpd/conf/httpd.conf notify: Reiniciar Apache handlers: - name: Reiniciar Apache service: name: httpd state: restarted
Explicación del Código
-
Instalar paquete httpd:
- Utiliza el módulo
yum
para instalar el paquetehttpd
.
- Utiliza el módulo
-
Copiar archivo de configuración de Apache:
- Utiliza el módulo
copy
para copiar el archivo de configuración desde una ubicación de origen a/etc/httpd/conf/httpd.conf
. - Notifica al manejador
Reiniciar Apache
si la tarea cambia el estado del sistema.
- Utiliza el módulo
-
Reiniciar Apache:
- Define un manejador que utiliza el módulo
service
para reiniciar el serviciohttpd
.
- Define un manejador que utiliza el módulo
Conclusión
Los manejadores en Ansible son una herramienta esencial para ejecutar tareas condicionales basadas en cambios en el estado del sistema. Al utilizar manejadores, puedes asegurarte de que ciertas acciones, como reiniciar servicios, solo se ejecuten cuando sea necesario, mejorando así la eficiencia y la fiabilidad de tus playbooks.
En el siguiente tema, exploraremos las plantillas en Ansible, que te permitirán generar archivos de configuración dinámicos y personalizados.
Ansible: De Principiante a Avanzado
Módulo 1: Introducción a Ansible
Módulo 2: Conceptos Básicos de Ansible
Módulo 3: Playbooks
- Introducción a los Playbooks
- Escribiendo tu Primer Playbook
- Estructura del Playbook
- Variables y Hechos
- Condicionales y Bucles
Módulo 4: Roles
Módulo 5: Técnicas Avanzadas de Playbook
Módulo 6: Ansible Galaxy
Módulo 7: Ansible Tower
- Introducción a Ansible Tower
- Instalando Ansible Tower
- Usando Ansible Tower
- Gestionando Proyectos e Inventarios
Módulo 8: Ansible para DevOps
Módulo 9: Mejores Prácticas de Ansible
- Organización del Código
- Mejores Prácticas de Seguridad
- Ajuste de Rendimiento
- Pruebas de Código Ansible