handlers/main.yml
タスクファイルで3つのタスクを実行する必要がある1つのAnsibleロールがありますが、最初のタスクのみを実行します。他の2つのタスクを強制的に実行するにはどうすればよいですか?最初のタスクが失敗した場合に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
最初のハンドラタスク(openfireのシャットダウン)のみが実行されます。
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
ハンドラーが別の通知を呼び出すことが可能です。複数の通知呼び出しも許可されます。
---
- 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
あなたの投稿は1月からなので遅すぎるかもしれませんが、...なぜすべての異なるハンドラーに同じ名前を付けているのですか?ハンドラーは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
で十分です。
上記のサンプルコードがAnsibleでnotify
を使用している方法は公式にはサポートされていないため、機能していないことは驚くことではありません(そして本当にが機能していれば驚くでしょう) 。特定のケースでは、プレイブックで1つのタスクを使用するか、単にstate=restarted
を使用してサービスを再起動するハンドラーを使用する方が適切なオプションです。
- service: name=openfire state=restarted enabled=yes
ただし、1つの操作の結果として複数のハンドラーを実行する必要があるdoを実行する場合は、チェーン内の個別のコマンドをそれぞれ通知するのが最善の方法です。これはほとんどの場合、より深い問題を示していることに注意してください...しかし、時々、特定のハンドラーが完了した後、次のように別のハンドラーに通知する必要がありました。
# 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
これは非常にまれですが、特定のシナリオではあまり悪いオプションではないと思います(私の場合、データベースダンプをインポートし、完了後にシェルスクリプトを実行する必要がありました。操作i等性は、私のプレイブックで直接インポートを試みる代わりに、import database
ハンドラーに通知することでした。