ansible中include_tasks和import_tasks

簡介

本文主要總結下ansible裏task調用的方法有哪些和它們的主要區別html

​隨着要管理的服務不斷增多,咱們又沒將task放到roles裏,會發現playbook文件愈來愈大,內容也愈來愈多,管理起來也很複雜。app

這時咱們能夠將這些task分解到不少文件中,經過include_tasks和import_tasks方法進行task之間的調用,說直白點這兩個方法做用就是鏈接不一樣文件裏的task。ide

在本篇文章裏,假如task_A include task_B,那麼咱們說task_A是父task,task_B是子task。ui

區別一

  • import_tasks(Static)方法會在playbooks解析階段將父task變量和子task變量所有讀取並加載
  • include_tasks(Dynamic)方法則是在執行play以前纔會加載本身變量

可能有點懵,舉例說明spa

下面兩個例子是test.yml裏的task調用test2.yml,不一樣之處是一個使用import_tasks另外一個使用include_tasks 3d

import_tasks:在執行tasks以前,ansible解釋器會先加載test.yml裏的變量同時再加載test2.yml裏的變量,那麼ansible_os_family變量會有一個覆蓋現象產生,最終的參數應爲「BlackHat」,因此當test.yml裏執行when語句時,ansible_os_family被斷定爲「BlackHat」,when的判斷結果爲false,也就不會調用test2.yml了htm

執行結果以下,test2.yml裏的task都被skip了:blog

include_tasks:ansible會在徹底執行完test.yml裏的task後纔會加載test2.yml裏的變量,因此當執行when語句時,ansible_os_family的參數應爲「RedHat」,此時when語句判斷結果是true,也就是test2.yml裏的tasks會被執行。ip

將第一張圖test.yaml裏的import_tasks換成include_tasks,執行結果以下:it

咱們發現自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

  

歡迎你們關注個人公衆號:

相關文章
相關標籤/搜索