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.

포함 내부에 정의된 핸들러에는 알릴 수 없습니다. Ansible 2.1부터는 이것이 작동하지만 포함은 정적이어야 합니다.

답변2

이를 달성하는 방법에는 최소한 두 가지가 있습니다. 모범 사례가 무엇인지 명확하지 않습니다.

솔루션 1

하나권장되는 연습핸들러 전용 파일을 생성하여 플레이북에 포함하거나 가져오는 것입니다(차이점을 확인하세요); 그렇게 하면 모든 역할이 이익을 얻을 수 있습니다.

myhandlers.yml예를 들어, 아파치를 다시 시작하기 위한 핸들러와 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

종속성에 대한 추가 정보여기.

관련 정보