Как получить указанные значения из фактов ansbile

Я немного смущен. Я уже пробовал jmespath, но не помогло. Мне нужно получить объект высокого уровня, который содержит указанный объект. В приведенном ниже примере мы видим некоторый факт о жестких дисках. Мне нужно получить имя диска (sdf, sdg или dm-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
        }
      }
   }

person Леонид Кутепов    schedule 07.08.2018    source источник


Ответы (1)


Это должно работать:

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

объяснение

Сначала мы создаем временный объект Для каждого объекта HDD: {value, condition}. condition будет null, если partitions.sdf1 не существует на соответствующем объекте жесткого диска (sdf, sdg dm-0). Если partitions.sdf1 существует, condition будет содержать этот объект, то есть:

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

Используя [?condition], вы отфильтровываете все объекты, где condition равно null. Наконец, мы извлекаем фактическое значение, используя .value

person myrdd    schedule 25.08.2018