ansible - 使用 jinja2 创建字典列表

ansible - create list of dict using jinja2

我需要仅使用来自数组输入的 jinja2 创建字典列表。
一对 key/value 是静态的并且始终相同,另一对改变值。

输入:

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