Что такое хендлеры в Ansible?

Ответ

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

Ключевые особенности:

  • Выполняются только при изменении (changed: true) уведомившей их задачи.
  • По умолчанию запускаются один раз в конце выполнения всех задач плейбука.
  • Порядок выполнения можно контролировать с помощью listen и меток.

Пример использования:

---
- 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 service  # Уведомление хендлера
        - Check Nginx config    # Можно уведомить несколько хендлеров

  handlers:
    - name: Reload Nginx service
      ansible.builtin.service:
        name: nginx
        state: reloaded
      listen: "nginx handlers"  # Группировка через listen

    - name: Check Nginx config
      ansible.builtin.command: nginx -t
      listen: "nginx handlers"

Практический совет: Хендлеры идеально подходят для перезапуска демонов (nginx, sshd, docker) после изменения их конфигурационных файлов, что является распространенной практикой при управлении инфраструктурой как код (IaC).

Ответ 18+ 🔞

Слушай, давай разжую про хендлеры в Ansible, а то у некоторых глаза стекленеют, как у совы на солнце. Представь себе такую картину: ты накрутил в плейбуке кучу задач, они там конфиги меняют, файлы копируют — в общем, тихий ужас. И вот после всех этих телодвижений нужно, например, nginx перезагрузить, чтобы изменения вступили в силу. Так вот, хендлеры — это как раз те самые работяги, которые сидят на скамейке запасных, ждут своего звонка, а потом раз — и делают одно конкретное дело, обычно в самом конце.

В чём прикол, спросишь?

  • Они срабатывают только если их позвали. А позвать их может только задача, которая реально что-то изменила (changed: true). Если задача ничего не поменяла (статус ok), то хендлер будет спать дальше, хоть ты тресни.
  • По дефолту они все копятся, а потом разом запускаются один раз в конце плейбука. Это, блядь, гениально, потому что если пять задач просят перезагрузить nginx, он перезагрузится один раз, а не пять раз подряд, как идиот.
  • Порядком их вызова можно управлять через listen и метки, если тебе мало хаоса.

Смотри, как это выглядит в жизни, ёпта:

---
- 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 service  # Кричим хендлеру: "Эй, дружок, пора работать!"
        - Check Nginx config    # Можно и несколько сразу позвать, жадничать не надо

  handlers:
    - name: Reload Nginx service
      ansible.builtin.service:
        name: nginx
        state: reloaded
      listen: "nginx handlers"  # Это типа сгруппировали их, чтобы вместе летели

    - name: Check Nginx config
      ansible.builtin.command: nginx -t
      listen: "nginx handlers"

Жизненный лайфхак, чтобы не было мучительно больно: Хендлеры — это твои лучшие друзья, когда дело доходит до перезапуска всяких демонов вроде nginx, sshd или docker. Изменил конфиг — уведомил хендлер — и спишь спокойно. Без них пришлось бы после каждой задачи вручную службу трогать, а это, я тебе скажу, пиздопроебищно и терпения ноль ебать. Так что используй, не стесняйся.