繁体   English   中英

ansible - 使用 jinja2 创建字典列表

[英]ansible - create list of dict using jinja2

我需要从数组输入中仅使用 jinja2 创建字典列表。
一个键/值对是 static 并且始终相同,另一个更改值。

输入:

targets: ["abc", "qwe", "def"]

我知道服务器将永远是xyz

最后

connections:
  - { "target": "abc", "server": "xyz" }
  - { "target": "qwe", "server": "xyz" } 
  - { "target": "def", "server": "xyz" } 

我试过这个:

"{{ dict(targets | zip_longest([], fillvalue='xyz')) }}"

但这只需要一个作为关键,另一个作为价值。

只需将 set_fact 与正确的循环一起使用:

- name: testplaybook jinja2
  hosts: localhost
  gather_facts: no
  vars:
    targets: ["abc", "qwe", "def"]

  tasks:
    - name: DEFINE VARIABLE SPINE
      set_fact: 
        connections: "{{ connections | d([]) + [ {'target': item, 'server': _server} ] }}"
      loop: "{{ targets }}"
      vars:
        _server: xyz

    - name: display
      debug:
        var: connections

结果:

connections:
- server: xyz
  target: abc
- server: xyz
  target: qwe
- server: xyz
  target: def

你非常接近。

但是你需要一个product而不是一个zip_longest来为你的targets列表的所有元素重复相同的元素。

您还缺少一个dict2items来缩小差距并将结果列表从您的字典中删除。

这给出了任务:

- set_fact:
    connections: >-
      {{
        dict(targets | product(['xyz']))
        | dict2items(key_name='target', value_name='server')
      }}

鉴于剧本:

- hosts: localhost
  gather_facts: no

  tasks:
    - set_fact:
        connections: >-
          {{
            dict(targets | product(['xyz']))
            | dict2items(key_name='target', value_name='server')
          }}
      vars:
        targets:
          - abc
          - qwe
          - def

    - debug:
        var: connections

这产生:

ok: [localhost] => 
  connections:
  - server: xyz
    target: abc
  - server: xyz
    target: qwe
  - server: xyz
    target: def

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM