Необработанный обработчик не запускает несколько задач обработчика
У нас есть одна роль 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).
Ответы
Ответ 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).