如何在 Ansible 中通过 extra_vars 阻止覆盖变量?
How to block overriding variables by extra_vars in Ansible?
我正在使用 Ansible Tower 公开播放。调用 REST API 和 she/he 的用户星标工作提供了一些 extra_vars。我必须根据其他一些变量验证提供的变量。例如:用户提供主机名,我在清单变量中有:allowed_hostnames。
问题是 extra_vars 胜过一切,所以用户总是可以覆盖允许值列表的变量,而测试没有意义。
在 Tower 中有一个 Survey 功能,可用于限制允许用户更改的变量,但启用 Survey 将阻止 dict 变量,我需要它。
Q: "Problem is extra_vars trumps everything"
A:避免变数。例如任务
- debug:
msg: "{{ my_host|default('') }} is allowed to ..."
when: "my_host|default('') in lookup('file', 'allowed_hosts.yml')|from_yaml"
用数据
$ cat allowed_hosts.yml
- host1
- host2
- host3
- host9
给予
$ ansible-playbook play.yml -e 'my_host=host2'
"msg": "host2 is allowed to ..."
下一个选项可能是 pipe, redis, modgodb ... lookup plugins, custom filter, or custom lookup plugin.
根据@Vladimir 的回答,我是这样做的:
- name: Check variables
fail:
when: "{{ {'restricted_variables':restricted_variables} != lookup('file', 'restricted_variables.yml')|from_yaml }}"
其中 restricted_variables.yml
:
restricted_variables:
variable1: somevalue
variable2:
var1: 1
var2: 2
我正在使用 Ansible Tower 公开播放。调用 REST API 和 she/he 的用户星标工作提供了一些 extra_vars。我必须根据其他一些变量验证提供的变量。例如:用户提供主机名,我在清单变量中有:allowed_hostnames。 问题是 extra_vars 胜过一切,所以用户总是可以覆盖允许值列表的变量,而测试没有意义。 在 Tower 中有一个 Survey 功能,可用于限制允许用户更改的变量,但启用 Survey 将阻止 dict 变量,我需要它。
Q: "Problem is extra_vars trumps everything"
A:避免变数。例如任务
- debug:
msg: "{{ my_host|default('') }} is allowed to ..."
when: "my_host|default('') in lookup('file', 'allowed_hosts.yml')|from_yaml"
用数据
$ cat allowed_hosts.yml
- host1
- host2
- host3
- host9
给予
$ ansible-playbook play.yml -e 'my_host=host2'
"msg": "host2 is allowed to ..."
下一个选项可能是 pipe, redis, modgodb ... lookup plugins, custom filter, or custom lookup plugin.
根据@Vladimir 的回答,我是这样做的:
- name: Check variables
fail:
when: "{{ {'restricted_variables':restricted_variables} != lookup('file', 'restricted_variables.yml')|from_yaml }}"
其中 restricted_variables.yml
:
restricted_variables:
variable1: somevalue
variable2:
var1: 1
var2: 2