首页 文章

ansible提供额外的vars作为嵌套的json

提问于
浏览
4

我正在尝试使用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模板引擎的限制 .

2 回答

  • 0

    如果你需要在YAML / ansible playbook中使用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并且总是被覆盖 .

  • 2

    尝试以下方式:

    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 Output

    [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]$
    

相关问题