Artikel-Schlagworte: „Perl SDK“

postheadericon VMware PowerCLI: Auch für Perl SDK-ler

Ein Blick über den Tellerrand hat noch niemandem geschadet und genau dafür ist die VMware PowerCLI ein gutes Beispiel. Bisher dominierte Perl SDK unsere VMware-Scripting-Ecke. Speziell in Linux/Unix-Umgebungen gefragt, kommt es nicht nur Perl-versierten Admins entgegen, sondern bildet auch das Fundament gängiger Nagios-Checks.

Andererseits ist eine gewisse Komplexität nicht von der Hand zu weisen und gerade wenn man Perl SDK basierte Skripte mit ihren PowerCLI-Pendants vergleicht, darf man sich schonmal überlegen, welches Framework für diverse Zweck das geeignetere Werkzeug ist.
Diesen Beitrag weiterlesen »

postheadericon VMware Scripting: Perl SDK beschleunigen

Bei der Arbeit mit dem VMware Perl SDK oder darauf basierenden Skripten wird schnell ersichtlich, dass die Laufzeit selbst für eigentlich simple Aufgaben enorm lange ist. Warum dem so ist, warum das für Monitoring-Zwecke unschön ist und wie man dem oft erlebten Phänomen etwas entgegenwirken kann, wollen wir hier kurz beleuchten. Primär interessant für Skript-Schreiber, als Hintergrundwissen aber auch für Skript-Benutzer, die sich schön öfter über die Laufzeit ihrer Perl Skripte gewundert haben.

Diesen Beitrag weiterlesen »

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.

Diesen Beitrag weiterlesen »

postheadericon VMware Scripting: Managed Object Browser und VM-Objekte

Wer seine VMware Infrastruktur über das Perl SDK instrumentiert (oder instrumentieren möchte), investiert erfahrungsgemäß anfänglich eher weniger Zeit mit dem Studieren der Dokumentation, sondern schaut sich um, was bereits an Brauchbarem existiert und lässt sich inspirieren.

Langfristig landet man beim Bauen der passenden Skripte für die eigene Umgebung dann entweder in seitenlangen Perl Data::Dumper Ausgaben, um passende Attribute und Methoden zu finden, oder aber im Managed Object Browser (MOB), der die via Perl SDK verfügbare Objekt-Struktur einer ESX/vSphere/vCenter-Installation per Web-Interface visualisiert und klickbar macht. Damit kann man sich direkt durch bestehende Datenstrukturen hangeln und muss diese nicht erst über ein Skript zusammensuchen. Sehr, sehr praktisch.

VM-Objekte im MOB

Sobald die Skript-Anforderung jedoch VM-zentriert wird (z.B. Iterieren über existierende VMs und prüfen, welche davon ein ISO gemountet haben) und man dafür die VM-Objekte im MOB sucht, wird man merken, dass diese gut versteckt sind. Folgendes Perl Skript schafft hier Abhilfe. Es zeigt ohne langwieriges Suchen direkt die zugehörigen MOB URLs für VMs an – per Default für alle VMs, bei expliziter Angabe eines VM-Namen nur für diese eine VM.

#!/usr/bin/perl
#
# get_mob_url.pl: return the Managed Object Browser URL for a given VM

use Data::Dumper;
use strict;
use warnings;
use URI;
use VMware::VIRuntime;

Opts::parse();
Opts::validate();
Util::connect();

# Get the base URL of the remote server
my $service_url = URI->new(Vim::get_service_url());
my $base_url    = $service_url->scheme . "://" . $service_url->host_port ."/";

# 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
);

# Find the vm-id which can be used to access the MOB browser for the VM
# https://<servername>/mob/?moid=
foreach my $vm_view (@{$vms}) {
  my $vm_name = $vm_view->{summary}->{config}->{name};
  my $vm_id   = $vm_view->{'mo_ref'}->value;
  my $vm_url  = $base_url . "mob/?moid=" . $vm_id;

  printf "%-30s: %s\n", $vm_name, $vm_url;
}

END {
Util::disconnect();
}

Beispiel

Folgendes Beispiel demonstriert die Ausgabe von obigem Skript, wenn es darum geht, die Managed Object ID und damit die MOB URL einer VM zu bestimmen. Der verwendete Namen (amber11.roc.consol.de) hat übrigens erstmal rein gar nichts mit dem DNS-Namen der VM zu tun, sondern ist der Anzeigename der VM im vSphere Client. In unserem Fall ist lediglich beides identisch. Falls VMs in der eigenen Umgebung also ‘DEV jboss-15′, ‘Apache Intranet Test’ oder ähnlich heißen sollten, sind diese Namen zu verwenden.

[vi-admin@vma ~][vcenter.roc.consol.de]$ ./get_mob_url.pl amber11.roc.consol.de
amber11.roc.consol.de         : https://vcenter.roc.consol.de:443/mob/?moid=vm-1770

Mit der zurückgelieferten URL kann man sich dann im MOB die Attribute der VM betrachten, um herauszufinden/sicherzustellen, welche davon man für sein Projekt konkret benötigt. Sehr hilfreich.

postheadericon perl SDK – Mac Adressen aller virtuellen Maschinen auslesen

Wem ist es nicht schon einmal untergekommen. Die interne Technik läuft säuerlich durch die Stockwerke, gibt kryptische Hexblöcke von sich, redet von Konflikten und meint damit nicht die aktuelle Weltpolitik? Gemeint ist natürlich ein Mac- bzw. IP-Adressen-Konflikt innerhalb eines IP-Netzwerks. Einem ESX-Admin stellt sich nun die Aufgabe, über alle ESX-Hosts zu gehen und z.B. mit grep die .vmx-Dateien zu durchsuchen. Alternativ bauen wir uns einfach ein kleines Perl Skript, was nicht nur eleganter, sondern vor allem zeitsparender ist.

Anbei die Rohfassung eines solchen Skriptes, es bleibt wie immer dem Leser überlassen, kosmetische Verbesserungen vorzunehmen. Voraussetzung ist eine lauffähige Perl-SDK-Installation.

#!/usr/bin/perl
#
# Search VirtualCenter Server for all assigned VM Nic mac adresses.
#

use strict;
use warnings;
use VMware::VIRuntime;

Opts::parse();
Opts::validate();
Util::connect();

# Get the service content reference, root to most of the API features
my $sc = Vim::get_service_content();

unless ($sc->about->apiType() eq “VirtualCenter”) {
die “This script needs to be run against a virtual center.\n”;
}

sub getVmName {
my $vm = shift;
if (ref($vm) ne “VirtualMachine”) {

die(“Invalid VirtualMachine reference”);
}
return $vm->{summary}->{config}->{name};
}

sub getVmMac {
my $vm = shift;
if (ref($vm) ne “VirtualMachine”) {
die(“Invalid VirtualMachine reference”);
}

my @mac;
foreach my $dev_ref (@{ $vm->{config}->{hardware}->{device} }) {
if(defined($dev_ref->{macAddress})) {
# assume nic

push @mac, $dev_ref->{macAddress};
}
}
return @mac;
}
# Fetch all VMs
my $vms = Vim::find_entity_views(view_type => ‘VirtualMachine’);
foreach my $vm_view (@{$vms}) {
my $vm_name = getVmName($vm_view);
my @mac = getVmMac($vm_view);
print “Name: $vm_name\n”;
print “Mac: “. join(“, “, @mac) .”\n”;
}

END {
Util::disconnect();
}

Viel Spaß damit!