【问题标题】:Loop over Ansible variable array in Jinja2 template to create nested dictionary在 Jinja2 模板中循环 Ansible 变量数组以创建嵌套字典
【发布时间】:2020-08-10 12:04:50
【问题描述】:

这是输出。

"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"

【问题讨论】:

    标签: json ansible jinja2 ansible-2.x ansible-template


    【解决方案1】:

    对于您要执行的操作,我会规范化使用 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({}) | combine( {item.Image.split('/')[-1].split(':')[0]:item.Names[0][1:]} ) }}" loop: "{{ resultup | json_query('containers[*]') }}"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多