Programing

다른 역할의 Ansible 알림 핸들러

crosscheck 2020. 11. 18. 08:34
반응형

다른 역할의 Ansible 알림 핸들러


다른 역할의 핸들러에게 알릴 수 있습니까? ansible을 찾으려면 어떻게해야합니까?

사용 사례는 예를 들어 일부 서비스를 구성하고 변경된 경우 다시 시작하고 싶습니다. OS마다 편집 할 파일이 다를 수 있으며 파일 형식도 다를 수 있습니다. 그래서 나는 그것들을 다른 역할에 넣고 싶습니다 (파일 형식이 다를 수 있기 때문에 group_vars를 설정하여 수행 할 수 없습니다). 그러나 서비스를 다시 시작하는 방법은 service모듈을 사용하여 동일 합니다. 그래서 핸들러 common역할 맡고 싶습니다 .

어쨌든 이것을 달성하는 것입니까? 감사.


종속성 역할의 처리기를 호출 할 수도 있습니다 . 역할 대 역할 관계의 목적으로 플레이 북에 파일을 포함하거나 역할을 명시 적으로 나열하는 것보다 더 깔끔 할 수 있습니다. 예 :

  • 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

이렇게하면 두 역할이 다른 핸들러를 호출 할 수 있습니다.

그러나 다시 한 번 모든 것을 하나의 역할과 별도의 파일로 만들고 조건부 포함 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.

So, if MyRole needs to call handlers in some OtherRole, roles/MyRole/handlers/main.yml will look like this:

- import_tasks: roles/OtherRole/handlers/main.yml

Of course roles/MyRole/handlers/main.yml may include additional handlers as well.

This way if I want to run MyRole without running tasks from the OtherRole, ansible will be able to correctly import and run handlers from the OtherRole

참고URL : https://stackoverflow.com/questions/22649333/ansible-notify-handlers-in-another-role

반응형