Json 在Jinja2模板中的Ansible变量数组上循环以创建嵌套字典

Json 在Jinja2模板中的Ansible变量数组上循环以创建嵌套字典,json,ansible,jinja2,ansible-2.x,ansible-template,Json,Ansible,Jinja2,Ansible 2.x,Ansible Template,这是输出 "result.containers":[ { "Image":"ca.docker/webproxy:1.0.0", "Names":[ "/customer1" ] }, { "Image":"docker.local/egacustomer:1.0.1",

这是输出

"result.containers":[
   {
      "Image":"ca.docker/webproxy:1.0.0",
      "Names":[
         "/customer1"
      ]
   },
   {
      "Image":"docker.local/egacustomer:1.0.1",
      "Names":[
         "/webproxy"
      ]
   }
]
我正在尝试使用jinja2创建嵌套字典。 我正在尝试使用results.container和setfact实现以下功能

"containerlist": "[webproxy:
                     name: customer1,
                   egacustomer:
                     name: webproxy]"
这是我的jinja2代码

- set_fact:
      containerlist: |
           [
           {% for item in result.containers %}
           {{ item.Image | regex_replace('.*?/(.*?):.*', '\\1') }}:
                     'name': {{ item.Names | regex_replace("^/", "") }},
           {% endfor %}
         
这就抛出了错误。有人能帮我找到正确的Jinja2代码吗?如果有人能帮我,我们将不胜感激

"containerlist": "[\n\\1:\n          'name': ['/customer'],\n\\1:\n          'name': ['/webproxy'],\n,\n]\n"

对于您试图做的事情,我将使用Ansible循环任务来规范化,而不是尝试使用Jinja{%For…%}循环。例如,这些任务

    - set_fact:
        container_list: >-
          {{
          container_list + [{
            item.Image.split('/')[-1].split(':')[0]:
              item.Names[0][1:]
          }]
          }}
      loop: "{{ result.containers }}"
      vars:
        container_list: []

    - debug:
        var: container_list
在set_fact任务中,我们在result.containers上循环,对于循环的每次迭代,我们将container_list重新定义为container_list的当前内容+一个新字典

上述操作产生以下输出:

TASK [set_fact] ****************************************************************
ok: [localhost] => (item={'Image': 'ca.docker/webproxy:1.0.0', 'Names': ['/customer1']})
ok: [localhost] => (item={'Image': 'docker.local/egacustomer:1.0.1', 'Names': ['/webproxy']})

TASK [debug] *******************************************************************
ok: [localhost] => {
    "container_list": [
        {
            "webproxy": "customer1"
        },
        {
            "egacustomer": "webproxy"
        }
    ]
}

对于您试图做的事情,我将使用Ansible循环任务来规范化,而不是尝试使用Jinja{%For…%}循环。例如,这些任务

    - set_fact:
        container_list: >-
          {{
          container_list + [{
            item.Image.split('/')[-1].split(':')[0]:
              item.Names[0][1:]
          }]
          }}
      loop: "{{ result.containers }}"
      vars:
        container_list: []

    - debug:
        var: container_list
在set_fact任务中,我们在result.containers上循环,对于循环的每次迭代,我们将container_list重新定义为container_list的当前内容+一个新字典

上述操作产生以下输出:

TASK [set_fact] ****************************************************************
ok: [localhost] => (item={'Image': 'ca.docker/webproxy:1.0.0', 'Names': ['/customer1']})
ok: [localhost] => (item={'Image': 'docker.local/egacustomer:1.0.1', 'Names': ['/webproxy']})

TASK [debug] *******************************************************************
ok: [localhost] => {
    "container_list": [
        {
            "webproxy": "customer1"
        },
        {
            "egacustomer": "webproxy"
        }
    ]
}

你能帮我把它改成字典而不是列表吗?如果你能更新你的问题以显示所需的格式,我可以试一试。谢谢,拉尔克斯。我可以用代码填充字典。set_fact:containeruplist:{{{containeruplist}default{}}合并{item.Image.split'/'[-1].split':'[0]:item.Names[0][1::]}}循环:{{resultup}json|query containers[*]}}你能帮我把它改成字典而不是列表吗?如果你更新你的问题以显示所需的格式,我可以试一试。谢谢,拉尔克斯。我可以用代码填充字典。set_-fact:containeruplist:{{{containeruplist}默认值{}}合并{item.Image.split'/'[-1].split':'[0]:item.Names[0][1::]}}}循环:{{resultup}jsonquery'containers[*]}