Печать объектов без ansible_host - PullRequest
0 голосов
/ 07 мая 2019

Я пытаюсь использовать jq для обработки JSON из модуля инвентаризации VMware Ansible, чтобы я мог создать список объектов (ВМ), для которых не определен ansible_host.

Ближе всего я былможно получить:

{
  "config.cpuHotAddEnabled": true,
  "config.cpuHotRemoveEnabled": false,
  "config.hardware.numCPU": 1,
  "config.instanceUuid": "500e4e98-50ec-a3a7-9d45-b0ac36c2d192",
  "config.name": "tu-openldap-01",
  "config.template": false,
  "guest.guestId": "rhel6_64Guest",
  "guest.guestState": "notRunning",
  "guest.hostName": "tu-openldap-01",
  "guest.ipAddress": null,
  "name": "tu-openldap-01",
  "runtime.maxMemoryUsage": 2048
}
{
  "config.cpuHotAddEnabled": true,
  "config.cpuHotRemoveEnabled": false,
  "config.hardware.numCPU": 1,
  "config.instanceUuid": "500efaa5-baac-163b-65c0-7ed2a19f1d7d",
  "config.name": "tu1vcm7tst2001",
  "config.template": false,
  "guest.guestId": "rhel7_64Guest",
  "guest.guestState": "running",
  "guest.hostName": "rhel7-template",
  "guest.ipAddress": null,
  "name": "tu1vcm7tst2001",
  "runtime.maxMemoryUsage": 4096
}

с использованием следующего:

jq '._meta.hostvars[] | select(.ansible_host | not)' prod-inventory_201905070920.json

Это почти то, где я хочу, но проблема в том, как мне напечатать эти плюс ключ для объектасам?

Если я это сделаю:

jq '._meta.hostvars | select(.ansible_host | not)' prod-inventory_201905070920.json

Я получу это:

"tw1pttest1001_420e92f4-453e-1267-4331-d6253d771882": {
    "ansible_host": "<omitted>",
    "config.cpuHotAddEnabled": true,
    "config.cpuHotRemoveEnabled": false,
    "config.hardware.numCPU": 2,
    "config.instanceUuid": "500ef630-16c1-cb91-be9c-e9e667b551d9",
    "config.name": "tw1pttest1001",
    "config.template": false,
    "guest.guestId": "windows9Server64Guest",
    "guest.guestState": "running",
    "guest.hostName": "<omitted>",
    "guest.ipAddress": "<omitted>",
    "name": "tw1pttest1001",
    "runtime.maxMemoryUsage": 49152
  },
  "tw1swsrm1001_420e18d2-0c96-0df5-e6c7-1ff8fc070cdb": {
    "ansible_host": "<omitted>",
    "config.cpuHotAddEnabled": true,
    "config.cpuHotRemoveEnabled": false,
    "config.hardware.numCPU": 4,
    "config.instanceUuid": "500e231d-1eda-4e66-3f4a-8c68392a70b5",
    "config.name": "tw1swsrm1001",
    "config.template": false,
    "guest.guestId": "windows9Server64Guest",
    "guest.guestState": "running",
    "guest.hostName": "<omitted>",
    "guest.ipAddress": "<omitted>",
    "name": "tw1swsrm1001",
    "runtime.maxMemoryUsage": 16384
  },

Есть предложения?Я чувствую, что это что-то простое, что я скучаю.

Ответы [ 2 ]

0 голосов
/ 09 мая 2019

Предполагая, что вы ищете элементы, найденные в объекте ._meta.hostvars, вы можете фильтровать объекты по ключу / значению, используя что-то вроде with_entries/1.

$ jq '._meta.hostvars | with_entries(select(.value.ansible_host | not))
' prod-inventory_201905070920.json

Это фактически примет hostvars Объект и сохранить только те свойства, которые соответствуют этому условию (не имеет ansible_host значение свойства).

0 голосов
/ 09 мая 2019

, если вы открыты для рассмотрения альтернатив, вот один, использующий утилиту Unix на основе walk-path jtc:

*** Я взял на себя смелость, компилируя исходный пример JSON из тех двух частей, которые вы показали:

bash $ <prod-inventory_201905070920.json jtc -w'<ansible_host>l: [-1]' -p
{
   "tw1pttest1001_420e92f4-453e-1267-4331-6d52d3778128": {
      "config.cpuHotAddEnabled": true,
      "config.cpuHotRemoveEnabled": false,
      "config.hardware.numCPU": 1,
      "config.instanceUuid": "500e4e98-50ec-a3a7-9d45-b0ac36c2d192",
      "config.name": "tu-openldap-01",
      "config.template": false,
      "guest.guestId": "rhel6_64Guest",
      "guest.guestState": "notRunning",
      "guest.hostName": "tu-openldap-01",
      "guest.ipAddress": null,
      "name": "tu-openldap-01",
      "runtime.maxMemoryUsage": 2048
   },
   "tw1swsrm1001_420e18d2-0c96-0df5-e6c7-f18fcf700dcb": {
      "config.cpuHotAddEnabled": true,
      "config.cpuHotRemoveEnabled": false,
      "config.hardware.numCPU": 1,
      "config.instanceUuid": "500efaa5-baac-163b-65c0-7ed2a19f1d7d",
      "config.name": "tu1vcm7tst2001",
      "config.template": false,
      "guest.guestId": "rhel7_64Guest",
      "guest.guestState": "running",
      "guest.hostName": "rhel7-template",
      "guest.ipAddress": null,
      "name": "tu1vcm7tst2001",
      "runtime.maxMemoryUsage": 4096
   }
}
bash $ 

Уточнение пешеходной дорожки (-w)

  • <ansible_host>l: - найдет все значения JSON с меткой ansible_host
  • [-1] выберет родительский элемент JSON (для каждой найденной метки), эффективно выделив всю запись, содержащую метку ansible_host

-p удалит все найденные записи, оставив исходный JSON только с теми, у которых нет записей, содержащих ansible_host

PS> Раскрытие информации: я создатель jtc инструмента

...