Ruby-Skript für historische VM-, ESXi-Host- und Cluster-Inventardaten aus einem oder mehreren VMware-vCentern. Alle Daten eines Laufs erhalten exakt denselben UTC-Timestamp und werden gemeinsam in einer PostgreSQL-Transaktion gespeichert.
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-07-28 14:44:36 +02:00
config.yaml Add config.yaml 2026-07-28 14:44:36 +02:00
README.md Update README.md 2026-07-28 14:39:35 +02:00
vmware_report.rb Add vmware_report.rb 2026-07-28 14:40:30 +02:00

vmware_report

Ruby-Skript für historische VM-, ESXi-Host- und Cluster-Inventardaten aus einem oder mehreren VMware-vCentern. Alle Daten eines Laufs erhalten exakt denselben UTC-Timestamp und werden gemeinsam in einer PostgreSQL-Transaktion gespeichert.

Gespeicherte Daten

vm_inventory

  • vCenter, VM-ID und VM-Name
  • Cluster-ID und Clustername; bei Standalone-Hosts leer
  • konfigurierte vCPUs und RAM in MiB
  • Anzahl virtueller Festplatten
  • provisionierte Festplattenkapazität in Bytes
  • VM-Tags als JSONB-Array

host_inventory

  • vCenter, Host-ID und Hostname
  • Cluster-ID und Clustername; bei Standalone-Hosts leer
  • Connection- und Power-State
  • CPU-Sockel, CPU-Kerne und CPU-Threads
  • CPU-Modell, CPU-Takt und physischer RAM

cluster_inventory

  • Cluster-ID, Clustername und Root-Resource-Pool
  • HA- und DRS-Status
  • Anzahl Hosts und VMs
  • summierte CPU-Sockel, Kerne, Threads und Host-RAM
  • summierte VM-vCPUs, VM-RAM und provisionierte Disk-Kapazität

Voraussetzungen

  • Ruby
  • PostgreSQL mit vorhandener Datenbank und Benutzer
  • Ruby-Gems pg und httparty
  • vCenter 8.0 Update 1 oder neuer für die Host-Hardwareabfrage
gem install pg httparty

Konfiguration

Beim ersten Start wird automatisch eine geschützte config.yaml erzeugt:

ruby vmware_report.rb

Danach Datenbank- und vCenter-Zugangsdaten eintragen. Passwörter können über password oder sicherer über password_env gelesen werden.

Für die Host-Hardware-API sollte normalerweise stehen:

vi_api_release: auto

Datenbank initialisieren oder aktualisieren

ruby vmware_report.rb --init-db

Der Befehl erstellt die Tabellen vm_inventory, host_inventory und cluster_inventory. Bei einer bestehenden Installation werden die Cluster-Spalten in den VM- und Hosttabellen automatisch ergänzt.

PostgreSQL, Datenbank und DB-Benutzer müssen vorher bereits vorhanden sein.

Collector starten

ruby vmware_report.rb

Andere Konfigurationsdatei verwenden:

ruby vmware_report.rb --config /etc/vmware_report/config.yaml

Skalierung und API-Limits

Die vCenter-Listen für VMs und Hosts besitzen keinen Marker oder Cursor. Sie liefern maximal 4.000 VMs beziehungsweise 2.500 Hosts und antworten bei größeren Treffermengen mit einem Fehler. Der Collector verwendet deshalb keine unvollständige globale Liste:

  • Hosts und VMs werden zuerst clusterweise abgefragt.
  • Erreicht ein Cluster das VM-Limit, werden seine VMs hostweise ermittelt und anschließend anhand der VM-ID zusammengeführt.
  • Standalone-Hosts werden separat abgefragt; bei sehr vielen Standalone-Hosts erfolgt eine weitere Aufteilung nach Datacentern.
  • Doppelt gelieferte Objekte werden anhand ihrer technischen vCenter-ID dedupliziert.

Die Tag-Zuordnungen werden nicht mehr mit einem POST pro VM gelesen. Stattdessen ruft der Collector /api/vcenter/tagging/associations einmal zentral auf, folgt allen von VMware gelieferten Markern und baut daraus eine Zuordnung VM-ID → Tags. Die sichtbaren Namen werden nur einmal je eindeutiger Tag-ID geladen und gecacht. Bei 3.000 VMs entfallen dadurch ungefähr 3.000 einzelne Tag-Requests.

Beispielabfragen

Clusterübersicht des letzten Snapshots:

SELECT
    vcenter_name,
    cluster_name,
    ha_enabled,
    drs_enabled,
    host_count,
    vm_count,
    cpu_cores,
    allocated_vcpu,
    ROUND(host_memory_bytes / 1024.0 / 1024 / 1024, 2) AS host_memory_gib,
    ROUND(allocated_memory_mib / 1024.0, 2) AS allocated_memory_gib,
    ROUND(provisioned_disk_bytes / 1024.0 / 1024 / 1024, 2) AS provisioned_disk_gib
FROM cluster_inventory
WHERE collected_at = (SELECT MAX(collected_at) FROM cluster_inventory)
ORDER BY vcenter_name, cluster_name;

VMs eines Clusters:

SELECT vm_name, cpu_count, memory_mib, disk_count, provisioned_disk_bytes, tags
FROM vm_inventory
WHERE collected_at = (SELECT MAX(collected_at) FROM vm_inventory)
  AND vcenter_name = 'vc-prod-01'
  AND cluster_name = 'Production-Cluster'
ORDER BY vm_name;

Standalone-Hosts anzeigen:

SELECT vcenter_name, host_name, cpu_cores, memory_bytes
FROM host_inventory
WHERE collected_at = (SELECT MAX(collected_at) FROM host_inventory)
  AND cluster_id IS NULL
ORDER BY vcenter_name, host_name;

Anzeigen von VMs mit speziellen TAG:

SELECT *
FROM vm_inventory
WHERE tags ? 'BACKUP_DAILY';

Hinweise

  • VM-CPU und VM-RAM sind konfigurierte Ressourcen, keine Auslastungswerte.
  • provisioned_disk_bytes ist die konfigurierte Disk-Kapazität, nicht zwingend der tatsächlich belegte Datastore-Speicher.
  • Die Cluster-Summen werden aus den im selben Lauf erfassten VM- und Hostzeilen berechnet.
  • Bei nicht verbundenen Hosts können Hardwarewerte NULL sein; diese Werte gehen mit 0 in die Cluster-Kapazitätssummen ein, der Host selbst bleibt in host_count enthalten.
  • Standalone-Hosts und deren VMs erhalten keine künstliche Clusterzuordnung.
  • Schlägt ein Teil der Sammlung oder Speicherung fehl, wird kein unvollständiger Snapshot gespeichert.
  • Ein PostgreSQL Advisory Lock verhindert zwei gleichzeitige Schreibvorgänge.