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

  

歡迎大家關注我的公眾號:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM