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,其中一個處理程序用於重新啟動 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

有關依賴項的更多信息這裡

相關內容