如何在 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