在Ansible中访问JSON格式列表中每个键的值

在Ansible中访问JSON格式列表中每个键的值,ansible,ansible-2.x,Ansible,Ansible 2.x,我有以下列表,我在cisco controller的json\u query帮助下查询过 "aci_access_port_list": [ [ { "description": [ "NOMON KASTOM" ],

我有以下列表,我在cisco controller的
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
属性中。因为一个bug
copy
不起作用,所以我使用以下命令:
local\u操作:shell echo“{clean\u list{u nice\u json}>”{{{path\u to\u-ports}{leaf\u-profile}”
我可以向您保证,即使将其委托给localhost,它也能以200%的速度工作。不要使用本地操作。将_委托给:localhost。更容易阅读和书写