Ansible 标签只能用于运行任务/角色的子集。这意味着默认情况下所有任务都会执行,我们只能阻止某些任务执行。
我们可以限制任务仅在指定“foo”标签时执行吗?我们可以在when任务的一部分中使用当前标签吗?
Tah*_*gir 62
Ansible 2.5 带有特殊标签never和always. 标签never可以完全用于此目的。例如:
tasks:
- debug: msg='{{ showmevar}}'
tags: [ 'never', 'debug' ]
Run Code Online (Sandbox Code Playgroud)
在这个例子中,任务只会在debug(or never) 标签被明确请求时运行。[参考 ansible 文档]
小智 20
when一种也许更惯用和优雅的方法是向任务添加一个条件,如下所示:
tasks:
- debug: msg='{{ showmevar}}'
tags: [ 'debug' ]
when: "'debug' in ansible_run_tags"
Run Code Online (Sandbox Code Playgroud)
这使用了神奇的变量ansible_run_tags--tags,其中包含通过 CLI 参数(或同义)提供的标签列表,并且当且仅当给出标签时才-t具有运行上述任务的效果。debug
看来这个神奇的变量已经在ansible 2.5中引入了
小智 19
尽管这是一个迂回的解决方案,但它确实有效。
当正常执行运行时,在任务列表中注册一个变量。然后,将检查该变量的 when 条件添加到标记任务。
- 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
Run Code Online (Sandbox Code Playgroud)
小智 18
我没有足够的声誉来对建议使用命令行变量 ( --extra-vars)的答案进行投票或评论,但我要添加以下内容:
此方法的警告是,如果您不定义该额外变量,播放将出错并失败。
您可以--extra-vars通过在 playbook 本身中定义默认值来防止在没有定义的情况下播放失败:
---
- hosts: ...
# ???
vars:
thorough: false
# ???
tasks:
- name: apt - install nfs-common only when thorough is true
when: thorough | bool
apt:
cache_valid_time: 86400
force: yes
pkg:
- nfs-common
Run Code Online (Sandbox Code Playgroud)
覆盖 via--extra-vars仍然有效,因为在命令行上定义的变量优先于所有其他定义。
结果是在命令行上thorough没有更改为时,播放运行没有错误true。
小智 10
您可以使用条件来防止意外运行任务,否则如果您不指定标签,这些任务将被执行。此方法的警告是,如果您不定义该额外变量,播放将出错并失败。
使用 extra-vars 参数可以触发要执行的条件。
来自 ansible-playbook --help:
-e EXTRA_VARS, --extra-vars=EXTRA_VARS
set additional variables as key=value or YAML/JSON
Run Code Online (Sandbox Code Playgroud)
例子:
ansible-playbook test.yaml -e "thorough=true"
Run Code Online (Sandbox Code Playgroud)
测试.yaml:
...
- name: apt - install nfs-common only when thorough is true
apt:
cache_valid_time: 86400
force: yes
pkg:
- nfs-common
when: thorough | default(False)
...
Run Code Online (Sandbox Code Playgroud)
小智 5
检查“tags”变量在 Ansible 2.1.1.0 中不起作用。请参阅下面的测试。我有另一个想法,即仅在定义标签时才执行任务,适用于 Ansible 1.9.X 和 2.XY:
- set_fact: foo=true
tags: bar
- set_fact: foo=false
- name: do something when 'bar' tag is defined
debug: var=foo
when: foo
tags: bar
Run Code Online (Sandbox Code Playgroud)
这样,当运行没有任何标签的 playbook 时,“foo”变量将被设置为 true,然后设置为 false,因此不会执行任何操作。如果您添加“bar”标签,则仅应用第一个设置,因此“foo”变量将为true,然后您的任务将被执行。享受!
这是 Ansible 2.1.1.0 中关于 'tags' 变量的测试:
这是剧本:
- 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
Run Code Online (Sandbox Code Playgroud)
这是输出:
$ 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
Run Code Online (Sandbox Code Playgroud)
小智 5
有一个特殊的标签 - “never”,除非特别请求标签,否则它将阻止任务运行。
tasks:
- debug: msg='{{ showmevar}}'
tags: [ 'never', 'debug' ]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
104565 次 |
| 最近记录: |