Глава 5: Ansible Playbooks - за пределами основ
Handlers
В главе 4 пример Ubuntu LAMP server мы использовали handler для перезапуска Apache, и некоторые задачи, которые изменяли конфигурацию Apache, уведомляя handler параметром notify: restart apache
:
handlers:
- name: restart apache
service: name=apache2 state=restarted
tasks:
- name: Enable Apache rewrite module.
apache2_module: name=rewrite state=present
notify: restart apache
В некоторых случаях может потребоваться уведомление нескольких handlers. Чтобы уведомить несколько handlers из одной задачи, используйте список notify:
- name: Rebuild application configuration.
command: /opt/app/rebuild.sh
notify:
- restart apache
- restart memcached
Чтобы из handler уведомить другой handler слпользуйте параметр notify:
handlers:
- name: restart apache
service: name=apache2 state=restarted
notify: restart memcached
- name: restart memcached
service: name=memcached state=restarted
При работе с handlers существует несколько правил:
- Handlers будут выполняться только в том случае, если задача уведомляет handler; Если задача, которая уведомила handler, пропускается из-за того или иного условия, handler не будет запущен.
- Handlers будут выполняться только один раз в конце инструкции. Если вам необходимо запустить handler в середине инструкции, можно воспользоваться модулем meta (например -
meta: flush_handlers
). - Если инструкция не выполняется на каком-то хосте (или на всех узлах) перед уведомлением handlers, они не будут запущены. Если необходимо запускать handlers вне зависимости от удачного выполнения playbook, можно использовать модуль meta, описанный выше, как отдельную задачу в playbook, или использовать флаг c командной
--force-handlers
при запуске playbook.