Ответ
notify в Ansible — это директива внутри задачи (task), которая объявляет обработчик (handler) для запуска. Обработчик — это специальная задача, которая выполняется только один раз в конце плейбука, и только если задача, объявившая notify, изменила состояние системы (changed). Это ключевой механизм для идемпотентности и перезапуска служб после конфигурационных изменений.
Как это работает:
- Задача изменяет конфигурационный файл и уведомляет обработчик с именем
Restart Nginx. - Ansible запоминает этот вызов.
- В конце выполнения всех задач плейбука Ansible запускает обработчик
Restart Nginx(даже если его уведомили несколько раз).
Пример из практики (обновление конфига и перезапуск Nginx):
---
- name: Configure web server
hosts: webservers
tasks:
- name: Copy Nginx configuration template
ansible.builtin.template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
notify: Restart Nginx # ОБЪЯВЛЕНИЕ обработчика
handlers:
- name: Restart Nginx
ansible.builtin.systemd:
name: nginx
state: restarted
# Этот handler выполнится ТОЛЬКО если задача выше изменила файл
Ключевые особенности для DevOps:
- Идемпотентность: Обработчик не сработает, если конфиг не изменился, и служба не будет перезапущена без необходимости.
- Порядок выполнения: Обработчики выполняются в порядке их объявления в плейбуке, но только после всех обычных задач.
- Принудительный запуск: Можно принудительно запустить все обработчики с флагом
--force-handlersили конкретный обработчик как обычную задачу. - Listen (прослушивание): Обработчики могут "слушать" общие темы, что позволяет нескольким задачам уведомлять один обработчик.
handlers: - name: Restart services listen: "restart stack" ansible.builtin.systemd: name: "{{ item }}" state: restarted loop: [ nginx, app-service, redis ]