Loading

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表示所有任务会被执行,不用指定,默认情况下就是使用这个标签。

 

posted @ 2020-12-26 19:10  wsongl  阅读(281)  评论(0编辑  收藏  举报