在Ansible中访问JSON格式列表中每个键的值
我有以下列表,我在cisco controller的在Ansible中访问JSON格式列表中每个键的值,ansible,ansible-2.x,Ansible,Ansible 2.x,我有以下列表,我在cisco controller的json\u query帮助下查询过 "aci_access_port_list": [ [ { "description": [ "NOMON KASTOM" ],
json\u query
帮助下查询过
"aci_access_port_list": [
[
{
"description": [
"NOMON KASTOM"
],
"port_name": "E1-17"
},
{
"description": [
"ASDF NOMON K"
],
"port_name": "E1-16"
},
{
"description": [
"NOMON K9876"
],
"port_name": "E1-15"
},
{
"description": [
"LAN5002 TC "
],
"port_name": "E1-46"
},
{
"description": [
"LAN5002 TC "
],
"port_name": "E1-47"
},
{
"description": [
"NOMON LAN5001 TC "
],
"port_name": "E1-45"
},
{
"description": [
"LAN5001 TC "
],
"port_name": "E1-48"
},
{
"description": [
"NOMON No Cabling - TEST-4-AUTOMATION"
],
"port_name": "E1-30"
},
{
"description": [
"NOMON No Cabling - TEST-6-AUTOMATION"
],
"port_name": "E1-31"
}
]
]
我想检查每个说明
键,如果它写了“NOMON K”,则将其保存到新列表中。为此,我写了以下内容:
- set_fact:
clean_list: [\n]
- name: getting the clean list of ports and descr.
set_fact:
clean_list: "{{clean_list }} \n {{item.0.port_name}} - {{item.1}}"
loop: "{{ aci_access_port_list[0]|subelements('description') }}"
when: item.1 is search ("NOMON K")
- debug:
msg: "{{ clean_list }}"
这将返回:
ok: [acitst-apic.net.dsh.at] => {
"msg": "[u'\\\\n'] \n E1-17 - NOMON KASTOM \n E1-16 - ASDF NOMON K \n E1-15 - NOMON K9876"
}
我想要的是与aci\u access\u port\u列表相同的格式,但我无法理解。它应该是这样的:
"clean_list":[
{
"description": [
"NOMON KASTOM"
],
"port_name": "E1-17"
},
{
"description": [
"ASDF NOMON K"
],
"port_name": "E1-16"
},
{
"description": [
"NOMON K9876"
],
"port_name": "E1-15"
}
]
我想有更好的方法,但我找不到,如果有人能帮助我,我会很高兴。提前谢谢。使用selectattr
过滤器和包含测试,这是很容易做到的,因为它总是有一个元素,所以针对说明
列表的第一个元素。当然,如果列表中有多个元素,这种方法就会失效
-name:显示一个干净的列表
变量:
清洁列表:>-
{{
aci\u访问\u端口\u列表。0|
selectattr('description.0'、'contains'、'NOMON K')|
列表
}}
调试:
var:clean_列表
嗨,谢谢@Zeitounator,这帮了大忙。你能解释一下>-
的确切功能吗?我曾尝试将clean\u list
写入一个文件,但没有成功,因为我使用了如下解决方案:-set\u-fact:test\u-list:“{{aci\u-access\u-port\u-list.0}selectattr('description.0','contains','NOMON K');list{/code>-
是yaml块标量指示器。看见我在这里使用它主要是为了可读性(将表达式拆分为多行)关于写入文件。。。不要使用set\u-fact
而是使用copy
并将表达式放在content
属性中。因为一个bugcopy
不起作用,所以我使用以下命令:local\u操作:shell echo“{clean\u list{u nice\u json}>”{{{path\u to\u-ports}{leaf\u-profile}”
我可以向您保证,即使将其委托给localhost,它也能以200%的速度工作。不要使用本地操作。将_委托给:localhost。更容易阅读和书写