如何从可疑事实中获取指定的值

时间:2018-08-07 15:07:41

标签: json parsing jinja2 ansible-facts jmespath

我有点困惑。 我已经尝试过jmespath,但没有帮助。 我需要获取一个包含指定对象的高级对象。 在下面的示例中,我们看到了有关HDD的一个事实。我需要获取包含指定分区的HDD的磁盘名称(sdfsdgdm-0),例如sdf1

我有这个jmespath查询:

msg.*.[partitions.sdf1]

但是它只显示了sdf1中的所有内容。像[?partitions=="sdf1"]这样的过滤器在这里不起作用, 所以问题是:在我的示例中如何保留整个sdf对象?

提前谢谢!

  {
    "msg": {
        "sdf": {
            "partitions": {
                "sdf1": {
                    "holders": [],
                    "links": {
                        "ids": [
                            "17101686F123-part1",
                            "wwn-0x123456-part1"
                        ]
                    },
                    "sectors": "1875380224"
                 }
            },
            "removable": "0",
            "rotational": "0"
        },
        "sdg": {
            "partitions": {
                "sdg1": {
                    "holders": [],
                    "links": {
                        "ids": [
                            "164414123CEB-part1",
                            "wwn-0x1233451234831ceb-part1"
                        ]
                    },
                     "uuid": "F301-FA7F"
                }
             },
            "removable": "0"
         },
        "dm-0": {
            "holders": [],
            "host": "",
            "links": {
                "ids": [],
                "uuids": []
            },
            "vendor": null,
            "virtual": 1
        }
      }
   }

1 个答案:

答案 0 :(得分:0)

这应该有效:

msg.*.{value: @, condition: partitions.sdf1}[?condition].value

解释

首先,我们为每个HDD对象创建一个临时对象:{value, condition}。如果在相应的HDD(conditionnull partitions.sdf1)对象上不存在sdf,则sdg将是dm-0。如果partitions.sdf1存在,则condition将包含该对象,即:

"condition": {
  "holders": [],
  "links": {
    "ids": [
      "17101686F123-part1",
      "wwn-0x123456-part1"
    ]
  },
  "sectors": "1875380224"
}

使用[?condition]过滤掉conditionnull的所有对象。最后,我们使用.value

提取实际值