web-dev-qa-db-ja.com

別のロールのAnsible通知ハンドラー

別のロールのハンドラーに通知できますか? ansibleがそれを見つけるにはどうすればよいですか?

ユースケースは、例えばサービスを構成し、変更された場合は再起動したい。 OSによって編集するファイルが異なる可能性があり、ファイル形式も異なる場合があります。それで、私はそれらを異なる役割にしたいと思います(ファイル形式が異なる場合があるため、group_varsを設定することではできません)。ただし、serviceモジュールを使用して、サービスを再起動する方法は同じです。ハンドラーをcommonロールに配置したいと思います。

とにかくこれを達成するのですか?ありがとう。

61
Kan Li

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
    
65
famousgarkin

ハンドラファイルを含めると、これを実行できるはずです。

例:

handlers:
  - include: someOtherRole/handlers/main.yml 

しかし、私はそのエレガントだとは思わない。

よりエレガントな方法は、次のような両方の役割を管理する遊びを持つことです。

- hosts: all
  roles:
  - role1
  - role2

これにより、両方のロールが他のハンドラーを呼び出せるようになります。

しかし、ここでもすべてを1つの役割と個別のファイルにして、条件付きインクルードを使用することをお勧めします http://docs.ansible.com/playbooks_conditionals.html#conditional-imports

役立つことを願っています

32
DomaNitro

同様の問題がありましたが、他の依存する役割で多くのアクションを実行する必要がありました。

ハンドラーを呼び出すのではなく、次のような事実を設定します。

- 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
4
stackdump

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からハンドラーを正しくインポートして実行できます。

2
Dima L.