Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用嵌套列表/dict使用ansible解析文本?_Ansible_Jinja2 - Fatal编程技术网

如何使用嵌套列表/dict使用ansible解析文本?

如何使用嵌套列表/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" ] } ] }

我有一个需要解析的文本文件,所以我可以通过带有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"
]
}
]
}
目前,我运行以下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"
        }
    ]
}