別のロールのハンドラーに通知できますか? ansibleがそれを見つけるにはどうすればよいですか?
ユースケースは、例えばサービスを構成し、変更された場合は再起動したい。 OSによって編集するファイルが異なる可能性があり、ファイル形式も異なる場合があります。それで、私はそれらを異なる役割にしたいと思います(ファイル形式が異なる場合があるため、group_varsを設定することではできません)。ただし、service
モジュールを使用して、サービスを再起動する方法は同じです。ハンドラーをcommon
ロールに配置したいと思います。
とにかくこれを達成するのですか?ありがとう。
dependencyロールのハンドラーを呼び出すこともできます。役割と役割の関係だけを目的として、ファイルを含めたり、プレイブックに役割を明示的にリストしたりするよりも簡潔な場合があります。例えば。:
roles/my-handlers/handlers/main.yml
---
- name: nginx restart
service: >
name=nginx
state=restarted
roles/my-other/meta/main.yml
---
dependencies:
- role: my-handlers
roles/my-other/tasks/main.yml
---
- copy: >
src=nginx.conf
dest=/etc/nginx/
notify: nginx restart
ハンドラファイルを含めると、これを実行できるはずです。
例:
handlers:
- include: someOtherRole/handlers/main.yml
しかし、私はそのエレガントだとは思わない。
よりエレガントな方法は、次のような両方の役割を管理する遊びを持つことです。
- hosts: all
roles:
- role1
- role2
これにより、両方のロールが他のハンドラーを呼び出せるようになります。
しかし、ここでもすべてを1つの役割と個別のファイルにして、条件付きインクルードを使用することをお勧めします http://docs.ansible.com/playbooks_conditionals.html#conditional-imports
役立つことを願っています
同様の問題がありましたが、他の依存する役割で多くのアクションを実行する必要がありました。
ハンドラーを呼び出すのではなく、次のような事実を設定します。
- name: install mylib to virtualenv
pip: requirements=/opt/mylib/requirements.txt virtualenv={{ mylib_virtualenv_path }}
Sudo_user: mylib
register: mylib_wheel_upgraded
- name: set variable if source code was upgraded
set_fact:
mylib_source_upgraded: true
when: mylib_wheel_upgraded.changed
次に、別の役割の他の場所:
- name: restart services if source code was upgraded
command: /bin/true
notify: restart mylib server
when: mylib_source_upgraded
YourRole/handlers/main.yml
を使用して、import_tasks
ファイルから追加のハンドラーをインポートできます。
したがって、MyRole
がいくつかのOtherRole
でハンドラーを呼び出す必要がある場合、roles/MyRole/handlers/main.yml
は次のようになります。
- import_tasks: roles/OtherRole/handlers/main.yml
もちろん、roles/MyRole/handlers/main.yml
には追加のハンドラーも含めることができます。
このようにして、MyRole
からタスクを実行せずにOtherRole
を実行したい場合、ansibleはOtherRole
からハンドラーを正しくインポートして実行できます。