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.

