如何使用Jinja2将var文件中的值提取到Ansible中的JSON文件中



我想根据输入文件和var文件之间的匹配id值(此处id值为123(,从var文件中提取/替换输入YAML-abc.yml-中的值,并创建一个JSON作为预期结果。

Jinja2代码:

[
{% for list in abc['fwrules'] %}
{
{% for item in abc['details'] %}
"country": "{{item.Country}}",
"destCidr": "{{list.destCidr}}"
{% endfor %}
}{% if not loop.last %},
{% endif %}
{% endfor %}
]

输入yml--abc.yml:

---
details: 
-   Country: "abc" 
id: 123 
fwrules:
-   destCidr: "{{ DNS }}, 10.20.20.20/24"
srcCidr: "10.30.20.20/24"
-   destCidr: "10.30.30.30/24"
srcCidr: "{{ NTP }}, 10.40.20.20/24"

Var文件--Var.yml:

---
names:
-   id: "123"
DNS: "10.10.10.10"
NTP: "10.100.100.100"
-   id: "456"
DNS: "20.20.20.20"
NTP: "10.200.200.200"

预期的JSON结果:

[
{
"country": "abc",
"destCidr": "10.10.10.10, 10.20.20.20/24",
"srcCidr": "10.30.20.20/24"
},
{
"country": "abc",
"destCidr": "10.30.30.30/24"
"srcCidr": "10.100.100.100, 10.40.20.20/24"
}
]

您只需使用过滤器即可实现这一点。

给定您提供的两个yaml-abc.ymlvar.yml,使用以下两个任务:

- include_vars:
file: "{{ item }}.yml"
loop:
- var
- abc
- set_fact:
output: >-
{{
output | default([]) 
+ [{
'country': details.0.Country,
'destCidr': item.destCidr,
'srcCidr': item.srcCidr
}] 
}} 
loop: "{{ fwrules }}"
vars: 
_matched_id: >-
{{ 
names 
| selectattr('id', 'eq', details.0.id | string) 
| first 
}}
DNS: "{{ _matched_id.DNS }}"
NTP: "{{ _matched_id.NTP }}"

将创建一个具有所需输出的变量output

TASK [debug] ********************************************************************
ok: [localhost] => {
"output": [
{
"country": "abc",
"destCidr": "10.10.10.10, 10.20.20.20/24",
"srcCidr": "10.30.20.20/24"
},
{
"country": "abc",
"destCidr": "10.30.30.30/24",
"srcCidr": "10.100.100.100, 10.40.20.20/24"
}
]
}

然后,如果您需要的话,您可以将输出转储到JSON文件中:

- copy:
content: "{{ output | to_nice_json }}"
dest: output.json

最新更新