你写了一个很长的playbook,其中有很多的任务,这并没有什么问题,不过在实际使用这个剧本时,你可能只是想要执行其中的一部分任务而已,或者,你只想要执行其中一类任务而已,而并非想要执行整个剧本中的全部任务,这个时候我们该怎么办呢?我们可以借助tags实现这个需求。
  见名知义,tags可以帮助我们对任务进行“打标签”的操作,当任务存在标签以后,我们就可以在执行playbook时,借助标签,指定执行哪些任务,或者指定不执行哪些任务了,这样说可能不够直观,我们来看一个小示例(为了方便示例此处只写3个任务进行举例)。

---
- hosts: 192.168.10.3
remote_user: root
tasks:
- name: task1
file:
path: /test/t1
state: touch
tags: t1
- name: task2
file:
path: /test/t2
state: touch
tags: t2
- name: task3
file:
path: /test/t3
state: touch
tags: t3

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

[root@ansible-control playbook]# ansible-playbook --tags=t2 play5.yml

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

[root@ansible-control playbook]# ansible-playbook --skip-tags='t2' play5.yml

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

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

---
- hosts: 192.168.10.3
remote_user: root
tasks:
- name: task1
file:
path: /test/t4
state: touch
tags:
- t4
- name: task2
file:
path: /test/t5
state: touch
tags: ['t5']

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

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

上述示例的语法一使用了YAML块序列的语法格式指定多个标签,语法二与语法三都是在原来语法的基础上,使用"逗号"隔开多个标签。
如下例所示,不同的任务可以使用相同的标签:

---
- hosts: 192.168.10.3
remote_user: root
tasks:
- name: INSTALL HTTPD PACKEGE
tags: httpd,packege
yum:
name: httpd
state: latest - name: START UP HTTPD SERVICE
tags: httpd,service
service:
name: httpd
state: started

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

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

---
- hosts: 192.168.10.3
remote_user: root
tags: httpd #tags一定要放在tasks里面,否则报错。
tasks:
- name: INSTALL HTTPD PACKEGE
tags: packege
yum:
name: httpd
state: latest
- name: START UP HTTPD SERVICE
tags: service
service:
name: httpd
state: started

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

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

[root@ansible-control playbook]# ansible-playbook --tags packege,service play6.yml

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

[root@ansible-control playbook]# ansible-playbook --list-tags play6.yml

 ansible中预置的5个特殊的tag:

  always

  never

  tagged

  untagged

  all

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

---
- hosts: 192.168.10.2
remote_user: root
tasks:
- name: taks1
file:
path: /test/t1
state: touch
tags: t1
- name: tasks2
file:
path: /test/t2
state: touch
tags: ['t2']
- name: task3
file:
path: /test/t3
state: touch
tags:
- t3
- always

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

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

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

[root@ansible-control playbook]# ansible-playbook --skip-tags always play7.yml

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

[root@ansible-control playbook]# ansible-playbook --skip-tags t3 play7.yml

never标签的含义,顾名思义,它是和always标签恰恰相反的,表示总是不执行,示例如下:

---
- hosts: 192.168.10.2
remote_user: root
tasks:
- name: taks1
file:
path: /test/t1
state: touch
tags: t1
- name: tasks2
file:
path: /test/t2
state: touch
tags: ['t2']
- name: task3
file:
path: /test/t3
state: touch
tags:
- t3
- never  

 当我们执行这个剧本时,发现插入了never标签的剧本,默认不执行:只有标签t1  t2的tasks执行了。

tagged标签,表示只执行有标签的任务,没有任何标签的任务将不会被执行:

[root@ansible-control playbook]# ansible-playbook --tags tagged play7.yml

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

[root@ansible-control playbook]# ansible-playbook --skip-tags tagged play7.yml

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

[root@ansible-control playbook]# ansible-playbook --tags untagged play7.yml

下述命令表示跳过没有标签的任务执行,也就是执行有标签的任务:

[root@ansible-control playbook]# ansible-playbook --skip-tags untagged play7.yml

  

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

 

2019-08-19 11:23:30

ansible笔记(11):tags的用法的更多相关文章

  1. Ext.Net学习笔记11:Ext.Net GridPanel的用法

    Ext.Net学习笔记11:Ext.Net GridPanel的用法 GridPanel是用来显示数据的表格,与ASP.NET中的GridView类似. GridPanel用法 直接看代码: < ...

  2. ansible笔记(12):handlers的用法

    ansible笔记():handlers的用法 这篇文章会介绍playbook中handlers的用法. 在开始介绍之前,我们先来描述一个工作场景: 当我们修改了某些程序的配置文件以后,有可能需要重启 ...

  3. ansible笔记(11):初识ansible playbook(二)

    ansible笔记():初识ansible playbook(二) 有前文作为基础,如下示例是非常容易理解的: --- - hosts: test211 remote_user: root tasks ...

  4. ansible笔记(3):ansible模块的基本使用

    ansible笔记():ansible模块的基本使用 在前文的基础上,我们已经知道,当我们使用ansible完成实际任务时,需要依靠ansible的各个模块,比如,我们想要去ping某主机,则需要使用 ...

  5. ansible笔记(1)在centos中安装ansible

    ansible笔记():ansible的基本概念 一些基础概念 ansible是什么? 它是一个"配置管理工具",它是一个"自动化运维工具",如果你没有使用过任 ...

  6. 机器学习实战 - 读书笔记(11) - 使用Apriori算法进行关联分析

    前言 最近在看Peter Harrington写的"机器学习实战",这是我的学习心得,这次是第11章 - 使用Apriori算法进行关联分析. 基本概念 关联分析(associat ...

  7. SVN组成中trunk,branches and tags功能用法详解

    SVN组成中trunk,branches and tags功能用法详解  我相信初学开发在SVN作为版本管理时,都估计没可能考虑到如何灵活的运用SVN来管理开发代码的版本,下面我就摘录一篇文章来简单说 ...

  8. python笔记之常用模块用法分析

    python笔记之常用模块用法分析 内置模块(不用import就可以直接使用) 常用内置函数 help(obj) 在线帮助, obj可是任何类型 callable(obj) 查看一个obj是不是可以像 ...

  9. SQL反模式学习笔记11 限定列的有效值

    目标:限定列的有效值,将一列的有效字段值约束在一个固定的集合中.类似于数据字典. 反模式:在列定义上指定可选值 1. 对某一列定义一个检查约束项,这个约束不允许往列中插入或者更新任何会导致约束失败的值 ...

  10. ansible笔记(10):初识ansible playbook

    ansible笔记():初识ansible playbook 假设,我们想要在test70主机上安装nginx并启动,我们可以在ansible主机中执行如下3条命令 ansible test70 -m ...

随机推荐

  1. 常见sql注入的类型

    这里只讲解sql注入漏洞的基本类型,代码分析将放在另外一篇帖子讲解 目录 最基础的注入-union注入攻击 Boolean注入攻击-布尔盲注 报错注入攻击 时间注入攻击-时间盲注 堆叠查询注入攻击 二 ...

  2. PAT (Advanced Level) Practice 1036 Boys vs Girls (25 分)

    This time you are asked to tell the difference between the lowest grade of all the male students and ...

  3. 浅谈C#委托的用法-delegate[转]

    一.委托的概念 委托和类一样是一种用户自定义类型,它存储的就是一系列具有相同签名和返回类型的方法的地址,调用委托的时候,它所包含的所有方法都会被执行. 借用百度上的一句话概括:委托是一个类,它定义了方 ...

  4. LeetCode Two Sum&Two Sum II - Input array is sorted&3Sum&4Sum 一锅煮题解

    文章目录 Two Sum Two Sum II 3Sum 4Sum Two Sum 题意 给定一个数组,和指定一个目标和.从数组中选择两个数满足和为目标和.保证有且只有一个解.每个元素只可以用一次. ...

  5. reids中删除某个前缀的所有key

    需求:reids中删除某个前缀的所有key 说明:代码中的0:2标识从key前缀中截取前2个字符,这里示例的时候比如“b_”前缀,使用时候根据实际情况截取对应的长度进行判断即可. 生成测试数据 #!/ ...

  6. Date工具类中CompareTo()

    A<B 结果是-1 A>B 结果是1 A==B 结果是0

  7. Vue前端挂载对象时一些思考

    最近,在Vue前端调试http请求,无论如何如何也是拦截不了某些http请求.场景是这样的:Java后端组装好Vue对象,然后送到前端,前端通过id来挂载该Vue对象,而该对象中有上传文件或者图片的控 ...

  8. 假期学习【九】首都之窗百姓信件爬取代码优化以及处理 2020.2.7 Python

    今天对爬取程序进行了优化,修正了错误. 遇到了两个问题与错误: 1.忘记了对文件的读写设置格式,导致导入Hive数据库无法正常显示以及写入. 2.文件的读写操作有误导致数据量仅有应该有的1/2 不完整 ...

  9. js 获取项目名称

    //获取项目名称function getWebName(){ var pathName = window.location.pathname.substring(1); var webName = p ...

  10. try_except_finally

    blog: python中的try/except/else/finally  python文档:错误和异常 与其他语言相同,在python中,try/except语句主要是用于处理程序正常执行过程中出 ...