Что такое notify (уведомление) в Ansible?

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

Ответ

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

Как это работает:

  1. Задача изменяет конфигурационный файл и уведомляет обработчик с именем Restart Nginx.
  2. Ansible запоминает этот вызов.
  3. В конце выполнения всех задач плейбука 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 ]