
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.yml
Apache を再起動するハンドラーと、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
依存関係に関する詳細情報ここ。