这篇文章会介绍playbook中tags的用法。

你写了一个很长的playbook,其中有很多的任务,这并没有什么问题,不过在实际使用这个剧本时,你可能只是想要执行其中的一部分任务而已,或者,你只想要执行其中一类任务而已,而并非想要执行整个剧本中的全部任务,这个时候我们该怎么办呢?我们可以借助tags实现这个需求。

见名知义,tags可以帮助我们对任务进行'打标签'的操作,当任务存在标签以后,我们就可以在执行playbook时,借助标签,指定执行哪些任务,或者指定不执行哪些任务了,这样说可能不够直观,我们来看一个小示例(为了方便示例此处只写3个任务进行举例)。

---
- hosts: test70remote_user: roottasks:- name: task1file:path: /testdir/t1state: touchtags: t1- name: task2file: path=/testdir/t2state=touchtags: t2- name: task3file: path=/testdir/t3state=touchtags: t3

如上例所示,上例的play中有3个task,每个task都有对应的tags,为了方便示例,我只是简单的把tags的值写成了t1、t2、t3,在实际的使用中,我们应该让tags的值能够见名知义,现在每个task都有了标签,假如在执行上述playbook时,我们只想执行task2,该怎样执行呢?我们可以使用如下命令

ansible-playbook --tags=t2 testtag.yml

如你所见,可以使用--tags选项指定某个标签,当指定标签后,只有标签对应的任务会被执行,其他任务都不会被执行,执行上述命令后,只有task2会执行,因为task2的标签值为t2,task1和task3都不会执行,这样就达到了只执行playbook中部分任务的目的。

借助标签,除了能够指定"需要执行的任务",还能够指定"不执行的任务",示例命令如下。

ansible-playbook --skip-tags='t2' testtag.yml

我们可以使用 --skip-tags选项指定"不执行的任务",执行上述命令后,task1和task3会执行,task2不会执行,因为我们已经在命令中指定了'跳过'标签t2所对应的任务,相当于使用了'排除法',t2对应的任务被排除了,其他任务都会执行。

除了使用上例中的语法指定标签,还能够使用下例中的两种语法指定标签的值。

---
- hosts: test70remote_user: roottasks: - name: task1file: path: /testdir/t1state: touchtags:- t1- name: task2file: path=/testdir/t2state=touchtags: ['t2']

之前描述的三种语法都可以指定标签,不过上例中,每个任务只有一个标签,其实,我们可以为每个任务添加多个标签,三种语法添加多个标签的示例如下

语法一:
tags:- testtag- t1语法二:
tags: tag1,t1语法三:
tags: ['tagtest','t2']

上述示例的语法一使用了YAML块序列的语法格式指定多个标签,语法二与语法三都是在原来语法的基础上,使用'逗号'隔开多个标签。

如下例所示,不同的任务可以使用相同的标签。

---
- hosts: test70remote_user: roottasks:- name: install httpd packagetags: httpd,packageyum:name=httpdstate=latest- name: start up httpd servicetags: httpd,serviceservice:name: httpdstate: started

上例中每个任务都有多个标签,而且上例中两个任务都有一个共同的标签,就是httpd标签,所以,当我们执行'ansible-playbook --tags=httpd testhttpd.yml',上述两个任务都会执行。

上例的play中的所有任务都有共同的httpd标签,像这种情况,我们可以把httpd标签提取出来,写在play中,示例如下。

---
- hosts: test70remote_user: roottags: httpdtasks:- name: install httpd packagetags: ['package']yum:name=httpdstate=latest- name: start up httpd servicetags:- serviceservice:name: httpdstate: started

当tags写在play中而非task中时,play中的所有task会继承当前play中的tags,而上例中,两个任务都会继承httpd标签,同时还有拥有自己的标签。

在调用标签时,也可以一次性指定多个标签,调用多个标签需要用逗号隔开,命令如下

ansible-playbook --tags package,service testhttpd.yml

在调用标签之前,如果你想要概览一下playbook中都有哪些标签,可以使用 ' --list-tags' 选项,示例如下

ansible-playbook --list-tags testhttpd.yml

其实,ansible还预置了5个特殊tag,这5个特殊tag分别为

  • always
  • never(2.5版本中新加入的特殊tag)
  • tagged
  • untagged
  • all

当我们把任务的tags的值指定为always时,那么这个任务就总是会被执行,除非你使用'--skip-tags'选项明确指定不执行对应的任务,这样说可能不容易理解,不如看个小示例,示例如下

---
- hosts: test70remote_user: roottasks:- name: task1file:path: /testdir/t1state: touchtags:- t1- name: task2file: path=/testdir/t2state=touchtags: ['t2']- name: task3file: path=/testdir/t3state=touchtags: t3,always

上例中,task3的标签有两个,t3和always,那么我们来执行一下这个playbook,假设,我只想运行上述playbook中标签为t1的任务,那么我会执行如下图中的命令

如图所示,在执行上述playbook时,我只指定了't1',正常情况下应该只执行't1'对应的任务,也就是应该只执行task1,但是实际上执行了task1和task3,这是因为task3的标签的值包含always关键字,所以即使task3对应的标签没有被调用,task3也会执行,这就是always的作用。

如果你不想执行标签中包含always的任务,你可以使用'--skip-tags'选项明确指定跳过它们,仍然以上例的playbook为例,假设我们就是不想执行task3,我们可以执行如下命令

ansible-playbook --skip-tags always testtag.yml

但是需要注意,如果上述play中有多个任务都有always标签,那么上述命令将会跳过所有包含always标签的任务,如果上例中的play中的多个任务都有always标签,则可以使用如下命令只跳过task3,其他带有always标签的任务不会跳过,前提是task3有除了always以外的自定义标签。

ansible-playbook --skip-tags t3 testtag.yml

在2.5版本的ansible中,引入了新的特殊标签 'never',从字面上理解,never的作用应该与always正好相反,由于我当前使用的ansible版本为2.4(还没有引入never标签),所以当指定任务的标签为never时,貌似被ansible当做了自定义标签,所以如果你安装了2.5版本的ansible,可以尝试一下never标签的作用,由于还没有实际使用过2.5版本,所以此处暂时不进行示例。

剩余的三个特殊标签分别为 tagged、untagged、all

这三个特殊标签并非像always一样,always作为标签值存在,而这三个特殊标签则是在调用标签时使用,示例如下

ansible-playbook --tags tagged testtag.yml

上述命令表示只执行有标签的任务,没有任何标签的任务不会被执行。

ansible-playbook --skip-tags tagged testtag.yml

上述命令表示跳过包含标签的任务,即使对应的任务包含always标签,也会被跳过。

ansible-playbook --tags untagged testtag.yml

上述命令表示只执行没有标签的任务,但是如果某些任务包含always标签,那么这些任务也会被执行。

ansible-playbook --skip-tags untagged testtag.yml

上述命令表示跳过没有标签的任务。

特殊标签all表示所有任务会被执行,不用指定,默认情况下就是使用这个标签。

关于标签的使用就先总结到这里,希望能够对你有所帮助~

Ansible tags 的用法详解相关推荐

  1. (转)getElementByID getElementsByName getElementsByTagName用法详解

    (转)getElementByID getElementsByName getElementsByTagName用法详解 getElementByID getElementsByName getEle ...

  2. getElementsByTagName用法详解

    getElementByID getElementsByName getElementsByTagName用法详解 getElementByID getElementsByName getElemen ...

  3. Django基础(11): 表单集合Formset的高级用法详解

    Formset(表单集)是多个表单的集合.Formset在Web开发中应用很普遍,它可以让用户在同一个页面上提交多张表单,一键添加多个数据,比如一个页面上添加多个用户信息.今天小编我就介绍下Djang ...

  4. addslashes是用PHP,php addslashes用法详解

    php addslashes用法详解2021-03-17 02:57:22 php addslashes的用法是:首先创建一个PHP示例文件:然后通过"addslashes('Shangha ...

  5. CSS3中font-face属性的用法详解

    CSS3中font-face属性的用法详解 @font-face是CSS3中的一个模块,主要是把自定义的Web字体嵌入到你的网页中,随着@font-face模块的出现,我们在Web的开发中使用字体不怕 ...

  6. python argv 详解_Python3 sys.argv[ ]用法详解

    sys.argv[]说白了就是一个从程序外部获取参数的桥梁,这个"外部"很关键,因为我们从外部取得的参数可以是多个,所以获得的是一个列表(list),也就是说sys.argv其实可 ...

  7. oracle中的exists 和 not exists 用法详解

    from:http://blog.sina.com.cn/s/blog_601d1ce30100cyrb.html oracle中的exists 和 not exists 用法详解 (2009-05- ...

  8. ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多)

    ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多) https://blog.csdn.net/qq_25221835/article/details/82762416 post ...

  9. python的继承用法_【后端开发】python中继承有什么用法?python继承的用法详解

    本篇文章给大家带来的内容是关于python中继承有什么用法?python继承的用法详解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 面向对象三大特征 1.封装:根据职责将属性和方法 ...

  10. C++中substr()函数用法详解

    C++中substr()函数用法详解 原型: string substr (size_t pos = 0, size_t len = npos) const; 返回一个新构造的string对象,其值初 ...

最新文章

  1. Androidx CoordinatorLayout 和 AppBarLayout 实现折叠效果(通俗的说是粘性头效果)
  2. 后缀数组 ---- 2018~2019icpc焦作H题[后缀数组+st表+二分+单调栈]
  3. python 导入包的路径_关于Python包导入的知识点你知道吗?
  4. Linux主机WordPress伪静态设置方法
  5. 使用Maven 实现打包生成一个可执行jar包:附详细配置解释说明
  6. 阿里云服务器的安装以及使用
  7. [单刷 APUE 系列] 第十四章——高级 I/O
  8. 【招聘(深圳)】TCL通讯科技控股有限公司
  9. 通用的MIME类型:application/octet-stream
  10. redis相关(搭建和数据落盘)
  11. Html body的滚动条禁止与启用
  12. #if _MSC_VER 1000 #pragma once #endif
  13. React 源码剖析系列 - 不可思议的 react diff
  14. 2013蓝桥杯C++B:第39阶台阶(递归法);前缀判断
  15. java设计模式(四)--单例模式
  16. WiFi 扫描处理过程
  17. (转)江南愤青丨丨监管办法之后,网贷一地鸡毛(2016年)
  18. DS_Store文件泄漏
  19. 优思学院|FMEA 写不好?原因竟然是...
  20. 【分步入门指南】如何在10分钟内设置EOS钱包和帐户

热门文章

  1. Technorati 正在走向衰落
  2. 成立一年,手游交叉推广交易社区Chartboost已有8000款游戏加入
  3. MySQL基本操作四:数据的查询
  4. 川的第一份博客——内容定义
  5. .then()方法是异步执行
  6. python对时间序列的DataFrame数据按时间段进行切分求和
  7. Revealing ecosystem services relationships and their driving factors for five basins of Beijing (2)
  8. 杀人游戏规则总结(转自龙的天空)
  9. SaaS、PaaS、IaaS是什么意思
  10. 星际蜗牛8盘位装机记录 蜗牛C双全 益衡7030电源