Celery 的 autodiscover_tasks

跟 Django 的整合可以參考 First steps with Django

裏面會要求你在 django app 的目錄下新增一個 celery.py,這裡有一行 app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) ,這行就是找到所有 tasks 的關鍵。找不到 task 的話,執行 python manage.py celeryd 時,不會有錯誤訊息,只在程式要執行這些 task 時印出錯務訊息,說找不到。

原始碼是在 celery/app/base.py 裡,大致就是依照 INSTALLED_APPS 列出的 package 去找 tasks,有的話就 import 進來。如果你的 celery task 沒有列在 INSTALLED_APPS 裡,或是函式不在 tasks 裡的話,可以再多加 app.autodiscover_tasks,例如 app.autodiscover_tasks([‘your_module’], related_name=’my_tasks’) ,這樣就可以引入使用了。

 

Ansible 的 callback

Callback 可以讓人有機會處理執行的結果,網路上有些人會寫自己的 callback plugin 以便統計執行結果什麼的。寫 callback plugin 的方法蠻簡單的,先繼承 CallbackBase ,然後覆寫裏面的方法即可,Ansible 有提供不少範例可供參考。

幾件事情要注意:

  • 寫 callback plugin 時:
    • 要寫 CALLBACK_TYPE,這裡如果填 ‘stdout’ 時,在 ansible.cfg 裡的 stdout_callback 也要指定為這個 callback ,這樣 callback 才會生效。
    • 要寫 CALLBACK_NAME,這是 callback 的名稱,建議最好跟檔案名稱相符,並且不要跟官方的 callback 重複。
  • 使用時:
    • ansible.cfg 裡要指定 callback_plugins,這是填路徑。可以填相對路徑也可以填絕對路徑。
    • ansible.cfg 裡要指定 callback_whitelist,這是填 callback 的名稱,可以用 ‘,’ 分隔多個 callback。顧名思義,是一個白名單的形式,有填才表示啟用 callback。
    • callback 在預設情況下只有在使用 ansible-playbook 時才會生效,如果要讓 ansible adhoc 也能用 callback,得在 ansible.cfg 裡指定 bin_ansible_callback=True 。不過,CALLBACK_TYPE=’stdout’ 的 callback plugin 是適用的。