PowerCLI – Snapshots monitoren
Snapshots sind in vSphere eine tolle Möglichkeit einen Stand einer VM einzufrieren. Allerdings ist es ratsam so wenige Snapshots wie möglich auf einer VM zu halten und so kurz wie möglich. Um dies zu erreichen sollte man die Snapshots monitoren.
Oft sieht eine Snapshotkette wie folgt aus:
Oft werden in virtuellen Infrastrukturen aber auch Backups über Snapshots gehandelt. Manchmal bleiben hierbei Snapshots aber liegen und werden nicht gelöscht. Ein Grund dafür ist beispielsweise eine etwas zu lange Reaktionszeit des vCenters oder ein Fehler in der Backupprozedur.
Doch warum ist dies nicht ratsam? Die Funktionsweise von Snapshots ist relativ schnell erklärt: Für jeden Snapshot wird eine eigene Delta-Disk erstellt, welche die neue Basis-Disk für die jeweilige VM darstellt. Alle Write-IOs werden nun auf diese Delta-Disk umgeleitet. Weitere Informationen dazu sind in diesem KB-Artikel verfügbar: https://kb.vmware.com/s/article/1015180
Um diesem Problem entgegen zu treten, habe ich einen Snapshotdetector geschrieben. Dieser basiert auf der PowerCLI und sucht sich alle VMs raus die “unrechtmäßig” einen Snapshot besitzen.
Die “rechtmäßigen” VMs selektiere ich dabei mit Hilfe von einem Tag:
Diesen Tag habe ich nun allen VMs angehangen, welche Snapshots haben dürfen.
Doch nun zu dem Script. Das Script erwartet eine aktive Verbindung auf eine vSphere-Umgebung bspw. mittels
Connect-VIserver -Server vcsa01.vclass.lab
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
$logPath = "C:\Scripts\Snapshotdetector\Logs" $data = @() $tags = Get-Tag -Name "allow Snapshots" -Category "snapshots" $snapvms = Get-VM -Tag $tags $vms = Get-VM | Where { $snapvms -notcontains $_ } foreach ($snap in $vms | Get-Snapshot) { $snapshot = New-Object PSCustomObject $snapevent = Get-VIEvent -Entity $snap.VM -Types Info -Finish $snap.Created -MaxSamples 1 | Where-Object { $_.FullFormattedMessage -imatch 'Task: Create virtual machine snapshot' } $snapshot | Add-Member -type NoteProperty -name VM $snap.VM $snapshot | Add-Member -type NoteProperty -name Name $snap.Name $snapshot | Add-Member -type NoteProperty -name SizeMB $snap.sizemb $snapshot | Add-Member -type NoteProperty -name created $snap.created if ($snapevent -ne $null) { $snapshot | Add-Member -type NoteProperty -name CreatedBy $snapevent.UserName } else { $snapshot | Add-Member -type NoteProperty -name CreatedBy "UnKnown" } $data += $snapshot } $data | fl | Out-File -FilePath $logPath\snapshots.txt |
Das Script speichert standardmäßig im Pfad C:\Scripts\Snapshotdetector\Logs\snaphots.txt welche VMs einen Snapshot besitzen.
Der Pfad wird in der Variable
$logPath festgelegt und der Dateiname ist fix. Die Daten lassen sich natürlich von anderen Systemen weiterverwenden. So habe ich dieses Script in einen PRTG-Sensor integriert, welcher mir mehrmals täglich die aktuellen VMs sucht und meldet.
Wie immer kann das Script an die eigenen Bedürfnisse angepasst werden und bietet so eine flexible Möglichkeit Snapshots monitoren zu können.