Ansible系列基础篇 1.7.2、PlayBook之tags
一、tags介绍
当你写了一个很长的playbook,其中有很多的任务,这并没有什么问题,不过在实际使用这个剧本时,你可能只是想要执行其中的一部分任务而已,或者,你只想要执行其中一类任务而已,而并非想要执行整个剧本中的全部任务,这个时候我们该怎么办呢?我们可以借助tags实现这个需求。
tags的作用是给任务打标签。,当任务存在标签以后,我们就可以在执行playbook时,借助标签,指定执行哪些任务,或者指定不执行哪些任务了,下面为tags使用示例:
# testtag.yml --- - hosts: test70 remote_user: root tasks: - name: task1 file: path: /testdir/t1 state: touch tags: t1 - name: task2 file: path=/testdir/t2 state=touch tags: t2 - name: task3 file: path=/testdir/t3 state=touch tags: t3 ...
上面示例代码,新建3个task,分别为每个task打上tag,使用方式如下:
# 只执行t2任务,其他任务(t1 t3)不执行 ansible-playbook --tags=t2 testtag.yml # 忽略t2任务的执行,其他任务(t1 t3)正常执行 ansible-playbook --skip-tags=t2 testtag.yml
二、命名标签的多种方式
### 每个任务添加单个标签
# 方式1
tags: t1
# 方式2
tags:
- t2
# 方式3
tags: ['t3']
### 每个任务添加多个标签,不同的task可以命名相同的标签,执行时,相同命名的标签都会被执行
# 方式1
tags:
- t1
- t2
# 方式2
语法二:
tags: t1,t2
# 方式3
tags: ['t1','t2']
三、在playbook中添加tag
当tags写在play中而非task中时,play中的所有task会继承当前play中的tags,而下例中,两个任务都会继承httpd标签,同时还有拥有自己的标签。
---
- hosts: test70
remote_user: root
tags: httpd
tasks:
- name: install httpd package
tags: ['package']
yum:
name=httpd
state=latest
- name: start up httpd service
tags:
- service
service:
name: httpd
state: started
...
四、tags高级用法
调用标签时,也可以一次性指定多个标签,调用多个标签需要用逗号隔开,命令如下:
ansible-playbook --tags t1,t2,t3 test.yml
查看playbook中有哪些标签,命令如下:
ansible-playbook --list-tags test.yml
5个特殊tag:always ,never(2.5版本中新加入的特殊tag) ,tagged ,untagged ,all
always:
当我们把任务的tags的值指定为always时,那么这个任务就总是会被执行,除非你使用'--skip-tags'选项明确指定不执行对应的任务。
# always示例 --- - hosts: test70 remote_user: root tasks: - name: task1 file: path: /testdir/t1 state: touch tags: - t1 - name: task2 file: path=/testdir/t2 state=touch tags: ['t2'] - name: task3 file: path=/testdir/t3 state=touch tags: t3,always ...
命令:ansible-playbook --tags=t1 test.yml
只指定了't1',正常情况下应该只执行't1'对应的任务,也就是应该只执行task1,但是实际上执行了task1和task3,这是因为task3的标签的值包含always关键字,所以即使task3对应的标签没有被调用,task3也会执行,这就是always的作用。
命令:ansible-playbook --skip-tags always test.yml
上述play中有多个任务都有always标签,那么上述命令将会跳过所有包含always标签的任务。
如果play中的多个任务都有always标签,只想跳过task3,其他带有always标签的任务不会跳过,则执行命令:
ansible-playbook --skip-tags t3 test.yml
never:
never的作用应该与always正好相反,不去执行。
always和never是写在playbook中的标签,剩下的tagged ,untagged ,all是在执行playbook时的参数。
tagged:
ansible-playbook --tags tagged testtag.yml
上述命令表示只执行有标签的任务,没有任何标签的任务不会被执行。
ansible-playbook --skip-tags tagged testtag.yml
上述命令表示跳过包含标签的任务,即使对应的任务包含always标签,也会被跳过。
untagged:
ansible-playbook --tags untagged testtag.yml
上述命令表示只执行没有标签的任务,但是如果某些任务包含always标签,那么这些任务也会被执行。
ansible-playbook --skip-tags untagged testtag.yml
上述命令表示跳过没有标签的任务。
all:
特殊标签all表示所有任务会被执行,不用指定,默认情况下就是使用这个标签。