【问题标题】:Create a list of dictionaries from another list and a static value, using Jinja2使用 Jinja2 从另一个列表和静态值创建字典列表
【发布时间】:2023-01-26 04:51:25
【问题描述】:

我需要仅使用另一个列表中的 Jinja2 作为输入来创建字典列表。
一个键/值对是静态的并且始终相同,另一个更改值。

输入:

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

我知道服务器永远是xyz

最终的

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

我试过这个:

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

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

【问题讨论】:

  • 仅使用 jinja2 不清楚....

标签: ansible jinja2


【解决方案1】:

你非常接近。

但是您需要 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

【讨论】:

    【解决方案2】:

    只需将 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
    

    【讨论】:

      猜你喜欢
      • 2018-12-15
      • 1970-01-01
      • 1970-01-01
      • 2019-11-29
      • 2017-11-18
      • 2022-06-27
      • 2015-06-30
      • 2018-01-14
      • 1970-01-01
      相关资源
      最近更新 更多