変更に応じて、実行する必要がある複数の関連タスクがあります。複数のタスクを含むAnsibleハンドラーを作成するにはどうすればよいですか?
たとえば、既に開始されている場合にのみサービスを再起動するハンドラーが必要です。
- name: Restart conditionally
Shell: check_is_started.sh
register: result
- name: Restart conditionally step 2
service: name=service state=restarted
when: result
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
に通知できません。
出典:irc.freenode.netで#ansible。公式ドキュメントの機能として言及されていないため、これが今後も機能し続けるかどうかはわかりません。
Ansible 2.0では、ハンドラーでincludeアクションを使用して複数のタスクを実行できます。
たとえば、タスクを別のファイルrestart_tasks.yml
に配置します(ロールを使用する場合、tasksサブディレクトリに移動します(handlesサブディレクトリのnot):
- 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/1427