Правильное решение этой проблемы есть в версии Ansible 2.2.
обработчики также могут «слушать» общие темы, а задачи могут уведомлять эти темы следующим образом:
handlers:
- name: restart memcached
service: name=memcached state=restarted
listen: "restart web services"
- name: restart apache
service: name=apache state=restarted
listen: "restart web services"
tasks:
- name: restart everything
command: echo "this task will restart the web services"
notify: "restart web services"
Это использование значительно упрощает запуск нескольких обработчиков. Он также отделяет обработчики от их имен, что упрощает совместное использование обработчиков между сценариями и ролями.
В частности, на вопрос, это должно работать:
- name: Check if restarted
shell: check_is_started.sh
register: result
listen: Restart processes
- name: Restart conditionally step 2
service: name=service state=restarted
when: result
listen: Restart processes
и в задаче уведомить обработчиков через «Перезапустить процессы»
http://docs.ansible.com/ansible/playbooks_intro.html#handlers-running-operations-on-change
Notify handlers are always run in the same order they are defined, not in the order listed in the notify-statement. This is also the case for handlers using listen.
В файле обработчика объедините различные шаги вместе с помощью notify.
Затем обратитесь к нему из задачи с помощью
notify: Restart conditionally
.Обратите внимание, что вы можете уведомлять только обработчики ниже текущего. Так, например,
Restart conditionally step 2
не могу уведомитьRestart conditionally
.Источник: #ansible на irc.freenode.net. Я не уверен, будет ли это работать в будущем, поскольку это не упоминается как функция в официальной документации.
источник
notify
меток для тех, которые вы, возможно, не захотите запускать в случае сбоя предыдущего обработчика, - хороший способ «исправить» это, если вы этого не хотите.Изменить: если у вас есть Ansible 2.2 или выше, используйте ответ mkadan. Приведенный ниже ответ не работает с более новыми версиями Ansible. Также обратите внимание, что, согласно приведенному ниже комментарию Эниса Афган, из-за ошибки этот ответ не работает с версиями Ansible между 2.0.2 и 2.1.2.
Начиная с Ansible 2.0, вы можете использовать действие include в своем обработчике для выполнения нескольких задач.
Например, поместите свои задачи в отдельный файл
restart_tasks.yml
(если вы используете роли, они будут идти в подкаталог задач, а не в подкаталоге обработчиков):Тогда ваш обработчик будет просто:
Источник: тема выпуска на github: https://github.com/ansible/ansible/issues/14270
источник
include
наinclude_tasks
.