postheadericon 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!

3 Kommentare zu „VMware Scripting: Snapshots auf der Spur“

  • 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)

  • Sebastian Kayser:

    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, [...]

Kommentieren