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

Yaml ansible将额外变量作为嵌套json提供,yaml,jinja2,ansible,Yaml,Jinja2,Ansible,我正在尝试使用ansible进行参数化docker部署。我希望能够通过命令行指定图像、版本和各种不同的环境变量 可以直接指定图像、版本等,但docker模块的env参数需要字典。下面是一个简短的剧本示例: -name: some deployment docker: [..] name: myname [..] env: FOO: bar ANOTHERFOO: anotherbar 环境变量是在运行时选择的,因此不可能在提供的额外变量中直接定义

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

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

-name: some deployment
docker:
   [..]
   name: myname
   [..]
   env:
      FOO: bar
      ANOTHERFOO: anotherbar
环境变量是在运行时选择的,因此不可能在提供的额外变量中直接定义它们。目前的剧本是这样的:

-name: some deployment
docker:
   [..]
   name: "{{ name }}"
   [..]
   env: "{{ env }}"
由于env是一个嵌套字典,我们需要提供--extra变量作为嵌套json。我希望以下各项能够发挥作用:

./ansible-playbook [..] --extra-vars '{"name":"myname", "env":{"FOO":"bar", "ANOTHERFOO":"anotherbar"}}' [..]
容器运行后,env的值不存在。 在剧本中直接提供json用于测试是可行的

我尝试了以下不同的json,但没有结果:

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

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

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

如果您需要在YAML/ansible playbook中使用dict,正确的结构是一个嵌套的json,附带--额外的变量,如问题示例中所示:

./ansible-playbook [..] --extra-vars '{"name":"myname", "env":{"FOO":"bar", "ANOTHERFOO":"anotherbar"}}' [..]


出于测试目的,我确实在我的系统上使用了
environment
,我将其缩写为
env
,作为示例。问题是
环境
是一个,并且总是被覆盖。

尝试以下方法:

test.json

{“name”:“myname”,“env”:{“FOO”:“bar”,“ANOTHERFOO”:“anotherbar”}

test.yml

---
 - hosts: localhost
   connection: local
   gather_facts: false

   tasks:
   - name: Print nested json input
     debug:
        msg: "name : {{ name }} || env.foo : {{ env.FOO }} || env.anotherfoo : {{  env.ANOTHERFOO }}"
Ansible输出

[root@localhost test]$ ansible-playbook test.yml -e "@test.json"
 [WARNING]: Could not match supplied host pattern, ignoring: all

 [WARNING]: provided hosts list is empty, only localhost is available

 [WARNING]: Found variable using reserved name: name


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

TASK [Print nested json input] ******************************************************************************************************
ok: [localhost] => {
    "msg": "name : myname || env.foo : bar || env.anotherfoo : anotherbar"
}

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

[root@localhost test]$

您运行哪个版本的Ansible?这应该是可能的,因为Ansible 1.2,根据文档:
--extra vars'{“pacman”:“mrs”,“ghosts”:[“inky”,“pinky”,“clyde”,“sue”]}
Ansible 1.9.2,与引用文档的不同之处在于我尝试使用字典/嵌套json对象,而不是数组。但是用于测试的{{env[0]}也不起作用……这很奇怪。我在这里测试了这个,它非常有效。尽管我使用了github的devel分支。我的任务:
-debug:msg=“{{env[0].FOO}}”
。我的调用:
ansible playbook-i inventory/test test.yml--extra vars'{“name”:“myname”,“env”:[{“FOO”:“bar”},{“ANOTHERFOO”:“anotherbar”}
和调试任务的输出:
“msg”:“bar”
。重点是我需要整个字典,但让我用调试任务再次测试它。是的,我可以访问整个目录。我只是在调试中使用了
FOO
,以显示它不仅是文本,而且是一个可访问的对象。
[root@localhost test]$ ansible-playbook test.yml -e "@test.json"
 [WARNING]: Could not match supplied host pattern, ignoring: all

 [WARNING]: provided hosts list is empty, only localhost is available

 [WARNING]: Found variable using reserved name: name


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

TASK [Print nested json input] ******************************************************************************************************
ok: [localhost] => {
    "msg": "name : myname || env.foo : bar || env.anotherfoo : anotherbar"
}

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

[root@localhost test]$