tag的正确用途是什么,tagged和untagged的区别

2025-02-1218:49:33生活经验0

Playbook中的Tags使用详解

在ansible的playbook中,当我们面对一个冗长的脚本,包许多任务时,有时我们并不需要执行所有的任务。这时候,`tags` 就能发挥其作用了。

什么是tags?

`tags` 允许我们对任务进行“打标签”的操作。当任务被赋予了标签后,我们就可以在执行playbook时,通过指定标签来决定执行哪些任务。

如何使用tags?

如例所示,每个task都有对应的tags。为了方便理解,这里只是简单地用t1、t2、t3作为tags的值。在实际使用中,应确保tags的值具有描述性。

指定需要执行的任务

若想执行某个特定标签的任务,可以使用 `--tags` 选项。例如,只想执行标签为 `t2` 的任务,可以执行如下命令:

```shell

ansible-playbook --tags="t2" playbookname.yml

```

这样,只有标签为 `t2` 的 `task` 会被执行,其他任务都不会被执行。

指定不执行的任务

除了指定需要执行的任务外,还可以通过 `--skip-tags` 选项指定不执行的任务。例如,不希望执行标签为 `t2` 的任务,可以执行如下命令:

```shell

ansible-playbook --skip-tags="t2" playbookname.yml

```

为任务添加多个标签

每个任务不是只有一个标签,我们可以为每个任务添加多个标签。这可以通过使用YAML块序列的语法格式、使用逗号分隔的语法等形式实现。

标签的继承

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

调用多个标签

在调用标签时,可以一次性指定多个标签。只需在命令行中使用逗号隔开即可。

查看所有的标签

如果你想要概览一下playbook中都有哪些标签,可以使用 `--list-tags` 选项。

特殊tags

Ansible还预置了几个特殊tag,如 `always`、`never`(2.5版本中新增)、`tagged`、`untagged` 和 `all`。这些特殊tag在特定情况下非常有用。例如,当任务的tags值被设为 `always` 时,该任务总是会被执行,除非明确使用 `--skip-tags` 选项跳过它。

always tag的详细解释与应用

如上例所示,即使只指定了执行标签为 `t1` 的任务,但由于 `task3` 的标签中包含了 `always` 关键字,因此 `task3` 也会被执行。这意味着即使其他条件不满足,带有 `always` 标签的任务也会被执行。如果你不想执行包含 `always` 标签的任务,可以使用 `--skip-tags` 选项明确跳过它们。但需要注意的是,如果有多个任务都有 `always` 标签,此选项会跳过所有包含 `always` 标签的任务。若只希望跳过一个特定的任务,需要确保该任务有除了 `always` 以外的其他自定义标签。

其他特殊tags的应用

其他如 `tagged`、`untagged` 和 `all` 这些特殊tags,在调用时作为参数使用。例如:只执行有标签的任务、跳过有标签的任务、只执行无标签的任务等。这些tags为任务的精细控制提供了便利。而 `all` 是一个默认的tag,表示所有任务都会被执行。