Ansibleのグローバルハンドラー

Ansibleのグローバルハンドラー

Ansible に真のグローバル ハンドラーを用意して、任意のプレイブックの任意のロールの任意のタスクからハンドラーに「通知」できるようにすることは可能ですか? 明示的にインポートしなくても可能です。

ハンドラーを一度定義し (「httpd を再起動」など)、それをどこでも任意の「通知」ディレクティブで使用できるようにしたいだけです。

ありがとう!

答え1

ロール内ではなくプレイ内でハンドラーを定義できます。プレイで定義されたハンドラーは、そのプレイのすべてのタスク/ロールで使用できます。

必要に応じて、ハンドラー セクションでもインポートを使用できます。

---
- hosts: all
  handlers:
  - import_tasks: global_handlers.yml
  tasks:
  - shell: echo "Hello World"
    notify: some thing from global_handlers

「静的インクルード」が必要であることに注意してください( https://docs.ansible.com/ansible/latest/user_guide/playbooks_intro.html#handlers-running-operations-on-change) なので、import_tasksの代わりに を使用する必要がありますinclude_tasks

include 内で定義されているハンドラーに通知することはできません。Ansible 2.1 では、これは機能しますが、include は静的である必要があります。

答え2

これを実現するには少なくとも 2 つの方法がありますが、ベスト プラクティスが何であるかはわかりません。

解決策1

1つ推奨される方法ハンドラ専用のファイルを作成し、それをプレイブックに組み込むかインポートします(違いを見る); そうすれば、すべての役割が恩恵を受けることができます。

たとえば、myhandlers.ymlApache を再起動するハンドラーと、mysqld をリロードするハンドラーを含むファイルがあるとします。

次に、プレイブックで次の操作を実行します。

- name: Testing 123
  hosts: localhost
  handlers:
    - name: Here are my custom common handlers
      # You can also look at include_tasks: handlers.yml
      import_tasks: handlers.yml
  tasks:
    - command: "true"
      notify: restart-apache
    
    - command: "true"
      notify: restart-mysql

解決策2

もう一つのクリーンなアプローチ専用のロール (roles/myhandlers/たとえば) を作成し、このロールを他のすべてのロールの依存関係にします。

dependencies:
  - myhandlers

依存関係に関する詳細情報ここ

関連情報