Gestión de Handlers en Ansible

---
- hosts: servidores_web
  handlers:
  - name: reiniciar nginx
    service: name=nginx state=restarted
  tasks:
    - name: Actualizar caché de paquetes
      apt: update_cache=yes cache_valid_time=3600
    - name: Instalar servidor web nginx
      apt: name=nginx state=present
    - name: Activar servicio nginx al inicio
      service: name=nginx enabled=yes
    - name: Configurar módulo SSL
      lineinfile:
        path: /etc/nginx/nginx.conf
        regexp: '^# ssl'
        line: 'ssl on'
      notify: reiniciar nginx

Handlers Encadenados

---
- hosts: servidores_web
  handlers:
  - name: reiniciar nginx
    service: name=nginx state=restarted
    notify: reiniciar redis
  - name: reiniciar redis
    service: name=redis-server state=restarted
  tasks:
    - name: Actualizar caché de paquetes
      apt: update_cache=yes
    - name: Instalar nginx
      apt: name=nginx state=present
    - name: Habilitar nginx
      service: name=nginx enabled=yes
    - name: Configurar virtual host
      template:
        src: plantillas/default.j2
        dest: /etc/nginx/sites-available/default
      notify: reiniciar nginx

    - name: Instalar redis
      apt: name=redis-server state=present
    - name: Iniciar redis
      service: name=redis-server enabled=yes state=started
    - name: Crear directorio de configuración
      file:
        path: /etc/redis/
        state: directory
        mode: '0750'
    - name: Desplegar configuración redis
      template:
        src: plantillas/redis.conf.j2
        dest: /etc/redis/redis.conf
        mode: '0640'
      changed_when: true
      notify:
        - reiniciar nginx

    - name: Instalar herramientas
      apt: 
        name: 
          - curl
          - wget
        state: present

Flush Handlers

---
- hosts: servidores_web
  handlers:
  - name: recargar nginx
    service: name=nginx state=reloaded
  - name: reiniciar redis
    service: name=redis-server state=restarted
  tasks:
    - name: Instalar nginx
      apt: name=nginx state=present
    - name: Actualizar configuración principal
      copy:
        src: archivos/nginx.conf
        dest: /etc/nginx/nginx.conf
      notify: recargar nginx

    - name: Ejecutar handlers inmediatamente
      meta: flush_handlers

    - name: Instalar aplicación
      apt: name=htop state=present

Handlers con Bloques de Manejo de Errores

---
- hosts: servidores_web
  handlers:
  - name: reiniciar servicio web
    service: name=nginx state=restarted
  tasks:
    - block:
        - name: Tarea potencialmente fallida
          command: /usr/bin/false
          notify: reiniciar servicio web
      rescue:
        - name: Recuperar del fallo
          command: /usr/bin/true
          notify: reiniciar servicio web
      always:
        - meta: flush_handlers

    - name: Instalar utilidades adicionales
      apt: 
        name: tree
        state: present

Conceptos Clave de los Handlers:

Los handlers en Ansible son tareas especiales que solo se ejecutan cuando son notificados por otra tarea. Se ejecutan al final de todos los playbooks, a manos que se utilice meta: flush_handlers.

Características principales:

  • Un handler se ejecuta solo si la tarea que lo notifica cambia el estado
  • Los handlers se ejecutan una sola vez por playbook, incluso si son notificados múltiples veces
  • Se pueden encadenar handlers notificando desde un handler a otro
  • Usar meta: flush_handlers fuerza la ejecución inmediata de los handlers pendientes
  • Los handlers no se ejecutan si la tarea que los notifica es omitida por condiciones

Estas características hacen que los handlers sean ideales para reiniciar servicios cuando cambian archivos de configuración, evitar reinicios innecesarios y mantener el orden de ejecución en despliegues complejos.

Etiquetas: Ansible DevOps automation configuration-management YAML

Publicado el 8-17 10:22