- shell: /bin/true
register: normal_task_list
- name: Only run when tag is specified
shell: /bin/echo "Only running because of specified tag"
when: normal_task_list is not defined
tags: specified
- hosts: localhost
connection: local
tasks:
- name: display tags variable
debug: var=tags
tags: foo
- name: do something only when tag 'foo' is provided
debug: var=tag
when: tags is defined
tags: foo
这是输出:
$ ansible-playbook --version ; ansible-playbook ./test.yml -t foo
ansible-playbook 2.1.1.0
config file = /home/nootal/projects/ivy/src/ansible/ansible.cfg
configured module search path = Default w/o overrides
PLAY [localhost] ***************************************************************
TASK [display tags variable] ***************************************************
ok: [localhost] => {
"tags": "VARIABLE IS NOT DEFINED!"
}
TASK [do something only when tag 'foo' is provided] ****************************
PLAY RECAP *********************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=0
Ansible 2.5 带有特殊标签
never
和always
. 标记never
可以完全用于此目的。例如:debug
在此示例中,仅当显式请求(ornever
) 标记时任务才会运行。[关于 ansible 文档的参考]虽然这是一个迂回的解决方案,但它确实有效。
当正常执行运行时,在任务列表中注册一个变量。然后,将检查该变量的 when 条件添加到标记任务。
我没有足够的声誉来支持或评论建议使用命令行变量(
--extra-vars
)的答案,但我有这个要添加到它:--extra-vars
您可以通过在 playbook 本身中定义默认值来防止在没有定义的情况下播放失败:覆盖 via
--extra-vars
仍然有效,因为在命令行上定义的变量优先于所有其他定义。结果是在命令行
thorough
中没有更改为时,播放运行没有错误。true
您可以使用条件来防止意外运行的任务,如果您不指定标签,这些任务将被执行。此方法的警告是,如果您不定义该额外变量,播放将出错并失败。
使用 extra-vars 参数,您可以触发条件执行。
来自 ansible-playbook --help:
例子:
测试.yaml:
一种可能更惯用和优雅的方式是为
when
任务添加条件,如下所示:这使用包含通过 CLI 参数(或同义词)提供的标签列表的神奇变量,并且
ansible_run_tags
当且仅当给出标签时才具有运行上述任务的效果。--tags
-t
debug
似乎这个魔法变量已在 ansible 2.5 中引入
是的。使用标志运行 ansible-playbook
--tags foo
将确保仅执行带有标记的任务foo
。例如,假设我们有一个名为 example.yml 的剧本:跑步:
将确保只执行 yum 任务。
所以实际上你并不需要在 when 部分中使用标签来有条件地执行任务。请注意,根据您的剧本/角色的复杂性,您可能需要结合使用 --tags 和 --skip-tags 来控制执行哪些任务。例如,如果包含任务被标记为“foo”并且包含的剧本中的某些任务被标记为“bar”并且您运行
将执行内部任务(仅标记为“bar”)。为避免执行所有标记为“bar”的内部任务,您必须执行以下命令
检查 'tags' 变量在 Ansible 2.1.1.0 中不起作用。测试见下文。我有另一个想法,即仅在定义标签时才执行任务,适用于 Ansible 1.9.X 和 2.XY:
这样,当运行没有任何标签的 playbook 时,'foo' 变量将设置为 true,然后设置为 false,因此不执行任何操作。如果添加'bar'标签,只会应用第一个设置,所以'foo'变量将为真,然后你的任务将被执行。享受!
这是关于 Ansible 2.1.1.0 中“标签”变量的测试:
这是剧本:
这是输出:
有一个特殊的标签 - "never",除非特别请求标签,否则它将阻止任务运行。
标签通常是正确的
never
解决方案,但它在一种情况下不起作用:在Ansible 2.11 之前meta
,任务不支持标签。在这种情况下,我们必须使用条件变量和魔法变量来伪造标签支持。when:
ansible_run_tags
例如,这是一个片段,它将列出所有主机并在您说 时提前结束播放
--tags list-hosts
。它适用于 Ansible 2.8 及更高版本。如果您在运行时使用add_host
or生成主机或组,这将非常有用group_by
,因为对于--list-hosts
.when子句无法评估标签的存在。作为一种解决方法,我将变量和标签一起使用来运行特定于该标签/变量的任务。
例如:想象一个剧本和库存
使用这种方法,您可以使用标签仅选择uninstall.yml 中的任务,但您还需要将“uninstall_links”变量设置为启用它。因此,如果您在没有任何参数的情况下运行 playbook,它将默认运行安装任务。要卸载,您可以将标签“卸载”设置为您的剧本(或 cmdline),并且必须设置变量。如果不设置标签,它将按顺序运行所有内容(安装和卸载),这对测试整个过程很有好处。
如何运行一切(它将安装和卸载):
$
ansible-playbook -i inventory site.yml -l dev -s -k -e "uninstall_links=true"
如何仅在开发组上运行“卸载”标签
$
ansible-playbook -i inventory site.yml -l dev -s -k -e "uninstall_links=true" -t uninstall
因此,变量和标签也可以在 site.yml/inventory 文件中,允许您提交到您的 SCM 并记录您的意图。