如何在ansible playbook中获取json_查询显示属性名称

如何在ansible playbook中获取json_查询显示属性名称,json,ansible,jmespath,json-query,Json,Ansible,Jmespath,Json Query,我以这个json块为例: "msg": { "10.10.28.10": { "core": 23, "cpuCoreUsage": 0.0, "cputhreshold": 80, "status": "healthy",

我以这个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,
            "cputhreshold": 80,
            "status": "healthy",
            "status_code": 0,
            "status_reason": "Checks passed",
            "timestamp": 1614281443,
            "total": 0
        },
        "capacity": 1080
}
我试图弄清楚如何让这个输出的属性名和状态看起来像这样

DESIRED OUTPUT:
IP: 10.10.28.5, status: healthy, status_code: 0
IP: 10.10.28.10, status: healthy, 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键

该函数是您可以在那里找到的最接近的函数,但它将生成一个数组,并且由于您无法返回到父节点,因此您无法执行以下操作:

*。{IP:keys($)[0],statuscode:status\u code,status:status}
尽管这是一项经常被要求的功能:


现在,为了解决您的用例,您可以使用函数,但Python的函数除外

您还有一个问题,即
data.json的所有值都不是字典:在
的“capacity”:1080
中,值是一个简单的
int

测试并验证您的值是否确实是一个(或者换句话说是一个字典)时,您可以使用
来绕过这个奇怪的数据结构

根据剧本:

-主机:所有
收集事实:是的
任务:
-调试:
味精:>-
IP:{{item}},
状态:{{data.json[item].status},
状态代码:{{data.json[item]。状态代码}
循环:“{data.json.keys()}}”
当:data.json[item]正在映射时
变量:
数据:
json:
10.10.28.10:
核心:23
CPU重用:0
cputhreshold:80
状况:健康
状态代码:0
状态\原因:检查通过
时间戳:1614281443
总数:0
10.10.28.5:
核心:18
重复使用:2
cputhreshold:80
状况:健康-
状态代码:0-
状态\原因:检查通过
时间戳:1614281443
总数:0
容量:1080
这就产生了重述:

播放[全部]**********************************************************************************************************
任务[收集事实]**********************************************************************************************
确定:[本地主机]
任务[调试]********************************************************************************************************
确定:[localhost]=>(项=10.10.28.10)=>{
“msg”:“IP:10.10.28.10,状态:健康,状态代码:0”
}
确定:[localhost]=>(项=10.10.28.5)=>{
“msg”:“IP:10.10.28.5,状态:健康-,状态代码:0-”
}
跳过:[localhost]=>(项=容量)
重演**********************************************************************************************************
localhost:确定=2更改=0无法访问=0失败=0跳过=0获救=0忽略=0

也就是说,它也是过滤器的完美用例:

-主机:所有
收集事实:是的
任务:
-调试:
味精:>-
IP:{{item.key}},
状态:{{item.value.status},
状态代码:{{item.value.status_code}
循环:“{data.json | dict2items}”
当:item.value为映射时
变量:
数据:
json:
10.10.28.10:
核心:23
CPU重用:0
cputhreshold:80
状况:健康
状态代码:0
状态\原因:检查通过
时间戳:1614281443
总数:0
10.10.28.5:
核心:18
重复使用:2
cputhreshold:80
状况:健康-
状态代码:0-
状态\原因:检查通过
时间戳:1614281443
总数:0
容量:1080

将产生相同的重述。

感谢您的帮助!我得到这个错误:失败!=>{“msg”:“该任务包含一个带有未定义变量的选项。错误是:'int object'没有属性'status\u code'我使用它而不是您的变量:-名称:获取运行状况检查uri:url:http://{{ansible\u fqdn}”:8888/healthcheck方法:GET return\u content:yes status\u code:200 body\u format:json validate\u certs:no register:data-debug:msg:>-IP:{{item}},status\u code:{data.json[item].status\u code}}循环:“{{data.json.keys()}}”表示
data.json[item]
不是你在问题中提供的字典。调试它以查看它给出了什么,并在问题中编辑它:
-Debug:var=data.json
我添加了我的调试输出作为答案。你应该有你的问题,而不是说,我编辑了答案以涵盖你的问题。