用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的部分,没有影响,正常顺序执行。