Как написать обработчик Ansible с несколькими задачами?
В ответ на изменение у меня есть несколько связанных задач, которые должны выполняться.
Как написать обработчик Ansible с несколькими задачами?
Например, мне нужен обработчик, который перезапускает сервис, только если он уже запущен:
- name: Restart conditionally
shell: check_is_started.sh
register: result
- name: Restart conditionally step 2
service: name=service state=restarted
when: result
Ответы
Ответ 1
Существует правильное решение этой проблемы по сравнению с 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
Ответ 2
В вашем файле обработчика объедините различные шаги вместе, используя уведомление.
- name: Restart conditionally
debug: msg=Step1
changed_when: True
notify: Restart conditionally step 2
- name: Restart conditionally step 2
debug: msg=Step2
changed_when: True
notify: Restart conditionally step 3
- name: Restart conditionally step 3
debug: msg=Step3
Затем обратитесь к нему из задачи с помощью notify: Restart conditionally
.
Обратите внимание, что вы можете только уведомлять обработчики ниже текущего. Так, например, Restart conditionally step 2
не может уведомить Restart conditionally
.
Источник: #ansible на irc.freenode.net. Я не уверен, что это будет продолжаться в будущем, поскольку оно не упоминается как функция в официальной документации.
Ответ 3
Как и в случае с Ansible 2.0, вы можете использовать действие include в вашем обработчике для выполнения нескольких задач.
Например, поместите свои задачи в отдельный файл restart_tasks.yml
(если вы используете роли, которые попадут в подкаталог задач, а не в подкаталог обработчиков):
- name: Restart conditionally step 1
shell: check_is_started.sh
register: result
- name: Restart conditionally step 2
service: name=service state=restarted
when: result
Тогда ваш обработчик просто будет:
- name: Restart conditionally
include: restart_tasks.yml
Источник: выпуск потока на github: https://github.com/ansible/ansible/issues/14270