Proxmox API - Parse JSON mit while do

JeffersonGER

New Member
Jan 19, 2023
2
0
1
Hallo liebe Community, evtl. ist hier jemand der Lust und Zeit hat mir bei meinem Vorhaben zu helfen?

Idee:
Ich will mir Statis über VMs abholen, um diese dann nach Prometheus zu überführen
damit ich anschließend mit Grafana eine Darstellung habe.

Leider steht mein Server nicht bei mir im Netzwerk, sodass ich die Daten über das Prometheus Pushgateway Daten empfangen muss.

Also wollte ich mir schnell ein kleines Script schreiben:

1.) Daten von der Proxmox API via JSON holen
pvesh get /cluster/resources --type vm --output-format json-pretty

2.) Filtern
jq '.[] | select(has("name"))'

3.) Über alle iterieren
while do ... done

4.) Daten ans Pushgateway übertragen
echo "vm_cpu $vm_cpu" | curl -k -u ${user}:${password} --data-binary @- https://monitoring.myserver.local/metrics/job/watchdog/instance/server1/provider/node1"

Hier mein Script:
Bash:
pvesh get /cluster/resources --type vm --output-format json-pretty | jq '.[] | select(has("name"))' | while read vm; do
  vm_name=$(echo $vm | jq -r '"name"')
  vm_cpu=$(echo $vm | jq -r 'cpu')
  vm_ram=$(echo $vm | jq -r 'mem')
  vm_hdd=$(echo $vm | jq -r 'rootfs')
  echo "vm_name{name=\"$vm_name\"} $vm_name"
  echo "vm_cpu{name=\"$vm_name\"} $vm_cpu"
  echo "vm_ram{name=\"$vm_name\"} $vm_ram"
  echo "vm_hdd{name=\"$vm_name\"} $vm_hdd"
done


Mit dem folgenden Command bekomme ich eine fertige JSON-PRETTY, zudem stelle ich gleich sicher, dass ich nur solche erhalte, die auch mit dem Namen gefüllt sind (Sinnvoll oder nicht sei mal dahingestellt):
pvesh get /cluster/resources --type vm --output-format json-pretty | jq '.[] | select(has("name"))'

Teste ich das jetzt mit dem folgenden Command, funktioniert es auch:
pvesh get /cluster/resources --type vm --output-format json-pretty | jq '.[] | select(has("name"))' | jq '.name'
"vm1"
"vm2"
"vm3"
"vm4"
"vm5"

Gleiches mit
pvesh get /cluster/resources --type vm --output-format json-pretty | jq '.[] | select(has("name"))' | jq '.cpu'
0.0368112141568371
0.00564438617071503
0.0593887588396973
0.00736224283136743
0.00208596880222077

Sobald ich "jq" allerdings im Loop verwende, kann er das nicht mehr parsen.
Kann mir dafür jemand eine Lösung oder zumindest einen Ansatz nennen?

Danke euch!


JSON:
{
  "cpu": 0.0454924060803185,
  "disk": 0,
  "diskread": 507049018368,
  "diskwrite": 279513862144,
  "id": "qemu/1003",
  "maxcpu": 8,
  "maxdisk": 53687091200,
  "maxmem": 8589934592,
  "mem": 8162811904,
  "name": "vm1",
  "netin": 134538513130,
  "netout": 893507822217,
  "node": "node1",
  "status": "running",
  "template": 0,
  "type": "qemu",
  "uptime": 3156490,
  "vmid": 1003
}
{
  "cpu": 0.00588580995109243,
  "disk": 0,
  "diskread": 13938100224,
  "diskwrite": 158685310976,
  "id": "qemu/1004",
  "maxcpu": 4,
  "maxdisk": 107374182400,
  "maxmem": 8589934592,
  "mem": 8163450880,
  "name": "vm2",
  "netin": 20033221224,
  "netout": 28626043846,
  "node": "node1",
  "status": "running",
  "template": 0,
  "type": "qemu",
  "uptime": 3156486,
  "vmid": 1004
}
{
  "cpu": 0.110849420745574,
  "disk": 0,
  "diskread": 6359791662,
  "diskwrite": 203040993280,
  "id": "qemu/102",
  "maxcpu": 4,
  "maxdisk": 107374182400,
  "maxmem": 8589934592,
  "mem": 8245972992,
  "name": "vm3",
  "netin": 167053410575,
  "netout": 127232851420,
  "node": "node1",
  "status": "running",
  "template": 0,
  "type": "qemu",
  "uptime": 3156612,
  "vmid": 102
}
{
  "cpu": 0.0154502511216176,
  "disk": 0,
  "diskread": 205292432896,
  "diskwrite": 85553895424,
  "id": "qemu/103",
  "maxcpu": 4,
  "maxdisk": 112742891520,
  "maxmem": 4294967296,
  "mem": 3542225598,
  "name": "vm4",
  "netin": 0,
  "netout": 0,
  "node": "node1",
  "status": "running",
  "template": 0,
  "type": "qemu",
  "uptime": 3156551,
  "vmid": 103
}
{
  "cpu": 0.00220717873165966,
  "disk": 0,
  "diskread": 1294748160,
  "diskwrite": 30596280320,
  "id": "qemu/1056",
  "maxcpu": 8,
  "maxdisk": 62277025792,
  "maxmem": 8589934592,
  "mem": 5532676096,
  "name": "vm5",
  "netin": 1789980526,
  "netout": 418077357,
  "node": "node1",
  "status": "running",
  "template": 0,
  "type": "qemu",
  "uptime": 3156480,
  "vmid": 1056
}
 
Also damit das funktioniert, musst du nur zwei kleine Sachen am Skript verändern:
  1. jq im Schleifenkopf mit -c (compact output) aufrufen.
  2. In Zeile 2 bis 5 jq -r '.attribute' verwenden (also z.B. jq -r '.name').
Zur Erklärung: Ohne -c gibt jq das JSON prettified aus, d.h. eine property pro Zeile. read liest immer eine Zeile - damit enthält $vm dann im ersten Durchlauf {, im zweiten "cpu": 0.0454924060803185, usw.
Und zu 2.: Um ein bestimmten key mit jq zu selektieren, wird immer .prop verwendet. :)
 
  • Like
Reactions: JeffersonGER
Also damit das funktioniert, musst du nur zwei kleine Sachen am Skript verändern:
  1. jq im Schleifenkopf mit -c (compact output) aufrufen.
  2. In Zeile 2 bis 5 jq -r '.attribute' verwenden (also z.B. jq -r '.name').
Zur Erklärung: Ohne -c gibt jq das JSON prettified aus, d.h. eine property pro Zeile. read liest immer eine Zeile - damit enthält $vm dann im ersten Durchlauf {, im zweiten "cpu": 0.0454924060803185, usw.
Und zu 2.: Um ein bestimmten key mit jq zu selektieren, wird immer .prop verwendet. :)
Danke, wieder was gelernt .. man page 4tw :D
Wenn ich fertig bin, stell ich das fertige Script mit allen Infos hier oben in meinen Post, können andere sicherlich auch mal gebrauchen.
 

About

The Proxmox community has been around for many years and offers help and support for Proxmox VE, Proxmox Backup Server, and Proxmox Mail Gateway.
We think our community is one of the best thanks to people like you!

Get your subscription!

The Proxmox team works very hard to make sure you are running the best software and getting stable updates and security enhancements, as well as quick enterprise support. Tens of thousands of happy customers have a Proxmox subscription. Get yours easily in our online shop.

Buy now!