Ansible:如何使用Jinja2创建嵌套字典

问题描述

这是输出。

"result.containers":[
{
  "Image":"ca.docker/webproxy:1.0.0","Names":[
     "/customer1"
  ]
},{
  "Image":"docker.local/egacustomer:1.0.1","Names":[
     "/registrator"
  ]
}
]

我正在尝试使用jinja2获得以下输出

"containerlist"=>{
            "webproxy": {
                "name": "customer1"
           },"egacustomer": {
                "name": "registrator"
           }
         }

这是我的jinja2代码。

- set_fact:
      containerlist: |
       {
       {% for item in result.containers %}
       {{ item.Image.split('/')[-1].split(':')[0] | replace('\n','') }}
            name : {{ item.Names[0][1:] | replace('\n','') }}
       {% endfor %}
       }

我得到以下输出。

 "containerlist": "{\nwebproxy\n     name : customer1\negacustome\n     name : registrator\n}"

有人可以帮助我获得所需的输出。任何帮助将不胜感激

解决方法

以下任务

    - set_fact:
        containerlist: "{{ containerlist|default({})|
                           combine({key: {'name': name}}) }}"
      loop: "{{ result.containers }}"
      vars:
        key: "{{ (item.Image.split(':')|first).split('/')|last }}"
        name: "{{ item.Names[0][1:] }}"
    - debug:
        var: containerlist

给予

  containerlist:
    egacustomer:
      name: registrator
    webproxy:
      name: customer1

但是,结果不是列表。这是一本字典。如果您想使用列表,请使用

    - set_fact:
        containerlist: "{{ containerlist|default([]) +
                           [{key: {'name': name}}] }}"
      loop: "{{ result.containers }}"
      vars:
        key: "{{ (item.Image.split(':')|first).split('/')|last }}"
        name: "{{ item.Names[0][1:] }}"
    - debug:
        var: containerlist

给予

  containerlist:
  - webproxy:
      name: customer1
  - egacustomer:
      name: registrator

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...