web-dev-qa-db-ja.com

複数のタスクを含むAnsibleハンドラーを作成するにはどうすればよいですか?

変更に応じて、実行する必要がある複数の関連タスクがあります。複数のタスクを含むAnsibleハンドラーを作成するにはどうすればよいですか?

たとえば、既に開始されている場合にのみサービスを再起動するハンドラーが必要です。

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

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

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

66
mkadan

ハンドラーファイルで、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 2Restart conditionallyに通知できません。

出典:irc.freenode.netで#ansible。公式ドキュメントの機能として言及されていないため、これが今後も機能し続けるかどうかはわかりません。

50
timdiels

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

27