У меня есть следующий вывод json (сгенерированный ansible) и, казалось бы, простая задача вытащить несколько пар ключ / значение с помощью jq
.Тем не менее, я не могу получить желаемый результат.
{
"custom_stats": {},
"plays": [
{
"play": {
"id": "001dd8b7-1cca-07c6-2280-00000000043a",
"name": "Ansible Ad-Hoc"
},
"tasks": [
{
"hosts": {
"hostname01-con": {
"_ansible_no_log": false,
"_ansible_verbose_always": true,
"action": "debug",
"changed": false,
"hw_system_serial": "<SERIALNUMBER>"
},
"hostname02-con": {
"_ansible_no_log": false,
"_ansible_verbose_always": true,
"action": "debug",
"changed": false,
"hw_system_serial": "<SERIALNUMBER>"
},
"hostname03-con": {
"_ansible_no_log": false,
"_ansible_verbose_always": true,
"action": "debug",
"changed": false,
"hw_system_serial": "<SERIALNUMBER>"
},
"hostname04-con": {
"_ansible_no_log": false,
"_ansible_verbose_always": true,
"action": "debug",
"changed": false,
"hw_system_serial": "<SERIALNUMBER>"
},
"hostname05-con": {
"_ansible_no_log": false,
"_ansible_verbose_always": true,
"action": "debug",
"changed": false,
"hw_system_serial": "<SERIALNUMBER>"
},
"hostname06-con": {
"_ansible_no_log": false,
"_ansible_verbose_always": true,
"action": "debug",
"changed": false,
"hw_system_serial": "<SERIALNUMBER>"
},
"hostname07-con": {
"_ansible_no_log": false,
"_ansible_verbose_always": true,
"action": "debug",
"changed": false,
"hw_system_serial": "<SERIALNUMBER>"
},
"hostname01-con": {
"_ansible_no_log": false,
"_ansible_verbose_always": true,
"action": "debug",
"changed": false,
"hw_system_serial": "<SERIALNUMBER>"
},
"hostname02-con": {
"_ansible_no_log": false,
"_ansible_verbose_always": true,
"action": "debug",
"changed": false,
"hw_system_serial": "<SERIALNUMBER>"
},
"hostname03-con": {
"_ansible_no_log": false,
"_ansible_verbose_always": true,
"action": "debug",
"changed": false,
"hw_system_serial": "<SERIALNUMBER>"
},
"hostname04-con": {
"_ansible_no_log": false,
"_ansible_verbose_always": true,
"action": "debug",
"changed": false,
"hw_system_serial": "<SERIALNUMBER>"
},
"hostname05-con": {
"_ansible_no_log": false,
"_ansible_verbose_always": true,
"action": "debug",
"changed": false,
"hw_system_serial": "<SERIALNUMBER>"
},
"hostname01-con": {
"_ansible_no_log": false,
"_ansible_verbose_always": true,
"action": "debug",
"changed": false,
"hw_system_serial": "<SERIALNUMBER>"
},
"hostname02-con": {
"_ansible_no_log": false,
"_ansible_verbose_always": true,
"action": "debug",
"changed": false,
"hw_system_serial": "<SERIALNUMBER>"
},
"hostname03-con": {
"_ansible_no_log": false,
"_ansible_verbose_always": true,
"action": "debug",
"changed": false,
"hw_system_serial": "<SERIALNUMBER>"
},
"hostname04-con": {
"_ansible_no_log": false,
"_ansible_verbose_always": true,
"action": "debug",
"changed": false,
"hw_system_serial": "<SERIALNUMBER>"
},
"hostname05-con": {
"_ansible_no_log": false,
"_ansible_verbose_always": true,
"action": "debug",
"changed": false,
"hw_system_serial": "<SERIALNUMBER>"
},
"hostname06-con": {
"_ansible_no_log": false,
"_ansible_verbose_always": true,
"action": "debug",
"changed": false,
"hw_system_serial": "<SERIALNUMBER>"
},
"hostname07-con": {
"_ansible_no_log": false,
"_ansible_verbose_always": true,
"action": "debug",
"changed": false,
"hw_system_serial": "<SERIALNUMBER>"
}
},
"task": {
"id": "001dd8b7-1cca-07c6-2280-00000000043c",
"name": "debug"
}
}
]
}
],
"stats": {
"hostname01-con": {
"changed": 0,
"failures": 0,
"ok": 1,
"skipped": 0,
"unreachable": 0
},
"hostname02-con": {
"changed": 0,
"failures": 0,
"ok": 1,
"skipped": 0,
"unreachable": 0
},
"hostname03-con": {
"changed": 0,
"failures": 0,
"ok": 1,
"skipped": 0,
"unreachable": 0
},
"hostname04-con": {
"changed": 0,
"failures": 0,
"ok": 1,
"skipped": 0,
"unreachable": 0
},
"hostname05-con": {
"changed": 0,
"failures": 0,
"ok": 1,
"skipped": 0,
"unreachable": 0
},
"hostname06-con": {
"changed": 0,
"failures": 0,
"ok": 1,
"skipped": 0,
"unreachable": 0
},
"hostname07-con": {
"changed": 0,
"failures": 0,
"ok": 1,
"skipped": 0,
"unreachable": 0
},
"hostname01-con": {
"changed": 0,
"failures": 0,
"ok": 1,
"skipped": 0,
"unreachable": 0
},
"hostname02-con": {
"changed": 0,
"failures": 0,
"ok": 1,
"skipped": 0,
"unreachable": 0
},
"hostname03-con": {
"changed": 0,
"failures": 0,
"ok": 1,
"skipped": 0,
"unreachable": 0
},
"hostname04-con": {
"changed": 0,
"failures": 0,
"ok": 1,
"skipped": 0,
"unreachable": 0
},
"hostname05-con": {
"changed": 0,
"failures": 0,
"ok": 1,
"skipped": 0,
"unreachable": 0
},
"hostname01-con": {
"changed": 0,
"failures": 0,
"ok": 1,
"skipped": 0,
"unreachable": 0
},
"hostname02-con": {
"changed": 0,
"failures": 0,
"ok": 1,
"skipped": 0,
"unreachable": 0
},
"hostname03-con": {
"changed": 0,
"failures": 0,
"ok": 1,
"skipped": 0,
"unreachable": 0
},
"hostname04-con": {
"changed": 0,
"failures": 0,
"ok": 1,
"skipped": 0,
"unreachable": 0
},
"hostname05-con": {
"changed": 0,
"failures": 0,
"ok": 1,
"skipped": 0,
"unreachable": 0
},
"hostname06-con": {
"changed": 0,
"failures": 0,
"ok": 1,
"skipped": 0,
"unreachable": 0
},
"hostname07-con": {
"changed": 0,
"failures": 0,
"ok": 1,
"skipped": 0,
"unreachable": 0
}
}
}
По сути, я просто хотел бы получить ключ от самого внутреннего объекта вместе с его значением для hw_system_serial
, возвращается на той же строке.Примерно так:
hostname01-con: <SERIAL_NUMBER_1>
hostname02-con: <SERIAL_NUMBER_2>
etc
Я чувствую, что это должно быть тривиально (в этот раз я мог бы написать немного сценария на Ruby или Python ...), но попытайтесь, как я, я не могу его получитьправильный.Я перепробовал все виды вещей, но в итоге я либо перебираю список хостов для каждого серийного номера, либо возвращаю два отдельных списка (один хост и один серийный номер).
Например, это:
.plays[].tasks[].hosts | keys as $hosts | .[].hw_system_serial as $serial | $hosts | join(": ") + $serial
возвращает список всех имен хостов в одной строке, за которым следует один серийный номер.
I думаю, будет работать, если яможно преобразовать $serial
в массив, но мои попытки использовать split()
также не увенчались успехом (например, $serial | split("\r")
возвращает список массивов из одного элемента, а не массив элементов).
Что яздесь не хватает?Я чувствую, что jq
должно быть легко с этим (опять же, любой язык сценариев с парсером JSON ...), но разве это не подходящий инструмент для работы?