在剧本中覆盖 ansible_skip_tags

在剧本中覆盖 ansible_skip_tags

我已经能够使用以下方式管理 Ansible 的控制变量,这些变量通常在命令行中指定set_fact模块; 例如

- name: Use a default SSH key for this playbook
  set_fact: ansible_ssh_private_key_file={{ whatever_default_location }}
  when: ansible_ssh_private_key_file is not defined

但我发现自己无法通过命令行选项提供的跳过标签进行扩展--skip-tags。以下剧本

---

- hosts: localhost
  tasks:
    - set_fact: ansible_skip_tags={{ ansible_skip_tags + ['foo'] }}
    - debug: msg="Foo"
      tags:
        - foo

给出以下输出:

PLAY [localhost] ******************************************************************************************************************************************************************************************************************************

TASK [Gathering Facts] ************************************************************************************************************************************************************************************************************************
ok: [localhost]

TASK [set_fact] *******************************************************************************************************************************************************************************************************************************
ok: [localhost]

TASK [debug] **********************************************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": "Foo"
}

PLAY RECAP ************************************************************************************************************************************************************************************************************************************
localhost                  : ok=3    changed=0    unreachable=0    failed=0   

而预期的输出是通过--skip-tags foo在命令行上使用以下命令实现的:

PLAY [localhost] ******************************************************************************************************************************************************************************************************************************

TASK [Gathering Facts] ************************************************************************************************************************************************************************************************************************
ok: [localhost]

TASK [set_fact] *******************************************************************************************************************************************************************************************************************************
ok: [localhost]

PLAY RECAP ************************************************************************************************************************************************************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0   

有没有办法在剧本中指定额外的跳过标签?

答案1

否,ansible_skip_tags它很早就由命令行选项设置,并且无法覆盖。我相信它是在剧本的初始解析中使用,因此无法在剧本本身中定义。请考虑以下内容:

---

- hosts: localhost
  connection: local
  gather_facts: false
  tasks:
    - set_fact: ansible_skip_tags="{{ ansible_skip_tags }} + ['foo']"
    - debug: var=ansible_skip_tags

这应该修改 var,然后打印修改后的版本,但是......

$ ansible-playbook -i "localhost," test.yml --skip-tags=bar -v


PLAY [localhost] ********************************************************************

TASK [set_fact] *********************************************************************
ok: [localhost] => {"ansible_facts": {"ansible_skip_tags": ["bar", "foo"]}, "changed": false}

TASK [debug] ************************************************************************
ok: [localhost] => {
    "ansible_skip_tags": [
        "bar"
    ]
}

PLAY RECAP **************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0

如您所见,虽然变量似乎已成功修改,但在打印时,其值实际上并未改变。即使它确实发生了变化,我认为也为时已晚,没有任何用处,因为此时剧本已经被解析了。

相关内容