你写了一个很长的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. 【巨杉数据库SequoiaDB】24 Hours , 数据库研发实录

    出场人物: ​ ​ 08:10 ​ 小H,是巨杉数据库引擎研发的一名工程师.7:20 天还蒙蒙亮,小H就起床了,点亮了心爱的光剑,开始了新的一天. ​ 在08:10时候,他已经洗漱完,锻炼好身体,倒好 ...

  2. CTF伪协议+preg_replace()函数的代码执行

    一道学习中所遇到的ctf 步骤: 我们点击题目链接,然后在页面先点击”云平台后台管理中心“ 然后url后面跟了参数page,题目提示了一个文件包含,我们试试index.php 看到了输出了ok,应该是 ...

  3. [Python]爬取首都之窗百姓信件网址id python 2020.2.13

    经人提醒忘记发网址id的爬取过程了, http://www.beijing.gov.cn/hudong/hdjl/com.web.consult.consultDetail.flow?original ...

  4. MST Unification CodeForces - 1108F

    #include<iostream> #include<cstring> #include<algorithm> using namespace std; ; in ...

  5. python中的__dict__和dir()的区别

    Python下一切皆对象,每个对象都有多个属性(attribute),Python对属性有一套统一的管理方案. __dict__与dir()的区别: dir()是一个函数,返回的是list: __di ...

  6. 【Vue2.x笔记2】从源码看computed对象

    computed 初始化函数 const computedWatcherOptions = { lazy: true } function initComputed (vm: Component, c ...

  7. k8s部署k8s-dashboard(v2.0.0-rc5)

    部署dashboard 版本问题 dashboard版本更新换代很快,而且每个版本对应的k8s版本都有可能不同,所以第一步要确定版本对应关系. 查看页面可以确认版本对应关系 版本对应不上可能出现很多语 ...

  8. ASP.NET MVC5 的请求管道和运行生命周期

    https://www.jianshu.com/p/848fda7f79e0 请求处理管道 请求管道是一些用于处理HTTP请求的模块组合,在ASP.NET中,请求管道有两个核心组件:IHttpModu ...

  9. 翻转引起 cocos studio 引擎与cocos2d 代码相同坐标显示不同

    使用setFlippedX后,又改变锚点为1.此时代码中坐标需要相对于cocos studio 中增加它本身的width,因为(0.5,0.5)是相对于自己中点的翻转,不变坐标.而(1,0.5)是相对 ...

  10. Public Key Retrieval is not allowed

    链接MySQL数据库报错: 数据库连接url中添加对应属性的支持.allowPublicKeyRetrieval=true&useSSL=false url: jdbc:mysql://loc ...