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
我需要仅使用来自数组输入的 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