Loading... <blockquote>在本博客中,ansible是一个系列文章,我们会尽量以通俗易懂的方式总结ansible的相关知识点。 ansible系列博文直达链接:<a href="https://www.zsythink.net/archives/tag/ansible/" target="_blank" rel="noopener">ansible轻松入门系列</a> “ansible系列”中的每篇文章都建立在前文的基础之上,所以,请按照顺序阅读这些文章,否则有可能在阅读中遇到障碍。</blockquote> 这篇文章会介绍playbook中tags的用法。 你写了一个很长的playbook,其中有很多的任务,这并没有什么问题,不过在实际使用这个剧本时,你可能只是想要执行其中的一部分任务而已,或者,你只想要执行其中一类任务而已,而并非想要执行整个剧本中的全部任务,这个时候我们该怎么办呢?我们可以借助tags实现这个需求。 见名知义,tags可以帮助我们对任务进行’打标签’的操作,当任务存在标签以后,我们就可以在执行playbook时,借助标签,指定执行哪些任务,或者指定不执行哪些任务了,这样说可能不够直观,我们来看一个小示例(为了方便示例此处只写3个任务进行举例)。 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text">---</span></div> </div> <div class=""> <div><span class="enlighter-text">- hosts: test70</span></div> </div> <div class=""> <div><span class="enlighter-text"> remote_user: root</span></div> </div> <div class=""> <div><span class="enlighter-text"> tasks:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - name: task1</span></div> </div> <div class=""> <div><span class="enlighter-text"> file:</span></div> </div> <div class=""> <div><span class="enlighter-text"> path: /testdir/t1</span></div> </div> <div class=""> <div><span class="enlighter-text"> state: touch</span></div> </div> <div class=""> <div><span class="enlighter-text"> tags: t1</span></div> </div> <div class=""> <div><span class="enlighter-text"> - name: task2</span></div> </div> <div class=""> <div><span class="enlighter-text"> file: path=/testdir/t2</span></div> </div> <div class=""> <div><span class="enlighter-text"> state=touch</span></div> </div> <div class=""> <div><span class="enlighter-text"> tags: t2</span></div> </div> <div class=""> <div><span class="enlighter-text"> - name: task3</span></div> </div> <div class=""> <div><span class="enlighter-text"> file: path=/testdir/t3</span></div> </div> <div class=""> <div><span class="enlighter-text"> state=touch</span></div> </div> <div class=""> <div><span class="enlighter-text"> tags: t3</span></div> </div> </div> </div> 如上例所示,上例的play中有3个task,每个task都有对应的tags,为了方便示例,我只是简单的把tags的值写成了t1、t2、t3,在实际的使用中,我们应该让tags的值能够见名知义,现在每个task都有了标签,假如在执行上述playbook时,我们只想执行task2,该怎样执行呢?我们可以使用如下命令 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text">ansible-playbook --tags=t2 testtag.</span><span class="enlighter-m3">yml</span></div> </div> </div> </div> 如你所见,可以使用–tags选项指定某个标签,当指定标签后,只有标签对应的任务会被执行,其他任务都不会被执行,执行上述命令后,只有task2会执行,因为task2的标签值为t2,task1和task3都不会执行,这样就达到了只执行playbook中部分任务的目的。 借助标签,除了能够指定”需要执行的任务”,还能够指定”不执行的任务”,示例命令如下。 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text">ansible-playbook --skip-tags=</span><span class="enlighter-s0">'t2'</span><span class="enlighter-text"> testtag.</span><span class="enlighter-m3">yml</span></div> </div> </div> </div> 我们可以使用 –skip-tags选项指定”不执行的任务”,执行上述命令后,task1和task3会执行,task2不会执行,因为我们已经在命令中指定了’跳过’标签t2所对应的任务,相当于使用了’排除法’,t2对应的任务被排除了,其他任务都会执行。 除了使用上例中的语法指定标签,还能够使用下例中的两种语法指定标签的值。 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text">---</span></div> </div> <div class=""> <div><span class="enlighter-text">- hosts: test70</span></div> </div> <div class=""> <div><span class="enlighter-text"> remote_user: root</span></div> </div> <div class=""> <div><span class="enlighter-text"> tasks: </span></div> </div> <div class=""> <div><span class="enlighter-text"> - name: task1</span></div> </div> <div class=""> <div><span class="enlighter-text"> file: </span></div> </div> <div class=""> <div><span class="enlighter-text"> path: /testdir/t1</span></div> </div> <div class=""> <div><span class="enlighter-text"> state: touch</span></div> </div> <div class=""> <div><span class="enlighter-text"> tags:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - t1</span></div> </div> <div class=""> <div><span class="enlighter-text"> - name: task2</span></div> </div> <div class=""> <div><span class="enlighter-text"> file: path=/testdir/t2</span></div> </div> <div class=""> <div><span class="enlighter-text"> state=touch</span></div> </div> <div class=""> <div><span class="enlighter-text"> tags: </span><span class="enlighter-g1">[</span><span class="enlighter-s0">'t2'</span><span class="enlighter-g1">]</span></div> </div> </div> </div> 之前描述的三种语法都可以指定标签,不过上例中,每个任务只有一个标签,其实,我们可以为每个任务添加多个标签,三种语法添加多个标签的示例如下 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text">语法一:</span></div> </div> <div class=""> <div><span class="enlighter-text">tags:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - testtag</span></div> </div> <div class=""> <div><span class="enlighter-text"> - t1</span></div> </div> <div class=""> <div></div> </div> <div class=""> <div><span class="enlighter-text">语法二:</span></div> </div> <div class=""> <div><span class="enlighter-text">tags: tag1,t1</span></div> </div> <div class=""> <div></div> </div> <div class=""> <div><span class="enlighter-text">语法三:</span></div> </div> <div class=""> <div><span class="enlighter-text">tags: </span><span class="enlighter-g1">[</span><span class="enlighter-s0">'tagtest'</span><span class="enlighter-text">,</span><span class="enlighter-s0">'t2'</span><span class="enlighter-g1">]</span></div> </div> </div> </div> 上述示例的语法一使用了YAML块序列的语法格式指定多个标签,语法二与语法三都是在原来语法的基础上,使用’逗号’隔开多个标签。 如下例所示,不同的任务可以使用相同的标签。 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text">---</span></div> </div> <div class=""> <div><span class="enlighter-text">- hosts: test70</span></div> </div> <div class=""> <div><span class="enlighter-text"> remote_user: root</span></div> </div> <div class=""> <div><span class="enlighter-text"> tasks:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - name: install httpd package</span></div> </div> <div class=""> <div><span class="enlighter-text"> tags: httpd,package</span></div> </div> <div class=""> <div><span class="enlighter-text"> yum:</span></div> </div> <div class=""> <div><span class="enlighter-text"> name=httpd</span></div> </div> <div class=""> <div><span class="enlighter-text"> state=latest</span></div> </div> <div class=""> <div></div> </div> <div class=""> <div><span class="enlighter-text"> - name: start up httpd service</span></div> </div> <div class=""> <div><span class="enlighter-text"> tags: httpd,service</span></div> </div> <div class=""> <div><span class="enlighter-text"> service:</span></div> </div> <div class=""> <div><span class="enlighter-text"> name: httpd</span></div> </div> <div class=""> <div><span class="enlighter-text"> state: started</span></div> </div> </div> </div> 上例中每个任务都有多个标签,而且上例中两个任务都有一个共同的标签,就是httpd标签,所以,当我们执行’ansible-playbook –tags=httpd testhttpd.yml’,上述两个任务都会执行。 上例的play中的所有任务都有共同的httpd标签,像这种情况,我们可以把httpd标签提取出来,写在play中,示例如下。 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text">---</span></div> </div> <div class=""> <div><span class="enlighter-text">- hosts: test70</span></div> </div> <div class=""> <div><span class="enlighter-text"> remote_user: root</span></div> </div> <div class=""> <div><span class="enlighter-text"> tags: httpd</span></div> </div> <div class=""> <div><span class="enlighter-text"> tasks:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - name: install httpd package</span></div> </div> <div class=""> <div><span class="enlighter-text"> tags: </span><span class="enlighter-g1">[</span><span class="enlighter-s0">'package'</span><span class="enlighter-g1">]</span></div> </div> <div class=""> <div><span class="enlighter-text"> yum:</span></div> </div> <div class=""> <div><span class="enlighter-text"> name=httpd</span></div> </div> <div class=""> <div><span class="enlighter-text"> state=latest</span></div> </div> <div class=""> <div></div> </div> <div class=""> <div><span class="enlighter-text"> - name: start up httpd service</span></div> </div> <div class=""> <div><span class="enlighter-text"> tags:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - service</span></div> </div> <div class=""> <div><span class="enlighter-text"> service:</span></div> </div> <div class=""> <div><span class="enlighter-text"> name: httpd</span></div> </div> <div class=""> <div><span class="enlighter-text"> state: started</span></div> </div> </div> </div> 当tags写在play中而非task中时,play中的所有task会继承当前play中的tags,而上例中,两个任务都会继承httpd标签,同时还有拥有自己的标签。 在调用标签时,也可以一次性指定多个标签,调用多个标签需要用逗号隔开,命令如下 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text">ansible-playbook --tags package,service testhttpd.</span><span class="enlighter-m3">yml</span></div> </div> </div> </div> 在调用标签之前,如果你想要概览一下playbook中都有哪些标签,可以使用 ‘ –list-tags’ 选项,示例如下 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text">ansible-playbook --list-tags testhttpd.</span><span class="enlighter-m3">yml</span></div> </div> </div> </div> 其实,ansible还预置了5个特殊tag,这5个特殊tag分别为 always never(2.5版本中新加入的特殊tag) tagged untagged all 当我们把任务的tags的值指定为always时,那么这个任务就总是会被执行,除非你使用’–skip-tags’选项明确指定不执行对应的任务,这样说可能不容易理解,不如看个小示例,示例如下 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text">---</span></div> </div> <div class=""> <div><span class="enlighter-text">- hosts: test70</span></div> </div> <div class=""> <div><span class="enlighter-text"> remote_user: root</span></div> </div> <div class=""> <div><span class="enlighter-text"> tasks:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - name: task1</span></div> </div> <div class=""> <div><span class="enlighter-text"> file:</span></div> </div> <div class=""> <div><span class="enlighter-text"> path: /testdir/t1</span></div> </div> <div class=""> <div><span class="enlighter-text"> state: touch</span></div> </div> <div class=""> <div><span class="enlighter-text"> tags:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - t1</span></div> </div> <div class=""> <div><span class="enlighter-text"> - name: task2</span></div> </div> <div class=""> <div><span class="enlighter-text"> file: path=/testdir/t2</span></div> </div> <div class=""> <div><span class="enlighter-text"> state=touch</span></div> </div> <div class=""> <div><span class="enlighter-text"> tags: </span><span class="enlighter-g1">[</span><span class="enlighter-s0">'t2'</span><span class="enlighter-g1">]</span></div> </div> <div class=""> <div><span class="enlighter-text"> - name: task3</span></div> </div> <div class=""> <div><span class="enlighter-text"> file: path=/testdir/t3</span></div> </div> <div class=""> <div><span class="enlighter-text"> state=touch</span></div> </div> <div class=""> <div><span class="enlighter-text"> tags: t3,always</span></div> </div> </div> </div> 上例中,task3的标签有两个,t3和always,那么我们来执行一下这个playbook,假设,我只想运行上述playbook中标签为t1的任务,那么我会执行如下图中的命令 <img class=" lazyloaded" src="https://www.zsythink.net/wp-content/uploads/2018/05/051618_0320_1.png" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2018/05/051618_0320_1.png" style=""> 如图所示,在执行上述playbook时,我只指定了’t1’,正常情况下应该只执行’t1’对应的任务,也就是应该只执行task1,但是实际上执行了task1和task3,这是因为task3的标签的值包含always关键字,所以即使task3对应的标签没有被调用,task3也会执行,这就是always的作用。 如果你不想执行标签中包含always的任务,你可以使用’–skip-tags’选项明确指定跳过它们,仍然以上例的playbook为例,假设我们就是不想执行task3,我们可以执行如下命令 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text">ansible-playbook --skip-tags always testtag.</span><span class="enlighter-m3">yml</span></div> </div> </div> </div> 但是需要注意,如果上述play中有多个任务都有always标签,那么上述命令将会跳过所有包含always标签的任务,如果上例中的play中的多个任务都有always标签,则可以使用如下命令只跳过task3,其他带有always标签的任务不会跳过,前提是task3有除了always以外的自定义标签。 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text">ansible-playbook --skip-tags t3 testtag.</span><span class="enlighter-m3">yml</span></div> </div> </div> </div> 在2.5版本的ansible中,引入了新的特殊标签 ‘never’,从字面上理解,never的作用应该与always正好相反,由于我当前使用的ansible版本为2.4(还没有引入never标签),所以当指定任务的标签为never时,貌似被ansible当做了自定义标签,所以如果你安装了2.5版本的ansible,可以尝试一下never标签的作用,由于还没有实际使用过2.5版本,所以此处暂时不进行示例。 剩余的三个特殊标签分别为 tagged、untagged、all 这三个特殊标签并非像always一样,always作为标签值存在,而这三个特殊标签则是在调用标签时使用,示例如下 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text">ansible-playbook --tags tagged testtag.</span><span class="enlighter-m3">yml</span></div> </div> </div> </div> 上述命令表示只执行有标签的任务,没有任何标签的任务不会被执行。 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text">ansible-playbook --skip-tags tagged testtag.</span><span class="enlighter-m3">yml</span></div> </div> </div> </div> 上述命令表示跳过包含标签的任务,即使对应的任务包含always标签,也会被跳过。 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text">ansible-playbook --tags untagged testtag.</span><span class="enlighter-m3">yml</span></div> </div> </div> </div> 上述命令表示只执行没有标签的任务,但是如果某些任务包含always标签,那么这些任务也会被执行。 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text">ansible-playbook --skip-tags untagged testtag.</span><span class="enlighter-m3">yml</span></div> </div> </div> </div> 上述命令表示跳过没有标签的任务。 特殊标签all表示所有任务会被执行,不用指定,默认情况下就是使用这个标签。 关于标签的使用就先总结到这里,希望能够对你有所帮助~ 转载自朱双印日志https://www.zsythink.net/archives/2641 Last modification:May 29, 2024 © Allow specification reprint Like 如果觉得我的文章对你有用,请随意赞赏