Ответ
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, или отправки сигналов приложениям после обновления конфигурационных файлов.