
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
,其中一個處理程序用於重新啟動 apache,另一個處理程序用於重新載入 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
有關依賴項的更多信息這裡。