用ansible寫playbook的朋友可能會發現,當配置工做不少時,若是在中間過程出錯了,修改後想從新執行,前面的一大堆步驟讓人感受很煩躁。雖然提供了「retry」文件,可是卻只是根據host來判斷從新執行,仍然不夠方便;又或者,中間的某些步驟特別耗時,好比下載一個很大的數據包,每次執行特別浪費時間,想要特別的跳過。怎麼辦?我猜你就是把不須要的部分給註釋掉了。有沒有更好的辦法呢?web
固然,如今流行的ansible有提供一種方法解決這個問題。app
ansible的playbool中有一個關鍵字,叫作tags。tags是什麼?就是打標籤。tags能夠和一個play(就是不少個task)或者一個task進行捆綁。而後,ansible-playbook提供了「--skip-tags」和「--tags」 來指明是跳過特定的tags仍是執行特定的tags。oop
下面請看例子。this
當執行 ansible-playbook test1.yml --tags="test1,test3" ,則只會執行 test1和test3的echo命令。url
當執行 ansible-playbook test1.yml --skip-tags="test2" ,一樣只會執行 test1和test3的echo命令。spa
同理能夠適用於play,請看例子.net
當執行 ansible-playbook test2.yml --tags="play1,play3" ,則只會執行 play1和play3的tasks。code
當執行 ansible-playbook test2.yml --skip-tags="play2" ,一樣只會執行 test1和test3的tasks。orm
同理還有include和roleserver
你確定注意到了,這個的一個include和role,同時打了多個tags。是的,這是容許的,並且不一樣的tags名稱是等效的。多個tags對play和task一樣適用。--skip-tags="web"和--skip-tags="foo",效果是同樣的。若是是--skip-tag="web,foo"呢?效果仍是同樣的。呵呵開玩笑的,我沒有試過,歡迎你試一下。
既然一個job能夠有多個tags,那麼多個job是否能夠有同一個tags呢?答案是確定的。並且,沒有開玩笑。不行你試試。下面舉例
當執行 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的部分,沒有影響,正常順序執行。