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

Необработанный обработчик не запускает несколько задач обработчика

У нас есть одна роль Ansible, которая должна запускать три задачи в файле задачи handlers/main.yml, но она запускает только первую задачу. Как заставить его выполнять две другие задачи? У меня есть флаг ignore, если первая задача не выполнена.

Файл tasks/main.yml выглядит так:

- name: openfire | Copy plugins into openfire/plugins
  copy: src={{ srcdir }}/xmpp/{{ item }} dest=${bindir}/openfire/plugins/{{ item }}
  with_items:
   - x.jar
   - y.jar
  sudo: yes
  sudo_user: ${tomcat_user}
  notify: restart openfire

- name: openfire | Copy jars into openfire/lib
  copy: src={{ srcdir }}/xmpp/{{ item }} dest=${bindir}/openfire/lib/{{ item }}
  with_items:
   - a.jar
   - b.jar
  sudo: yes
  sudo_user: ${tomcat_user}
  notify: restart openfire

Файл handlers/main.yml выглядит так:

- name: restart openfire
  service: name=openfire state=stopped
  ignore_errors: true
  sudo: yes

- name: restart openfire
  file: path=/var/run/openfire.pid state=absent
  sudo: yes

- name: restart openfire
  service: name=openfire state=restarted enabled=yes
  sudo: yes

Запускается только первая задача обработчика (shutdown openfire).

4b9b3361

Ответ 1

Как и в случае с Ansible 2.2, вы можете теперь уведомлять несколько обработчиков одновременно с помощью директивы listen:

- name: stop openfire
  listen: restart openfire
  service: name=openfire state=stopped
  ignore_errors: true
  sudo: yes

- name: remove openfire pid file
  listen: restart openfire
  file: path=/var/run/openfire.pid state=absent
  sudo: yes

- name: restart openfire
  listen: restart openfire
  service: name=openfire state=restarted enabled=yes
  sudo: yes

Ответ 2

Его можно обработать для вызова другого уведомления. Также допускаются несколько уведомлений:

---
- name: restart something
  command: shutdown.sh 
  notify:
    - wait for stop
    - start something
    - wait for start

- name: wait for stop
  wait_for: port={{port}} state=stopped

- name: start something
  command: startup.sh

- name: wait for start
  wait_for: port={{port}} state=started

Ответ 3

Может быть, слишком поздно, так как ваш пост с января, но... почему вы одинаково называете все разные обработчики? Предполагается, что обработчики будут вызваны в задачи по их name, поэтому, возможно, вам нужно назвать их по-разному. Попробуйте изменить файл обработчика на что-то вроде этого:

- name: stop openfire
  service: name=openfire state=stopped
  ignore_errors: true
  sudo: yes

- name: remove openfire pid
  file: path=/var/run/openfire.pid state=absent
  sudo: yes

- name: restart openfire
  service: name=openfire state=restarted enabled=yes
  sudo: yes

В любом случае, я согласен с Mxx в том, что этот файл обработчиков довольно странный. Этого должно быть достаточно с помощью state=restarted.

Ответ 4

То, как приведенный выше примерный пример использует notify в Ansible, официально не поддерживается, поэтому я не удивлен, что он не работает (и был бы удивлен, если бы он действительно работал). В вашем конкретном случае использование одной задачи в вашей книге или обработчик, который просто использует state=restarted для перезапуска службы, будет лучшим вариантом:

- service: name=openfire state=restarted enabled=yes

Однако, если вам нужно запустить несколько обработчиков в результате одной операции, лучшим способом сделать это будет уведомление каждой отдельной команды в цепочке. Обратите внимание, что это почти всегда указывает на более глубокую проблему... но время от времени я должен был уведомить другого обработчика после завершения определенного обработчика, например:

# Inside handlers/main.yml:
- name: import database
  mysql_db: name=database state=import target=/path/to/dump.sql
  notify: run shell script

- name: run shell script
  shell: /path/to/some/shell/script.sh

Это должно быть довольно редко, но я не думаю, что это слишком плохой вариант для определенных сценариев (в моем случае мне пришлось импортировать дамп базы данных, а затем запустить оболочку script после того, как это было завершено, и лучший способ сделать эту операцию idempotent состоял в том, чтобы уведомить обработчик import database вместо того, чтобы попытаться выполнить импорт непосредственно в моей playbook).