Ответ
Обработчики (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 ]