Подтвердить что ты не робот

Как написать обработчик Ansible с несколькими задачами?

В ответ на изменение у меня есть несколько связанных задач, которые должны выполняться. Как написать обработчик Ansible с несколькими задачами?

Например, мне нужен обработчик, который перезапускает сервис, только если он уже запущен:

- name: Restart conditionally
  shell: check_is_started.sh
  register: result

- name: Restart conditionally step 2
  service: name=service state=restarted
  when: result
4b9b3361

Ответ 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