Ansible有兩種可重用內容的操作模式:動態和靜態。
在Ansible 2.0階段使用static來設置操作模式,Ansible 2.4則引入了include和import的概念。
如果您使用import*
包含Task(import_playbook
,import_tasks
等),它將是靜態的。
如果您使用include*
包含Task(include_tasks
,include_role
等),它將是動態的。
使用include包含Task(用于task文件和Playbook級包括)仍然可用,但現在被認為已被棄用。
靜態和動態之間的差異
Ansible預處理Playbook解析期間的所有靜態導入,而動態包含是在運行期間遇到該任務時處理的。
當涉及Ansible task選項,如tags和when:
對于靜態導入,父任務選項將被復制到import中包含的所有子任務。
對于動態包含,任務選項僅在評估時應用于動態任務,不會被復制到子任務。
優缺點
使用include*
語句的主要優點是循環。當循環與include*
一起使用時,包含的任務或角色將為循環中的每個項目執行一次。
與import*
語句相比,使用include*
有一些限制:
- 僅存在于動態包含內的標簽不會顯示在-list-tags輸出中。
- 僅存在于動態包含內的任務不會顯示在-list-tasks輸出中。
- 您不能使用notify來觸發來自動態包含內部的處理程序名稱。
- 您不能使用--start-at-task開始執行動態包含內的任務。
與動態相比,使用import*
也可能有一些限制:
- 如上所述,循環不能用于導入。
- 當使用目標文件或角色名稱的變量時,不能使用來自庫存源(主機/組變量等)的變量。
總而言之,沒有使用with的包含,就使用import,使用了with,那就用include。