Ansibleでハンドラーの実行を常にトリガーする


33

Ansibleを使用して開発サーバーをプロビジョニングしています。

常にいくつかのサービスを開始してほしい。この目的のハンドラーがありますが、条件なしでハンドラーの実行をトリガーするための最良の方法は何ですか?

このようなもの:

tasks:
    - name: Trigger handler
      run_handler: name=nginx-restart

6
タスクを常に実行する場合は、ハンドラーではなくタスクにする必要があります。
ヨルダン

@Jordan-この特定のシナリオを除くほとんどのシナリオで条件付きでトリガーされるハンドラーが必要な場合があります。
silverdr

回答:


61

毎回ハンドラーをトリガーする必要がある場合は、次の2つのオプションがあります。

1)noopシェルコマンドを実行します。このコマンドは常に変更されたと報告します

-  name: trigger nginx-restart
   command: /bin/true
   notify: nginx-restart

2)changed_when:と共にデバッグを使用して、ハンドラーをトリガーします

-  debug: msg="trigger nginx-restart"
   notify: nginx-restart
   changed_when: true

オプション1およびチェックモードについても注意してください:check_mode: noAnsibleバージョン2.2以降を使用している場合、またはそれよりalways_run: yes前のバージョンを使用している場合、チェックモードでタスクがスキップされないように使用できます。私の手動テストでは、ハンドラーはチェックモードのままであるように見えますが、場合によっては注意してください。


7
最近では、 `--force-handlersがタスクが失敗した場合でもハンドラーを実行することができます`
conny

5
はい。ただし、すべてのハンドラーが強制的に実行されます
-jarv

変更されたステータスに関して、この投稿が役に立つと思いました。 serverfault.com/a/799282/173002。ty。
sonjz

おかげで、オプション2とchanged_whenより多くのロジックを使用して、非ide等タスク(場合によっては複数回呼び出される可能性がある)をタスクではなくハンドラーとして実装しました。
サミッチ

17

Ansibleは、ハンドラーを強制するためのいくつかのオプションを提供します。

1)すべてのハンドラーを常に強制するにはansible-playbook playbook.yml --force-handlershttps//github.com/ansible/ansible/issues/4777に記載されているように、を実行します

2)プレイブック内の特定の時点で通知されたハンドラーを強制するには、メタタスクhttps://docs.ansible.com/playbooks_intro.htmlを使用できます

tasks: 
  - shell: some tasks go here
  - meta: flush_handlers
  - shell: some other tasks

3)ただし、別のタスクの結果に関係なく、サービスが実行または再起動されていることを確認したいだけのようです。その場合、ハンドラーを使用せずに、Ansibleのserviceモジュールを呼び出す新しいタスクを使用してください:http : //docs.ansible.com/service_module.html

tasks: 
  - name: ensure ntp is running
    service: name=ntp state=started enabled=yes

  - name: always reload nginx
    service: name=nginx state=reloaded

  - name: always restart MySQL
    service: name=mysql state=restarted

1
(3)の問題は、ハンドラーに通知するいくつかのタスクがあり、ハンドラーを数回実行(サービスを再起動)したくないことです。
ジョナサンハートリー

複数のタスクが同じハンドラーに通知でき、ハンドラーは一度だけ実行されます。これがハンドラーの要点です。
ジェフウィドマン

こんにちはジェフ。この答えは、ハンドラーを使用せず、タスクのみを使用してすべてのアクションを指定することです。
ジョナサンハートレー

申し訳ありませんが、解決しようとしているユースケースがまだ理解できないのではないかと思います。リンクを含むコメントを追加する場合は、回答を試みます。
ジェフウィドマン

新しい質問は必要ありません。OQは「ハンドラーが常に実行されることを確認するにはどうすればよいですか」と尋ね、この回答、パート3は「代わりにタスクを使用する」を提案し、私のコメントは「状況によってはタスクが数回実行される可能性がある」と指摘しています。
ジョナサンハートリー

6

サービスの再起動は一つのことです。それが実行されていることを確認することは別です。実行さansibleれていることを確認したい場合nginx、これを行います:

tasks:
  - name: Ensure nginx is running
    service: name=nginx state=started
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.