22

タスク ファイルで3 つのタスクを実行する必要がある 1 つの Ansible ロールがありますhandlers/main.ymlが、最初のタスクしか実行しません。他の 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 のシャットダウン) のみが実行されます。

4

4 に答える 4

22

listenAnsible 2.2 以降、ディレクティブを使用して複数のハンドラーに同時に通知できるようになりました。

- 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
于 2017-01-20T02:02:56.547 に答える
8

上記のコード例が Ansible で使用している方法は公式にサポートされていないため、動作していなくても不思議ではありません (実際notifyに動作していたとしても驚くでしょう)。特定のケースでは、プレイブックで 1 つのタスクを使用するか、単にサービスを再起動するために使用するハンドラーを使用することをお勧めします。state=restarted

- service: name=openfire state=restarted enabled=yes

ただし、1 つの操作の結果として複数のハンドラーを実行する必要がある場合、チェーン内の個別のコマンドごとに通知するのが最善の方法です。これはほとんどの場合、より深い問題を示していることに注意してください...しかし、時々、次のように、特定のハンドラーが完了した後に別のハンドラーに通知する必要がありました。

# 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

これはかなりまれなはずですが、特定のシナリオではそれほど悪いオプションではないと思います (私の場合、データベース ダンプをインポートし、それが完了した後にシェル スクリプトを実行する必要がありました。べき等操作import databaseは、私のプレイブックで直接インポートを試みるのではなく、ハンドラーに通知することでした)。

于 2014-03-25T18:44:33.143 に答える