Ansible:仅在指定标签时执行任务

Tah*_*gir 90 ansible

Ansible 标签只能用于运行任务/角色的子集。这意味着默认情况下所有任务都会执行,我们只能阻止某些任务执行。

我们可以限制任务在指定“foo”标签时执行吗?我们可以在when任务的一部分中使用当前标签吗?

Tah*_*gir 62

Ansible 2.5 带有特殊标签neveralways. 标签never可以完全用于此目的。例如:

tasks:
  - debug: msg='{{ showmevar}}'
    tags: [ 'never', 'debug' ]
Run Code Online (Sandbox Code Playgroud)

在这个例子中,任务只会在debug(or never) 标签被明确请求时运行。[参考 ansible 文档]

  • 这不适用于在戏剧定义中具有标签的角色。通过按标签调用角色(例如“role_xy”),该标签将自动成为任务的一部分,因此即使未设置“debug”,也会执行 ith。https://serverfault.com/a/1003479/256436 提供了该问题的解决方案。 (3认同)

小智 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)

  • 您能对此再解释一下吗?一个现实世界的例子? (2认同)

小智 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

  • 使用`thorough | 也可以达到同样的目的。默认('否')| 布尔`。 (8认同)
  • 或者,如果您更喜欢这种语法,则可以使用“when:彻底的定义和彻底的” (2认同)

小智 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)

  • 如果您没有定义“彻底”,为了避免错误,只需使用 ```thorough | 默认(“假”)| 匹配(“真”)```。默认值不必是 `false`,只要不匹配 `true` 即可,但它提高了可读性。 (2认同)

小智 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)