如何使用嵌套列表/dict使用ansible解析文本?
我有一个需要解析的文本文件,所以我可以通过带有ansible的RESTAPI使用它如何使用嵌套列表/dict使用ansible解析文本?,ansible,jinja2,Ansible,Jinja2,我有一个需要解析的文本文件,所以我可以通过带有ansible的RESTAPI使用它 10.0.0.0/16 Building-A 10.1.0.0/16 Building-A 10.2.0.0/16 Building-B 10.3.0.0/16 Building-B 我需要将此文本转换为如下内容: { “已解析”:[ { “A栋”:[ "10.0.0.0/16", "10.1.0.0/16" ] }, { “B楼”:[ "10.2.0.0/16", "10.3.0.0/16" ] } ] }
10.0.0.0/16 Building-A
10.1.0.0/16 Building-A
10.2.0.0/16 Building-B
10.3.0.0/16 Building-B
我需要将此文本转换为如下内容:
{
“已解析”:[
{
“A栋”:[
"10.0.0.0/16",
"10.1.0.0/16"
]
},
{
“B楼”:[
"10.2.0.0/16",
"10.3.0.0/16"
]
}
]
}
目前,我运行以下playbook来测试文本解析,但没有成功。创建的列表不是唯一的
-名称:测试
主机:本地主机
任务:
-名称:联合收割机
ansible.builtin.set\u事实:
已分析:{(已分析的|默认值([])|联合([{item.split()[1]:item.split()[0]}}}
循环:“{lookup('file','hostgroups.txt').strip().splitlines()}”
-名称:调试
ansible.builtin.debug:
var:已解析
感谢您提供帮助器变量和groupby筛选器的提示。这是最后的剧本:
-名称:测试
主机:本地主机
#策略:免费
任务:
-名称:获取列表
ansible.builtin.set\u事实:
已解析的_列表:{{parsed_列表|默认值([])+[[u项]}}”
循环:“{lookup('file','hostgroups.txt').strip().splitlines()}”
变量:
_列表:“{item.split()}}”
_项目:{{{'Name':{u列表[1],'Subnet':{u列表[0]}
-名称:调试解析_列表
ansible.builtin.debug:
var:parsed_列表
-名称:组解析_列表
ansible.builtin.set\u事实。set\u事实:
已解析的_组:“{{parsed_组}默认值([])+[{{u键:{u值}]}”
循环:{{parsed_list}groupby('Name')}
变量:
_键:“{item.0}”
_值:“{item.1 | map(attribute='Subnet')| list}”
-名称:调试解析组
ansible.builtin.debug:
var:parsed_组
解析内容,例如
-设置事实:
解析列表:{{解析列表}d([])+[[u项]}”
循环:“{lookup('file','hostgroups.txt').splitlines()}”
变量:
_数组:“{item.split()}}”
_项目:{{{'building':_array.1,'ip':_array.0}}
给予
parsed_列表:
-建筑:A栋
ip:10.0.0.0/16
-建筑:A栋
ip:10.1.0.0/16
-建筑:B栋
ip:10.2.0.0/16
-建筑:B栋
ip:10.3.0.0/16
然后,使用过滤器并创建列表
-设置事实:
解析:{{parsed}d([])+[{{{u键:{u val}]}”
循环:{{parsed_list}groupby('building')}
变量:
_键:“{item.0}”
_val:{item.1 | map(attribute='ip')| list}
给予
已解析:
-A栋:
- 10.0.0.0/16
- 10.1.0.0/16
-B栋:
- 10.2.0.0/16
- 10.3.0.0/16
在某些情况下,字典可能是更好的结构,例如
-设置事实:
已解析的dict:{{已解析的dict{124; d({}){124;组合({键:{u val})}}”
循环:{{parsed_list}groupby('building')}
变量:
_键:“{item.0}”
_val:{item.1 | map(attribute='ip')| list}
给予
parsed_dict:
A栋:
- 10.0.0.0/16
- 10.1.0.0/16
B栋:
- 10.2.0.0/16
- 10.3.0.0/16
感谢您使用第二个循环和groupby过滤器的技巧。标记为已回答。
ok: [localhost] => {
"parsed": [
{
"Building-A": "10.0.0.0/16"
},
{
"Building-A": "10.1.0.0/16"
},
{
"Building-B": "10.2.0.0/16"
},
{
"Building-B": "10.3.0.0/16"
}
]
}