it-swarm.com.ru

Ansible Handler уведомляет против регистрации

Поэтому, прочитав Ansible docs, я обнаружил, что Handlers запускаются только при изменении отчета о задачах, например:

some tasks ...
notify: nginx_restart

# our handler
- name: nginx_restart

против

some tasks ...
register: nginx_restart

# do this after nginx_restart changes
when: nginx_restart|changed

Есть ли разница между этими двумя методами? Когда я должен использовать каждый из них? Для меня register, кажется, имеет больше функциональности, если я что-то упустил ...

51
huygn

Есть некоторые различия и что лучше зависит от ситуации.

Обработчики будут видны в выводе, только если они действительно были выполнены. Не уведомлено, не будет пропущенных задач в выводе Ansibles. Задачи всегда выводятся независимо от того, пропущены ли они, выполнены с изменениями или без них. (за исключением того, что они исключаются с помощью тегов/пропусков)

Обработчики могут быть вызваны из любой роли. Это удобно, если у вас есть более сложные роли, которые зависят друг от друга. Допустим, у вас есть роль для управления iptables, но какие правила вы определяете, в действительности зависит от других ролей (например, роль базы данных, роль redis и т.д.). Каждая роль может добавлять свои правила в файл конфигурации, и в конце вы уведомляете iptables. роль для перезагрузки iptables, если изменилось.

По умолчанию обработчики выполняются в конце playbook. Задачи будут выполнены немедленно, где они определены. Таким образом, вы можете настроить все свои приложения, и в конце перезапуск службы для всех измененных приложений будет запущен для каждого обработчика. Это может быть опасно, хотя. В случае сбоя вашей playbook после того, как обработчик был уведомлен, обработчик фактически не будет вызван. Если вы снова запустите playbook, задача запуска может больше не иметь измененного состояния, поэтому не уведомляет обработчик. Это приводит к тому, что Ansible фактически не является идемпотентом. Начиная с Ansible 1.9.1, вы можете вызывать Ansible с помощью --force-handler опцию или определить force_handlers = True в вашем ansible.cfg даже для запуска всех уведомленных обработчиков после сбоя playbook. ( см. Документы )

Если вам нужно, чтобы ваши обработчики запускались в определенный момент (например, вы настроили свою систему на использование внутреннего DNS и теперь хотите разрешить хост через этот DNS), вы можете сбросить все обработчики, определив задачу, например:

- meta: flush_handlers

Обработчик вызывается только один раз, независимо от того, сколько раз он был уведомлен. Представьте, что у вас есть служба, которая зависит от нескольких файлов конфигурации (например, bind/named: rev, zone, root.db, rndc.key, named.conf), и вы хотите перезапустить named, если какой-либо из этих файлов изменился. С помощью обработчиков вы просто уведомляете о каждой задаче, которая управляет этими файлами. В противном случае вам нужно зарегистрировать 5 бесполезных переменных, а затем проверить их все в задаче перезапуска.

Лично я предпочитаю обработчиков. Это выглядит намного чище, чем работа с register. Задачи, запускаемые в каждом регистре, были более безопасными, чем Ansible 1.9.1.

67
udondan

На странице Ansible Variables вы можете увидеть, как работает register.

Другое основное использование переменных - запуск команды и использование результата этой команды для сохранения результата в переменную.

Зарегистрированные переменные похожи на факты:

Фактически зарегистрированные переменные - это как факты.

Это очень отличается от notify, который запускает обработчики. Он не сохраняет и не хранит переменные или факты.

4
Felipe Alvarez

с ignore_errors: True вы можете избежать сбоя обработчика, который остановит другие обработчики, определенные после его продолжения

1
Bruce Zu