Ответ 1
Есть некоторые отличия, и это лучше зависит от ситуации.
Обработчики будут отображаться только на выходе, если они действительно были выполнены. Не сообщается, что в выпуске Ansibles не будет пропущенных задач. Задачи всегда имеют выход независимо от того, пропущены, выполнены с изменением или без. (за исключением того, что они исключаются через теги/теги пропуска)
Обработчики могут вызываться из любой роли. Это становится удобно, если у вас более сложные роли, которые зависят друг от друга. Скажем, у вас есть роль в управлении iptables, но какие правила вы определяете, в действительности зависит от других ролей (например, роль базы данных, роль redis и т.д.). Каждая роль может добавлять свои правила в файл конфигурации, а в конце вы уведомляете iptables роль для перезагрузки iptables при изменении.
Обработчики по умолчанию получают выполнение в конце учебника. Задачи будут выполняться немедленно, когда они определены. Таким образом, вы можете настроить все свои приложения, и в конце перезапуск службы для всех измененных приложений будет запущен для каждого обработчика. Это может быть опасно. В случае сбоя вашей плей-книжки после уведомления обработчика обработчик фактически не будет вызван. Если вы снова запустите playbook, задача запуска может не иметь измененного состояния, поэтому не будет уведомлять обработчик. Это приводит к тому, что Ansible фактически не является идемпотентным. Начиная с Ansible 1.9.1 вы можете вызвать Ansible с опцией --force-handler
или определить force_handlers = True
в ansible.cfg
, чтобы даже запустить все обработчики уведомлений после выхода из игры. (См. документы)
Если вам нужно, чтобы ваши обработчики были запущены в определенном месте (например, вы настроили вашу систему на использование внутреннего DNS и теперь хотите разрешить хост через этот DNS), вы можете очистить все обработчики, определив задачу как:
- meta: flush_handlers
Обработчик будет вызываться только один раз независимо от того, сколько раз он был уведомлен. Представьте, что у вас есть служба, которая зависит от нескольких файлов конфигурации (например, bind/named: rev, zone, root.db, rndc.key, named.conf), и вы хотите перезапустить named, если какой-либо из этих файлов изменился. С обработчиками вы просто уведомляете каждую задачу, которая управляла этими файлами. В противном случае вам нужно зарегистрировать 5 бесполезных варов, а затем проверить их все в своей задаче перезагрузки.
Лично я предпочитаю обработчики. Он выглядит намного чище, чем иметь дело с register
. Задачи, инициированные для каждого регистра, были безопаснее перед Ansible 1.9.1.