首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >访问Ansible中JSON格式列表的每个键的值

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

Stack Overflow用户
提问于 2020-10-08 15:37:43
回答 1查看 90关注 0票数 2

我有下面的列表,这是我在思科控制器的json_query帮助下提出的疑问。

代码语言:javascript
运行
复制
"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"
                }
            ]
        ]

我想检查每个description键,如果它有"NOMON“写的话,保存到一个新的列表中。为此,我写了以下文章:

代码语言:javascript
运行
复制
- 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 }}"

这个结果是:

代码语言:javascript
运行
复制
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_access_port_lists相同的格式,但我无法理解。看起来应该是:

代码语言:javascript
运行
复制
"clean_list":[
                {
                    "description": [
                        "NOMON KASTOM"
                    ], 
                    "port_name": "E1-17"
                }, 
                {
                    "description": [
                        "ASDF NOMON K"
                    ], 
                    "port_name": "E1-16"
                }, 
                {
                    "description": [
                        "NOMON K9876"
                    ], 
                    "port_name": "E1-15"
                }
             ]

我想有更好的办法,但我找不到,如果有人能帮助我,我会很高兴。提前谢谢你。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-08 16:10:31

使用selectattr过滤器和contains测试(针对description列表的第一个元素)很容易实现,因为它总是只有一个元素。当然,如果列表中有几个元素,这种方法就会中断。

代码语言:javascript
运行
复制
    - name: Show me a clean list
      vars:                                                                                                  
        clean_list: >-
          {{
            aci_access_port_list.0 |
            selectattr('description.0', 'contains', 'NOMON K') |
            list
          }}
      debug:
        var: clean_list
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64265955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档