ansible中include_tasks和import_tasks
簡介
本文主要總結下ansible裡task呼叫的方法有哪些和它們的主要區別
隨著要管理的服務不斷增多,我們又沒將task放到roles裡,會發現playbook檔案越來越大,內容也越來越多,管理起來也很複雜。
這時我們可以將這些task分解到很多檔案中,通過include_tasks和import_tasks方法進行task之間的呼叫,說直白點這兩個方法作用就是連線不同檔案裡的task。
在本篇文章裡,假如task_A include task_B,那麼我們說task_A是父task,task_B是子task。
區別一
- import_tasks(Static)方法會在playbooks解析階段將父task變數和子task變數全部讀取並載入
- include_tasks(Dynamic)方法則是在執行play之前才會載入自己變數
可能有點懵,舉例說明
下面兩個例子是test.yml裡的task呼叫test2.yml,不同之處是一個使用import_tasks另一個使用include_tasks
import_tasks:在執行tasks之前,ansible直譯器會先載入test.yml裡的變數同時再載入test2.yml裡的變數,那麼ansible_os_family變數會有一個覆蓋現象產生,最終的引數應為“BlackHat”,所以當test.yml裡執行when語句時,ansible_os_family被判定為“BlackHat”,when的判斷結果為false,也就不會呼叫test2.yml了
執行結果如下,test2.yml裡的task都被skip了:
include_tasks:ansible會在完全執行完test.yml裡的task後才會載入test2.yml裡的變數,所以當執行when語句時,ansible_os_family的引數應為“RedHat”,此時when語句判斷結果是true,也就是test2.yml裡的tasks會被執行。
將第一張圖test.yaml裡的import_tasks換成include_tasks,執行結果如下:
我們發現自test2.yml裡的task被執行了,並且在test2.yml裡ansible_os_family的引數變為了“BlackHat”。
這就是include_tasts和import_tasks方法的第一個區別。
區別二
- include_tasks方法呼叫的檔名稱可以加變數
- import_tasks方法呼叫的檔名稱不可以有變數
這個區別比較簡單,直接上示例:
當呼叫的檔名稱有變數時,使用include_tasks方法:
能夠正常呼叫test2.yml,執行結果如下:
當使用import_tasks方法時,執行報錯。
ansible也給出了錯誤原因,當使用static include時,是不能使用變數的:
這就是include_tasts和import_tasks方法的第二個區別。
參考連結
-
https://docs.ansible.com/ansible/2.5/user_guide/playbooks_reuse.html#differences-between-static-and-dynamic
-
https://docs.ansible.com/ansible/2.5/user_guide/playbooks_conditionals.html#applying-when-to-roles-imports-and-includes
歡迎大家關注我的公眾號: