ansible 提供额外变量作为嵌套 json

ech*_*hox 5 yaml jinja2 ansible

我正在尝试将 ansible 用于参数化的 docker 部署。我希望能够通过命令行指定图像、版本和各种不同的环境变量。

可以直接指定图像、版本等,但 docker 模块的 env 参数需要一个字典。这是一个缩短的剧本示例:

-name: some deployment
docker:
   [..]
   name: myname
   [..]
   env:
      FOO: bar
      ANOTHERFOO: anotherbar
Run Code Online (Sandbox Code Playgroud)

环境变量是在运行时选择的,因此无法直接在提供的额外变量中定义它们。剧本目前看起来是这样的:

-name: some deployment
docker:
   [..]
   name: "{{ name }}"
   [..]
   env: "{{ env }}"
Run Code Online (Sandbox Code Playgroud)

由于 env 是一个嵌套字典,我们需要提供 --extra-vars 作为嵌套 json。我希望以下内容起作用:

./ansible-playbook [..] --extra-vars '{"name":"myname", "env":{"FOO":"bar", "ANOTHERFOO":"anotherbar"}}' [..]
Run Code Online (Sandbox Code Playgroud)

容器运行后, env 的值不存在。直接在剧本中提供 json 以进行测试是有效的。

我尝试了以下不同的 json 没有工作结果:

{"name":"myname", "env":{"FOO":"bar", "ANOTHERFOO":"anotherbar"}}

{"name":"myname", "env":[{"FOO":"bar"}, {"ANOTHERFOO":"anotherbar"}]}
Run Code Online (Sandbox Code Playgroud)

您如何通过命令行提供和使用嵌套字典,或者这是 Jinja2 模板引擎的限制。

ech*_*hox 3

如果您的 YAML/ansible playbook 中需要一个字典,则正确使用的结构是由 --extra-vars 提供的嵌套 json,如问题示例中所示:

./ansible-playbook [..] --extra-vars '{"name":"myname", "env":{"FOO":"bar", "ANOTHERFOO":"anotherbar"}}' [..]
Run Code Online (Sandbox Code Playgroud)

-name: some deployment
docker:
   [..]
   name: "{{ name }}"
   [..]
   env: "{{ env }}"
Run Code Online (Sandbox Code Playgroud)

出于测试目的,我确实在我的系统上使用了它environment,我将其简化env为示例。问题是environment保留变量总是被覆盖。