我从一个 Ansible 任务中得到了如下的字典输出“
msg": {
"vSwitch0": {
"failback": true,
"failover_active": [
"vmnic1",
"vmnic0"
],
"failover_standby": [],
"failure_detection": "link_status_only",
"lb": "loadbalance_srcid",
"mtu": 1500,
"notify": true,
"num_ports": 128,
"pnics": [
"vmnic0",
"vmnic1"
],
"security": [
false,
false,
false
],
"ts": false
}
}
}
我尝试使用 Json Query 将上述输出存储在变量中作为“all_vswitch_info”,并尝试提取如下所示的 pnics 列表,当我现在使用下面的内容时,
- 调试:消息:“{{all_vswitch_info| json_query('pnics')}}”
我得到的是空值
ok: [localhost] => {
"msg": ""
}
注意:我尝试使用其他选项作为消息:“{{all_vswitch_info| json_query('[].pnics')}}”,但仍然得到相同的结果
ok: [localhost] => {
"msg": ""
}
是否缺少了什么?注意:此特定输出包含 vSwitch0。在某些情况下,这可能是任何名称,例如 vswitch23 或 vswitch 3,或者使用其他名称。我无法在 json_query 中将名称硬编码为 vSwitch0。但是,物理是每个目标机器不会改变的属性名称。
答案1
正确的json_查询将会
pnics: "{{ all_vswitch_info|json_query('*.pnics') }}"
给出
pnics:
- - vmnic0
- vmnic1
您可以使用以下方式展平列表:json_查询
pnics: "{{ all_vswitch_info|json_query('*.pnics|[]') }}"
或使用过滤器压平
pnics: "{{ all_vswitch_info|json_query('*.pnics')|flatten }}"
两种选择均
pnics:
- vmnic0
- vmnic1
完整测试剧本的示例
- hosts: localhost
vars:
all_vswitch_info:
vSwitch0:
failback: true
failover_active:
- vmnic1
- vmnic0
failover_standby: []
failure_detection: link_status_only
lb: loadbalance_srcid
mtu: 1500
notify: true
num_ports: 128
pnics:
- vmnic0
- vmnic1
security:
- false
- false
- false
ts: false
pnics: "{{ all_vswitch_info|json_query('*.pnics') }}"
tasks:
- debug:
var: pnics