微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 jmespath 检查嵌套数据中所有键的条件,纠正“倾斜牙签综合症”

如何解决使用 jmespath 检查嵌套数据中所有键的条件,纠正“倾斜牙签综合症”

我一直在尝试检查所有节点的条件,

('Config state '=='NSHUT' and ('State '=='OPERATIONAL' or 'State '=='IOS XR RUN'))`

我期望检查后有一个布尔值。

以下是我正在尝试使用的嵌套字典:

{
    "0/0/1": {
        "Config state ": "","Node ": "0/0/1","State ": "OK","Type ": "NC55-MPA-12T-S"
    },"0/0/cpu0": {
        "Config state ": "NSHUT","Node ": "0/0/cpu0","State ": "IOS XR RUN","Type ": "NC55-MOD-A-S"
    },"0/0/NPU0": {
        "Config state ": "","Node ": "0/0/NPU0","State ": "UP","Type ": "Slice"
    },"0/FC0": {
        "Config state ": "NSHUT","Node ": "0/FC0","State ": "OPERATIONAL","Type ": "NC55-5508-FC"
    },"0/FC1": {
        "Config state ": "NSHUT","Node ": "0/FC1","0/FC2": {
        "Config state ": "NSHUT","Node ": "0/FC2","0/FC3": {
        "Config state ": "NSHUT","Node ": "0/FC3","0/FC4": {
        "Config state ": "NSHUT","Node ": "0/FC4","0/FC5": {
        "Config state ": "NSHUT","Node ": "0/FC5","0/FT0": {
        "Config state ": "NSHUT","Node ": "0/FT0","Type ": "NC55-5508-FAN"
    },"0/FT1": {
        "Config state ": "NSHUT","Node ": "0/FT1","0/FT2": {
        "Config state ": "NSHUT","Node ": "0/FT2","0/PM0": {
        "Config state ": "NSHUT","Node ": "0/PM0","Type ": "NC55-PWR-3KW-DC"
    },"0/PM1": {
        "Config state ": "NSHUT","Node ": "0/PM1","0/PM2": {
        "Config state ": "NSHUT","Node ": "0/PM2","0/PM3": {
        "Config state ": "NSHUT","Node ": "0/PM3","State ": "Failed","0/RP0/cpu0": {
        "Config state ": "NSHUT","Node ": "0/RP0/cpu0","Type ": "NC55-RP-E(Active)"
    },"0/RP1": {
        "Config state ": "NSHUT","Node ": "0/RP1","State ": "SW_INACTIVE","Type ": "NC55-RP-E"
    },"0/SC0": {
        "Config state ": "NSHUT","Node ": "0/SC0","Type ": "NC55-SC"
    },"0/SC1": {
        "Config state ": "NSHUT","Node ": "0/SC1","Type ": "NC55-SC"
    }
}

我使用了 JMESpath 模拟器并想出了

contains(*.["Config state "!='' && ("State "=='OPERATIONAL' || "State "=='IOS XR RUN')][],`false`)

这应该给我预期的结果,但是在 Ansible playbook 中使用它时,它会产生倾斜牙签综合症,并且它并没有完全产生预期的输出

我编写的 Ansible 任务如下所示:

- name: Query to display nodes
  set_fact:
    display_nodes: "{{ parsed_output | json_query(jmesquery) }}"
  vars:
    jmesquery: "contains(*.[\"Config state \"!='' && (\"State \"=='OPERATIONAL' || \"State \"=='IOS XR RUN')][],`false`)"
  
- debug:
    msg="{{ display_nodes }}"

请帮我改正。

解决方法

在 Ansible 和 JMESPath 中避免与引号冲突的两种简单方法:

  1. 使用YAML multilines notation

    some: >-
      as soon as you indent me properly,I am a string that do not need quotes anymore
    
  2. 正如您已经做过的那样,按照 Ansible 文档的建议,在 JMESPath 文字中使用反引号:

    在上面的示例中,使用反引号引用文字可以避免转义引号并保持可读性。

    来源:https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html#selecting-json-data-json-queries

所以它最终就像定义您的 jmesquery 变量一样简单:

jmesquery: >-
  contains(*.["Config state "!='' && ("State "=='OPERATIONAL' || "State "=='IOS XR RUN')][],`false`)

给定剧本:

- hosts: all
  gather_facts: no

  tasks:
    - set_fact:
        display_nodes: "{{ parsed_output | json_query(jmesquery) }}"
      vars:
        jmesquery: >-
          contains(*.["Config state "!='' && ("State "=='OPERATIONAL' || "State "=='IOS XR RUN')][],`false`)
        parsed_output:
          0/0/1:
            'Config state ': ''
            'Node ': 0/0/1
            'State ': OK
            'Type ': NC55-MPA-12T-S
          0/0/CPU0:
            'Config state ': NSHUT
            'Node ': 0/0/CPU0
            'State ': IOS XR RUN
            'Type ': NC55-MOD-A-S
          0/0/NPU0:
            'Config state ': ''
            'Node ': 0/0/NPU0
            'State ': UP
            'Type ': Slice
          0/FC0:
            'Config state ': NSHUT
            'Node ': 0/FC0
            'State ': OPERATIONAL
            'Type ': NC55-5508-FC
          0/FC1:
            'Config state ': NSHUT
            'Node ': 0/FC1
            'State ': OPERATIONAL
            'Type ': NC55-5508-FC
          0/FC2:
            'Config state ': NSHUT
            'Node ': 0/FC2
            'State ': OPERATIONAL
            'Type ': NC55-5508-FC
          0/FC3:
            'Config state ': NSHUT
            'Node ': 0/FC3
            'State ': OPERATIONAL
            'Type ': NC55-5508-FC
          0/FC4:
            'Config state ': NSHUT
            'Node ': 0/FC4
            'State ': OPERATIONAL
            'Type ': NC55-5508-FC
          0/FC5:
            'Config state ': NSHUT
            'Node ': 0/FC5
            'State ': OPERATIONAL
            'Type ': NC55-5508-FC
          0/FT0:
            'Config state ': NSHUT
            'Node ': 0/FT0
            'State ': OPERATIONAL
            'Type ': NC55-5508-FAN
          0/FT1:
            'Config state ': NSHUT
            'Node ': 0/FT1
            'State ': OPERATIONAL
            'Type ': NC55-5508-FAN
          0/FT2:
            'Config state ': NSHUT
            'Node ': 0/FT2
            'State ': OPERATIONAL
            'Type ': NC55-5508-FAN
          0/PM0:
            'Config state ': NSHUT
            'Node ': 0/PM0
            'State ': OPERATIONAL
            'Type ': NC55-PWR-3KW-DC
          0/PM1:
            'Config state ': NSHUT
            'Node ': 0/PM1
            'State ': OPERATIONAL
            'Type ': NC55-PWR-3KW-DC
          0/PM2:
            'Config state ': NSHUT
            'Node ': 0/PM2
            'State ': OPERATIONAL
            'Type ': NC55-PWR-3KW-DC
          0/PM3:
            'Config state ': NSHUT
            'Node ': 0/PM3
            'State ': FAILED
            'Type ': NC55-PWR-3KW-DC
          0/RP0/CPU0:
            'Config state ': NSHUT
            'Node ': 0/RP0/CPU0
            'State ': IOS XR RUN
            'Type ': NC55-RP-E(Active)
          0/RP1:
            'Config state ': NSHUT
            'Node ': 0/RP1
            'State ': SW_INACTIVE
            'Type ': NC55-RP-E
          0/SC0:
            'Config state ': NSHUT
            'Node ': 0/SC0
            'State ': OPERATIONAL
            'Type ': NC55-SC
          0/SC1:
            'Config state ': NSHUT
            'Node ': 0/SC1
            'State ': OPERATIONAL
            'Type ': NC55-SC
    - debug:
        var: display_nodes

总结如下:

PLAY [all] *********************************************************************

TASK [set_fact] ****************************************************************
ok: [localhost]

TASK [debug] *******************************************************************
ok: [localhost] => 
  display_nodes: true

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。