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

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

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

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

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

3 ответов


существует правильное решение этой проблемы с 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.

- 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 at irc.freenode.net - ... Я не уверен, будет ли это продолжать работать в будущем, поскольку это не упоминается как функция в официальной документации.


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

например, поместите свои задачи в отдельный файл restart_tasks.yml (Если вы используете роли, это войдет в подкаталог tasks,не в подкаталоге обработчики):

- 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