Можно ли добавить обработчик (handler) в середину плейбука Ansible?

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

Ответ

Да, объявить обработчик можно в любом месте плейбука внутри секции handlers: соответствующего плей (play). Однако важно понимать механизм выполнения: обработчики запускаются только один раз в конце плей, и только если задача, которая уведомила (notify) этот обработчик, завершилась со статусом changed.

Пример плейбука:

- name: Configure web server
  hosts: webservers
  tasks:
    - name: Install Nginx package
      ansible.builtin.apt:
        name: nginx
        state: latest
      notify: restart nginx # Уведомление отправлено здесь

    - name: Deploy configuration template
      ansible.builtin.template:
        src: nginx.conf.j2
        dest: /etc/nginx/nginx.conf
      notify: restart nginx # И здесь. Обработчик выполнится один раз.

  handlers:
    - name: restart nginx
      ansible.builtin.service:
        name: nginx
        state: restarted

Почему так сделано: Это предотвращает множественные перезагрузки службы в рамках одного плей, если её конфигурация меняется в нескольких задачах. Если нужно выполнить действие немедленно, используйте обычную задачу с модулем service вместо обработчика.