问题描述
我一直在尝试检查所有节点的条件,
('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 中避免与引号冲突的两种简单方法:
-
some: >- as soon as you indent me properly,I am a string that do not need quotes anymore
-
正如您已经做过的那样,按照 Ansible 文档的建议,在 JMESPath 文字中使用反引号:
在上面的示例中,使用反引号引用文字可以避免转义引号并保持可读性。
所以它最终就像定义您的 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