ansible進階小技巧

用ansible寫playbook的朋友可能會發現,當配置工作很多時,如果在中間過程出錯了,修改后想重新執行,前面的一大堆步驟讓人感覺很煩躁。雖然提供了“retry”文件,但是卻只是根據host來判斷重新執行,仍然不夠方便;又或者,中間的某些步驟特別耗時,比如下載一個很大的數據包,每次執行特別浪費時間,想要特別的跳過。怎么辦?我猜你就是把不需要的部分給注釋掉了。有沒有更好的辦法呢?

當然,現在流行的ansible有提供一種方法解決這個問題。

??? ansible的playbool中有一個關鍵字,叫做tags。tags是什么?就是打標簽。tags可以和一個play(就是很多個task)或者一個task進行捆綁。然后,ansible-playbook提供了“–skip-tags”和“–tags” 來指明是跳過特定的tags還是執行特定的tags。

下面請看例子。

  1. <pre?class=”plain”?name=”code”>#?example?1?test1.yml??
  2. –?hosts:?test-agent??
  3. ??tasks:??
  4. ????–?command:?echo?test1??
  5. ??????tags:???
  6. ?????????–?test1??
  7. ????–?command:?echo?test2??
  8. ??????tags:???
  9. ?????????–?test2??
  10. ????–?command:?echo?test3??
  11. ??????tags:???
  12. ?????????–?test3??

 


當執行? ansible-playbook test1.yml –tags=”test1,test3″? ,則只會執行 test1和test3的echo命令。

當執行? ansible-playbook test1.yml –skip-tags=”test2″? ,同樣只會執行 test1和test3的echo命令。

同理可以適用于play,請看例子

  1. #?example?2?test2.yml??
  2. –?hosts:?test-agent1??
  3. ??tags:???
  4. ?????–?play1??
  5. ??tasks:??
  6. ?????–?command:?echo?This?is??
  7. ?????–?command:?echo?agent1??
  8. –?hosts:?test-agent2??
  9. ??tags:???
  10. ?????–?play2??
  11. ??tasks:??
  12. ?????–?command:?echo?This?is??
  13. ?????–?command:?echo?agent2??
  14. –?hosts:?test-agent3??
  15. ??tags:???
  16. ?????–?play3??
  17. ??tasks:??
  18. ?????–?command:?echo?This?is??
  19. ?????–?command:?echo?agent3??

 

當執行? ansible-playbook test2.yml –tags=”play1,play3″? ,則只會執行 play1和play3的tasks。

當執行? ansible-playbook test2.yml –skip-tags=”play2″? ,同樣只會執行 test1和test3的tasks。

同理還有include和role

  1. –?include:?foo.yml?tags=web,foo
  1. roles:
  2. ??–?{?role:?webserver,?port:?5000,?tags:?[?‘web’,?‘foo’?]?}

你肯定注意到了,這個的一個include和role,同時打了多個tags。是的,這是允許的,而且不同的tags名稱是等效的。多個tags對play和task同樣適用。–skip-tags=”web”和–skip-tags=”foo”,效果是一樣的。如果是–skip-tag=”web,foo”呢?效果還是一樣的。呵呵開玩笑的,我沒有試過,歡迎你試一下。

既然一個job可以有多個tags,那么多個job是否可以有同一個tags呢?答案是肯定的。而且,沒有開玩笑。不行你試試。下面舉例

 

  1. <pre?class=”plain”?name=”code”>#?example?3?test3.yml??
  2. –?command:?echo?task111??
  3. ??tags:??
  4. ?????–?task1??
  5. –?command:?echo?task112??
  6. ??tags:??
  7. ?????–?task1??
  8. –?command:?echo?task333??
  9. ??tags:??
  10. ?????–?task3??
  11. –?command:?echo?task222??
  12. ??tags:??
  13. ?????–?task2??

當執行? ansible-playbook test2.yml –skip-tags=”play1″? ,則只會執行 task3和task2的tasks,task1中的2個task都被skip了。

當執行? ansible-playbook test2.yml –tags=”task2,task3″? ,仍然只會執行 task3和task2的tasks,并且請注意,是按照playbooks中代碼的順序執行,而不是–tags中參數的順序執行。

ansible是根據輸入的tags的參數,與playbook中進行比較,按照playbook的執行順序,跳過或執行特定的tags。對于沒有打tags的部分,沒有影響,正常順序執行。

好了,ansible的tags鄙人就了解這么多,歡迎大家使用tasks管理ansible的playbook。

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/100266

(2)
單爆手單爆手
上一篇 2018-06-03
下一篇 2018-06-03

相關推薦

  • shell腳本編寫的整理(1)

    1、shell腳本的特點及用途
    2、全局變量、局部變量、本地變量
    3、位置變量、特殊變量、只讀變量
    4、退出狀態、算數運算、賦值
    5、邏輯運算、條件測試、數值測試
    6、文件測試、文件權限測試、文件屬性測試
    7、read命令、bash的配置

    2018-04-14
  • AWK

    ### awk awk分為nawk,gawk 我們shell中常用的awk 其版本是gawk “`AWK會把file中的每一行(記錄/可以指定分隔符),讀入空間中并默認以空白(TAB\space\\n)等分割成幾個字段,每個字段用$#表示$0表示整行本身“` awk [Option] ‘program’ file option -F:…

    Linux筆記 2018-05-20
  • 關于shell腳本編程的基礎知識理解介紹

    shell: ? ? Shell 是一個用 C 語言編寫的程序,它是用戶使用 Linux 的橋梁。Shell 既是一種命令語言,又是一種程序設計語言。 shell腳本:是一種為shell編寫的腳本程序,其編輯風格可以分為過程式和對象式。 過程式:是以指令為中心且數據服務于指令。 對象式:是以數據為中心且指令服務于數據。 shell基本編程概念和環境: She…

    2018-04-16
  • Centos7默認網卡名如何修改成eth*

    Centos7 新添加網卡默認的識別名ens*,用起來很不習慣,為了方便系統的統一化管理,如何將默認命名規則改成eth*?

    2018-04-29
  • bash的工作特性之命令執行狀態返回值和命令行展開所涉及的內容及其示例演示。

    bash的基礎特性: 1.命令補全: shell程序在接收到用戶執行命令的請求時,分析完成之后,最左側的字符串會被當作命令; 命令查找機制: 根據PATH環境變量中設定的目錄,自左向右逐個搜多目錄下的文件名 給定的打頭字符串,如果能唯一標識某命令程序文件,則直接補全, ? ? ? ? ? ? ? ? ? ? ?如果不能唯一標識某命令程序文件,再tab一次會給…

    Linux筆記 2018-05-20
  • Linux中用戶、組和權限

    用戶user Linux用戶:Username/UID 管理員:root,0 普通用戶: 系統用戶:1-499 交互式登錄:登錄用戶500+,1000+9(CentOs7) 組group? Linux組:Groupname/GID 管理員組:root,0(私有組) 普通組:系統組:1-499,1-999;普通組:500+,1000+ Linux組的類別:1.…

    Linux筆記 2018-04-05
欧美性久久久久