Для чего в Ansible используются handlers?

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

Ответ

Handlers в Ansible — это специальные задачи, которые выполняются только один раз в конце выполнения плейбука, и только если их вызвали (notify) другие задачи, которые привели к изменению состояния системы (changed). Это идеально для операций, которые не нужно выполнять при каждом прогоне, например, перезагрузка сервиса.

Практический пример из конфигурации веб-сервера:

---
- name: Configure Nginx
  hosts: webservers
  tasks:
    - name: Copy Nginx configuration template
      ansible.builtin.template:
        src: nginx.conf.j2
        dest: /etc/nginx/nginx.conf
      notify: Reload Nginx  # Хендлер будет вызван ТОЛЬКО если файл конфига изменился

    - name: Ensure Nginx is running
      ansible.builtin.service:
        name: nginx
        state: started

  handlers:
    - name: Reload Nginx
      ansible.builtin.service:
        name: nginx
        state: reloaded  # Используем reload, а не restart, чтобы не обрывать соединения

Ключевые особенности и почему они важны:

  • Идемпотентность: Хендлер гарантирует, что сервис перезагрузится лишь при реальном изменении конфига, а не при каждом запуске плейбука.
  • Отложенное выполнение: Все уведомления собираются, и хендлеры запускаются после всех обычных задач в плейбуке, даже если были вызваны несколько раз.
  • Явный триггер: Хендлер выполняется только по явному notify. Если задача не в состоянии changed, уведомления не происходит.

В своей практике я часто использую handlers для systemctl reload, haproxy -sf, или отправки сигналов приложениям после обновления конфигурационных файлов.