我已经能够使用以下方式管理 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
如您所见,虽然变量似乎已成功修改,但在打印时,其值实际上并未改变。即使它确实发生了变化,我认为也为时已晚,没有任何用处,因为此时剧本已经被解析了。