
모든 플레이북의 모든 역할에 대해 모든 작업에서 핸들러에게 "알릴" 수 있도록 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
종속성에 대한 추가 정보여기.