Handlers y Notificaciones en Ansible

Cuando automatizamos tareas con Ansible, a menudo necesitamos ejecutar acciones solo cuando ocurre un cambio en la configuración. Para esto, Ansible nos proporciona los Handlers, que son tareas especiales que se ejecutan solo cuando un cambio lo requiere.

En este artículo, exploraremos qué son los Handlers, cómo definirlos y cuándo usarlos en nuestros playbooks.


1. ¿Qué son los Handlers en Ansible?

Los Handlers son similares a las tareas normales, pero solo se ejecutan si han sido notificados por otra tarea que haya realizado un cambio.

Ejemplo de un Handler

- name: Instalar y configurar Apache
  hosts: nodos_web
  become: yes
  tasks:
    - name: Instalar Apache
      apt:
        name: apache2
        state: present
      notify: Reiniciar Apache

  handlers:
    - name: Reiniciar Apache
      service:
        name: apache2
        state: restarted

Aquí, el Handler Reiniciar Apache solo se ejecutará si la tarea de instalación de Apache ha realizado un cambio, como instalar el paquete por primera vez.

2. Cómo funcionan los Handlers en Ansible

Notificaciones

Para que un Handler se ejecute, una tarea debe notificarlo usando notify. Si varias tareas notifican al mismo Handler, se ejecutará solo una vez al final del playbook, evitando reinicios innecesarios.

Ejemplo con múltiples tareas notificando al mismo Handler:

- name: Configurar Apache y su puerto
  hosts: nodos_web
  become: yes
  tasks:
    - name: Instalar Apache
      apt:
        name: apache2
        state: present
      notify: Reiniciar Apache

    - name: Modificar el puerto de Apache
      lineinfile:
        path: /etc/apache2/ports.conf
        regexp: '^Listen '
        line: 'Listen 8080'
      notify: Reiniciar Apache

  handlers:
    - name: Reiniciar Apache
      service:
        name: apache2
        state: restarted

En este caso, si se instalan Apache y se modifica su puerto, el Handler solo reiniciará Apache una vez al final.

3. Handlers en Roles de Ansible

Si usamos roles, podemos definir los Handlers en roles/mi_rol/handlers/main.yml para una mejor organización.

# roles/apache/handlers/main.yml
- name: Reiniciar Apache
  service:
    name: apache2
    state: restarted

Y en las tareas del rol (roles/apache/tasks/main.yml):

- name: Instalar Apache
  apt:
    name: apache2
    state: present
  notify: Reiniciar Apache

De esta manera, podemos reutilizar Handlers en múltiples playbooks.


Los Handlers en Ansible son una herramienta poderosa para evitar acciones innecesarias y optimizar la automatización. Gracias a ellos, podemos asegurarnos de que los cambios importantes se apliquen de manera eficiente y ordenada.

En el próximo post, hablaremos sobre Templates y Jinja2 en Ansible y cómo generar archivos de configuración dinámicos. 🚀