- Ruby 100%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| config.yaml | ||
| README.md | ||
| vmware_report.rb | ||
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
pgundhttparty - 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_bytesist 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
NULLsein; diese Werte gehen mit0in die Cluster-Kapazitätssummen ein, der Host selbst bleibt inhost_countenthalten. - 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.