[英]Yaml/Jinja2/Ansible Processing dict list with jinja template
[英]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.