VMware Scripting: Snapshots auf der Spur
Snapshots virtueller Maschinen sind ein gern genutztes Feature, denn speziell bei Upgrade-Aktionen ermöglichen sie einen einfachen Rollback-Pfad. Andererseits, und das ist in der vollen Tragweite meist weniger geläufig, sind sie ein zweischneidiges Schwert.
Snapshot-Stolperfallen …
Die offensichtlichen Einschränkungen von virtuellen Maschinen mit Snapshots sind in aller Regel noch klar:
- kein Storage VMotion
- keine dynamische Plattenvergrößerung
- keine physikalischen Raw Device Mappings
- kein Fault Tolerance
Weniger klar ist, dass mit der VM lebende Snapshots keine gute Idee für längerfristige Backups sind, einen nicht zu unterschätzenden Performance-Impact haben und im Zweifelsfall sogar zum Ausfall von VMs führen können. Die Liste von Stolperfallen mit Snapshots kann man beliebig fortsetzen (Beispiele hier, hier und hier). Quintessenz ist dabei immer, Snapshots sind äußerst praktisch für den Moment, aber nicht dafür bestimmt, dauerhaft mit der VM weiterzuleben.
… und Ansätze zur Verwaltung
Erfahrungsgemäß finden sich jedoch nach einer gewissen Zeit in jeder Umgebung verwaiste Snapshots, deren Existenz immer wieder zu Problemen führt. Ansätze, um dem entgegenzuwirken gibt es einige: Man kann via vCenter Alarme für Snapshots definieren (etwas mühselig), via Powershell-Skript die Ersteller von alten Snapshots automatisiert benachrichtigen, den snapshotmanager.pl des Perl SDKs zum Anzeigen verwenden oder aber den Report von William Lam’s VMware Health Check begutachten, der neben vielen anderen Metriken einer VMware Landschaft auch existente Snapshots analysiert und im Report je nach Alter farblich hervorhebt.
Finde Snapshots (jenseits einer Altersgrenze)
Wenn man jedoch eine simple Kommandozeilen-basierte Lösung benötigt, die Snapshots über einer gewissen Altersgrenze sucht und sich in Nagios integrieren lässt, findet man lediglich host-zentrierte Ansätze wie diesen hier, was bei größeren Umgebungen schnell umständlich wird. Folgender Perl-Schnipsel lässt sich vom vMA oder einem Management-System mit Perl SDK absetzen und findet alle Snapshots jenseits eines gewissen Alters.
#!/usr/bin/perl
# check_snapshots.pl: Displays VMs with snapshots older than a given age
#
# Extra packages required (URL given for vMA suitable RPMs)
# * Date::Parse from http://vault.centos.org/5.2/extras/i386/RPMS/
use strict;
use warnings;
use VMware::VIRuntime;
use Date::Parse;
my @badsnaps = ();
Opts::parse();
Opts::validate();
Util::connect();
# Get the service content reference, root to most of the API features
my $sc = Vim::get_service_content();
# Fetch only the given VM or all VMs
my $filter = $ARGV[0] ? { 'name' => "$ARGV[0]" } : { };
my $vms = Vim::find_entity_views(
view_type => 'VirtualMachine',
filter => $filter
);
# Hardcoded for now, 1d = 86400s, 1w = 604800s, and so on
sub older_than_treshold {
my $created = shift;
if ((time() - $created) > 604800) {
return 1;
}
return 0;
}
sub by_date_asc {
$a->{'date'} <=> $b->{'date'}
}
# Traverse a snapshotlist including possible sub-trees, in fact we would
# only need to check for the root snapshot (which is the oldest one)
sub check_snaplist {
my $vm_name = shift;
my $vm_snaplist = shift;
foreach my $vm_snap (@{$vm_snaplist}) {
if ($vm_snap->{childSnapshotList}) {
check_snaplist($vm_name, $vm_snap->{childSnapshotList});
}
my $epoch_snap = str2time($vm_snap->{createTime});
next unless (older_than_treshold($epoch_snap));
$badsnaps[scalar(@badsnaps)] = {
'vm' => $vm_name,
'snap' => $vm_snap->{name},
'date' => $epoch_snap,
};
}
}
# Loop over VMs and check each one for snapshots
foreach my $vm_view (@{$vms}) {
my $vm_name = $vm_view->{summary}->{config}->{name};
my $vm_snapinfo = $vm_view->{snapshot};
next unless defined $vm_snapinfo;
check_snaplist($vm_name, $vm_snapinfo->{rootSnapshotList});
}
# Display the list of "bad" snapshots, from oldest to newest
map {
printf "%-30s: %-40s created on %s\n",
$_->{'vm'}, substr($_->{'snap'},0,40), scalar localtime $_->{'date'}
} sort by_date_asc @badsnaps;
END {
Util::disconnect();
}
Beispiel
Die Ausgabe sieht exemplarisch folgendermaßen aus.
[vi-admin@vma ~][vcenter.roc.consol.de]$ ./check_snapshots.pl amber11.roc.consol.de : pre-iscsi-tests created on Thu Nov 12 11:08:16 2009 amber21.roc.consol.de : amber-before-reset created on Thu Nov 26 09:54:13 2009 ray42.roc.consol.de : demo created on Wed Jan 13 17:15:02 2010 ray42.roc.consol.de : demo1 created on Wed Jan 13 17:21:19 2010
Mit ein paar Zeilen mehr lässt sich das in ein Nagios Plugin umbauen. Gutes Gelingen bei der Snapshot-Jagd!


sehr schöne Zusammenfassung.
Zur Ergänzung, Snapshot Suche mit der PowerCLI – Snapshots älter 7 Tage:
Get-VM | Get-Snapshot | Where {$_.Created -lt ((Get-Date).AddDays(-7))}
eine kleine Anmerkung:
Snapshots verbieten weder vMotion noch DRS, allerdings sehr wohl Storage vMotion
kein vMotion (ergo auch nicht nutzbar in Zusammenhang mit DRS)
Besten Dank für das Feedback. Der Hinweis auf VMotion ist korrigiert und
der Abstraktionslevel der PowerCLI ist ohne Frage schwer zu toppen. Da
kann man die gedachte Vorgehensweise nahezu 1:1 in Code fließen lassen
(Stichwort: deklarative vs. imperative/prozedurale Programmierung).
“The Semantic Gap” [1] haut in die gleiche Kerbe (stammt aber aus der Feder des MS Powershell Teams, also mit Abstand lesen). Etwas genereller gelagert (warum wollen Admins eigentlich deklarativ arbeiten, sind aber aktuell in einer prozeduralen Welt gefangen), gabs vor einiger Zeit von Alva Couch einen netten Artikel in der ;login: “From x=1 to (setf x 1): what does configuration management mean?,” [2]. Mitunter etwas akademisch, aber von den Denkansätzen sehr interessant.
[1] http://www.usenix.org/publications/login/2008-02/openpdfs/couch.pdf
[2] http://blogs.msdn.com/powershell/archive/2008/02/10/the-semantic-gap.aspx
[...] die Probleme (in beobachtetem Ausmaße) im Verdacht hatten. Vorerst gilt also weiterhin: Langlebige Snapshots sind böse. Veröffentlicht in Tipps & Tricks, Virtualisierungssoftware | Schlagworte: snapshots, [...]