如何解决如何在ansible playbook中获取json_query显示属性名称
我以这个 json 块为例:
"msg": {
"10.10.28.10": {
"core": 23,"cpuCoreUsage": 0.0,"cputhreshold": 80,"status": "healthy","status_code": 0,"status_reason": "Checks passed","timestamp": 1614281443,"total": 0
},"10.10.28.5": {
"core": 18,"cpuCoreUsage": 2.0,"capacity": 1080
}
我正在尝试弄清楚如何使带有属性名称和状态的输出看起来像这样。
DESIRED OUTPUT:
IP: 10.10.28.5,status: healthy,status_code: 0
IP: 10.10.28.10,status_code: 0
我可以打印除 IP 部分以外的所有内容:
- name: STATUS QUERY
debug:
msg: "code: {{ item }}"
loop: "{{ data.json | json_query(status_code_query) | list }}"
vars:
status_code_query: "*.{statuscode: status_code,status: status}"
解决方法
我不会为此使用 JMESPath,原因是,虽然它非常擅长查询 JSON,但它并不擅长显示 JSON 键。
keys()
函数是您可以在那里找到的最接近的函数,但它会生成一个数组,并且由于您无法返回父节点,因此您无法执行以下操作:
*.{IP: keys($)[0],statuscode: status_code,status: status}
虽然这是一个非常频繁请求的功能:https://github.com/jmespath/jmespath.js/issues/22
现在要解决您的用例,您可以使用 keys()
函数,但使用的是 Python 函数。
您还有一个问题,即 data.json
的所有值都不是字典:在 "capacity": 1080
中,该值是一个简单的 int
。
您可以使用 when
测试来解决这个奇怪的数据结构,并验证您的值是否确实是一个 mapping
(或者换句话说,一个字典)。
给定剧本:
- hosts: all
gather_facts: yes
tasks:
- debug:
msg: >-
IP: {{ item }},status: {{ data.json[item].status }},status_code: {{ data.json[item].status_code }}
loop: "{{ data.json.keys() }}"
when: data.json[item] is mapping
vars:
data:
json:
10.10.28.10:
core: 23
cpuCoreUsage: 0
cputhreshold: 80
status: healthy
status_code: 0
status_reason: Checks passed
timestamp: 1614281443
total: 0
10.10.28.5:
core: 18
cpuCoreUsage: 2
cputhreshold: 80
status: healthy-
status_code: 0-
status_reason: Checks passed
timestamp: 1614281443
total: 0
capacity: 1080
总结如下:
PLAY [all] **********************************************************************************************************
TASK [Gathering Facts] **********************************************************************************************
ok: [localhost]
TASK [debug] ********************************************************************************************************
ok: [localhost] => (item=10.10.28.10) => {
"msg": "IP: 10.10.28.10,status: healthy,status_code: 0"
}
ok: [localhost] => (item=10.10.28.5) => {
"msg": "IP: 10.10.28.5,status: healthy-,status_code: 0-"
}
skipping: [localhost] => (item=capacity)
PLAY RECAP **********************************************************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
也就是说,它也是 dict2items
过滤器的完美用例:
- hosts: all
gather_facts: yes
tasks:
- debug:
msg: >-
IP: {{ item.key }},status: {{ item.value.status }},status_code: {{ item.value.status_code }}
loop: "{{ data.json | dict2items }}"
when: item.value is mapping
vars:
data:
json:
10.10.28.10:
core: 23
cpuCoreUsage: 0
cputhreshold: 80
status: healthy
status_code: 0
status_reason: Checks passed
timestamp: 1614281443
total: 0
10.10.28.5:
core: 18
cpuCoreUsage: 2
cputhreshold: 80
status: healthy-
status_code: 0-
status_reason: Checks passed
timestamp: 1614281443
total: 0
capacity: 1080
将产生相同的回顾。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。