我正在尝试使用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-vars作为嵌套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模板引擎的限制。
答案 0 :(得分:2)
如果你需要在YAML / ansible剧本中使用dict,那么正确使用的结构是一个嵌套的json,它提供了--extra-vars,如问题示例所示:
./ansible-playbook [..] --extra-vars '{"name":"myname", "env":{"FOO":"bar", "ANOTHERFOO":"anotherbar"}}' [..]
和
-name: some deployment
docker:
[..]
name: "{{ name }}"
[..]
env: "{{ env }}"
出于测试目的,我在我的系统上使用了environment
,我将其缩短为env
作为示例。问题是environment
是reserved variable并且始终被覆盖。
答案 1 :(得分:0)
请尝试以下方式:
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]$