web-dev-qa-db-ja.com

Ansibleハンドラーは複数のハンドラータスクを実行しません

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のシャットダウン)のみが実行されます。

21
Nova S.

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
19
Xiong Chiamiov

ハンドラーが別の通知を呼び出すことが可能です。複数の通知呼び出しも許可されます。

---
- 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
20
iTake

あなたの投稿は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で十分です。

9

上記のサンプルコードが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ハンドラーに通知することでした。

8
geerlingguy