Ansible 的 tags 用法

我们学习 Ansible,以后都是要编写各种各样的 Playbook 的。假如我们有一天,写了一个很长很长的 Playbook,其中包含了非常多的任务,这其实没有什么问题,但是我有时候可能只是需要执行这个 Playbook 的一部分任务而已,而非每一次都执行 Playbook 的全部任务,这个时候我们可以借助 tags 实现这个需求

---
- hosts: all
  remote_user: root
  tasks:
  - name: task1
    file:
      path: /tmp/task1
      state: touch
    tags: t1

  - name: task2
    file:
      path: /tmp/task2
      state: touch
    tags: t2

上面定义了两个 task 任务,每个任务有自己的 tags,我们可以在执行 Playbook 时借助标签指定只执行那些任务,而忽略其他任务

ansible-playbook --tags=t2 testtags.yaml    # 只执行t2标签的task任务

ansible-playbook --skip-tags=t1 testtags.yaml    # 跳过t1标签任务,其他的任务都会执行

tags 的三种语法

语法一:
tags:
 - t1
 - t2

语法二:
tags: t1,t2

语法三:
tags: ['t1','t2']

我们可以为一个任务添加多个标签,下面两个 task 任务都有一个共同的 tag1 标签,当执行时指定 tag1 标签,下面两个任务都会执行

---
- hosts: all
  remote_user: root
  tasks:
  - name: task1
    file:
      path: /tmp/task1
      state: touch
    tags: t1,tag1

  - name: task2
    file:
      path: /tmp/task2
      state: touch
    tags: ['t2','tag1']

具有共同标签的任务,可以将共同标签从 task 中提取出来写在 play 中,下面的两个 task 任务分别有自己的 t1 和 t2 标签,同时又具有共同的 t3 标签,tags 写在 tasks 上面时,tasks 会继承当前 play 中的 tags

---
- hosts: all
  remote_user: root
  tags: t3
  tasks:
  - name: task1
    file:
      path: /tmp/task1
      state: touch
    tags: t1

  - name: task2
    file:
      path: /tmp/task2
      state: touch
    tags: t2

调用标签时,可以一次性指定多个标签,调用多个标签需要用逗号隔开

ansible-playbook --tags=t1,t2 testtags.yaml

我们还可以在调用标签时先概览一下 Playbook 中的标签

ansible-playbook --list-tags testtags.yaml

tags 的五个内置标签

always:当把任务的 tags 的值指定为 always 时,那么这个任务就总是会被执行,除非你使用 “–skip-tags” 选项明确指定跳过这个任务

never:当把任务的 tags 的值指定为 never 时,那么这个任务就总是不会被执行,2.5版本中新加入的特殊 tag

tagged:调用标签时使用的,只执行有标签的任务,没有任何标签的任务不会被执行

untagged:只执行没有标签的任务,但是如果某些任务包含always标签,那么这些任务也会被执行

all:执行所有标签

只执行有标签的任务,没有任何标签的任务不会被执行

ansible-playbook --tags tagged testtag.yml

跳过包含标签的任务,即使对应的任务包含 always 标签,也会被跳过

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

只执行没有标签的任务,但是如果某些任务包含 always 标签,那么这些任务也会被执行

ansible-playbook --tags untagged testtag.yml