include_tasks 與 import_tasks 的差異

Ansible 2.4 以後引入了 include_tasks 與 import_tasks ,那這兩者的差異在哪裡呢?

在 Ansible 的文件網站裡有說明這部份

另外也可參閱:What’s the difference between include_tasks and import_tasks?

簡單的說明如下:

Includes 是動態的,執行到中途,再去載入,所以可以搭配變數做出變化,含括不同的檔案。例如

- include_tasks: prerequisites_{{ ansible_os_family | lower }}.yml

限制如下

  • --list-tags 無法顯示被含括檔案裡的 tags
  • --list-tasks 無法顯示被含括檔案裡的 tasks
  • 無法使用通知去觸發被含括檔案裡的 handler
  • 如果打算起始的 task 是在被含括檔案裡的話,那麼無法使用 --start-at-task 來指定起始的 task

Imports 是靜態的,在執行前就載入了,這就無法搭配變數做出變化。

- import_tasks: prepare_filesystem.yml
- import_tasks: install_prerequisites.yml
- import_tasks: install_application.yml

限制如下

  • 無法搭配 with_* 或 loop 來使用
  • 無法引入檔名相依於變數的檔案。

這兩種方法各有其優缺點, What’s the difference between include_tasks and import_tasks? 的這個回覆就說明的很仔細

我自己目前是都使用 include_tasks 比較多,未來應該要好好想一想,什麼時候用 import_tasks 會比較好些。