Как работают обработчики (handlers) в Ansible?

«Как работают обработчики (handlers) в Ansible?» — вопрос из категории Ansible, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Обработчики (handlers) в Ansible — это специальные задачи, которые выполняются только один раз в конце плейбука, и только если какая-либо из обычных задач, уведомившая их, привела к изменению состояния системы (changed: true). Их основное назначение — перезапуск служб или применение конфигураций после их модификации.

Ключевые особенности:

  • Объявляются в секции handlers: плейбука или роли.
  • Вызываются из задачи с помощью директивы notify: <имя обработчика>.
  • Порядок выполнения по умолчанию соответствует порядку объявления, но его можно контролировать через механизм listen.

Пример: Обновление конфигурации Nginx и перезапуск

---
- hosts: webservers
  tasks:
    - name: Deploy new Nginx configuration
      ansible.builtin.template:
        src: nginx.conf.j2
        dest: /etc/nginx/nginx.conf
      notify: "restart nginx service" # Уведомление обработчика

  handlers:
    - name: restart nginx service
      ansible.builtin.service:
        name: nginx
        state: restarted

Важные нюансы:

  • Если задача Deploy new Nginx configuration не изменит файл на целевой системе (он уже актуален), обработчик не сработает.
  • Даже если несколько задач уведомят один и тот же обработчик, он выполнится единожды.
  • Для принудительного запуска обработчика можно использовать флаг --force-handlers или мета-задачу meta: flush_handlers.
  • Группировка через listen позволяет нескольким обработчикам реагировать на одно событие:
    handlers:
    - name: restart web stack
      listen: "restart services"
      service:
        name: "{{ item }}"
        state: restarted
      loop: [ nginx, php-fpm ]