как отфильтровать значение нескольких ключей из вывода json с помощью JMESPATH или json_query для использования в ansible? - PullRequest
0 голосов
/ 27 мая 2020

Я хочу отфильтровать каждое значение ключей снизу json с помощью json_query | JMESPATH, как этого добиться?

{
  "facts_hash": {
    "processors::count": "96",
    "processors::physicalcount": "2",
    "processor0": "Intel(R) Xeon(R) Gold 6252 CPU @ 2.10GHz",
    "processorcount": "96",
    "macaddress": "08:f1:ea:6d:04:3G",
    "ipaddress": "192.168.101.135",
    "manufacturer": "HPE",
    "productname": "ProLiant DL360 Gen10",
    "serialnumber": "SGH93GDCR",
    "memorysize_mb": "773730.12",
    "ipmi_ipaddress": "172.16.200.28",
      },
  "id": 284
}

Ожидаемый результат, может быть таким, как показано ниже

  [ "96",
    "2",
    "Intel(R) Xeon(R) Gold 6252 CPU @ 2.10GHz",
    "96",
    "08:f1:ea:6d:03:3c",
    "192.168.101.135",
    "HPE",
    "ProLiant DL360 Gen10",
    "SGH936XG91",
    "773730.12",
    "172.16.100.24",
    "284" ]

Вот приведенный ниже запрос, который я пробовал и который возвращает значение.

"{{ facts_hash | json_query('[manufacturer, ipaddress, macaddress, productname, serialnumber, processorcount, processor0, memorysize_mb, ipmi_ipaddress]') | list }}"

несколько ключей находятся в json с четырьмя ::, которые я не могу отфильтровать, вот эти ключи "процессоры :: счетчик" и "процессоры :: физический счетчик" вместе с тем, что я не могу получить " id "

возвращаемое значение запроса.

 ok: [localhost] => {
    "ansible_facts": {
        "allvalue": [
            "HPE",
            "192.168.101.135",
            "08:f1:ea:6d:03:3c",
            "ProLiant DL360 Gen10",
            "SGH936XG91",
            "96",
            "Intel(R) Xeon(R) Gold 6252 CPU @ 2.10GHz",
            "773730.12",
            "172.16.100.24"
        ]
    },
    "changed": false
}

Спасибо

1 Ответ

0 голосов
/ 28 мая 2020

Я бы сделал это с facts_hash | dict2items | map(attribute="value") | list сам, но ответ на ваш вопрос, похоже, состоит в том, чтобы указать имена клавиш в селекторе JMESPath:

- debug:
    msg: "{{ facts_hash |
      json_query('[\"processors::count\",  \"processors::physicalcount\", manufacturer, ipaddress, macaddress, productname, serialnumber, processorcount, processor0, memorysize_mb, ipmi_ipaddress]') | list }}"

, которые можно сделать немного более разборчивыми, извлечение выражения JMESPath в его собственную локальную переменную:

- debug:
    msg: "{{ facts_hash | json_query(facts_query) | list }}"
  vars:
    facts_query: '["processors::count", "processors::physicalcount", manufacturer, ipaddress, macaddress, productname, serialnumber, processorcount, processor0, memorysize_mb, ipmi_ipaddress]'

как для

вместе с тем, что я не могу получить «id»

это потому, что id является родственником из facts_hash, поэтому какая бы структура не содержала facts_hash, которую вы делаете set_fact: для извлечения facts_hash, вам понадобится аналогичное извлечение для возьмите его id поле

...