Die Foren-SW läuft ohne erkennbare Probleme. Sollte doch etwas nicht funktionieren, bitte gerne hier jederzeit melden und wir kümmern uns zeitnah darum. Danke!

Automatisches starten und stoppen von virtuellen Maschinen

Hilfe bei Problemen mit der Installation oder Benutzung des VMware GSX Server und VMware Server 1.

Moderatoren: irix, Dayworker

Moderator
Beiträge: 317
Registriert: 02.03.2004, 22:50
Wohnort: Im Urlaub bis 02.08.2004
Kontaktdaten:

Automatisches starten und stoppen von virtuellen Maschinen

Beitragvon HartmutSchaumburg » 05.06.2004, 22:48

Hallo,

die Antwort bezieht sich auf einen Thread, ich stelle sie aber als neues Thema ein, weil ich denke, dass dies vielleicht von allgemeinem Interesse ist.

Das starten und stoppen von virtuellen Maschinen kann man, je nach Umgebung und Notwendigkeit anpassen. Wie immer gibt es auch hier unterschiedlichste Möglichkeiten.
Wir nutzen dafür unterschiedliche Batch-Scripte, die über ein selbstgeschriebenes Tool, die Foreach.exe gestartet werden. Dieses kleine, von unserem Programmierer geschriebene Programm ermöglicht es, Prozesse auf DOS Ebene zu parallelisieren. Das heisst, statt auf die Abarbeitung eines Tasks zu warten, startet dieses Programm unbegrenzt viele gleiche Prozesse zur gleichen Zeit.

Machen wir ein Beispiel zum besseren Verständnis:
Wir sichern File-Server mit Robocopy.
Wenn man 15 Server sichern will,
macht man sich eine Datei, die die Namen der Server enthält.
Dann eine weitere, die angibt, was zu sichern ist.
Und noch eine, die den Prozess startet.
Das Ergebnis ist im Normalfall,
dass der zweite Server gesichert wird, wenn der erste fertig ist, der dritte wenn der zweite fertig ist und so weiter und so weiter bis zum 15ten Server.
Das Ergebnis mit Foreach ist,
dass alle 15 Server zur gleichen Zeit angefahren werden und somit die Tasks paralleslisiert werden.

Und genau so machen wir es auch mit dem starten der virtuellen Maschinen.
In der Datei mit den Namen der zu startenden virtuellen Maschinen legen wir die Reihenfolge der Maschinen dergestalt fest, dass die zuerst zu startenden Maschinen an erster Stelle stehen und die danach zu startenden Maschinen dahinter eingereiht werden. Wir legen also eine Startreighenfolge fest.
Dabei arbeiten wir mit einem Wait 30 zwischen dem starten der virtuellen Maschinen, die natürlich über AT-Jobs gesteuert werden. Eine simple, aber sehr zuverlässige Methode. Beim stoppen der virtuellen Maschinen gehen wir genauso vor.


Eine andere Möglichkeit ist der Einsatz der VMware Scripting_API, die ebensolche Möglichkeiten bietet.

Voraussetzung dafür ist, dass diese auf dem GSX-Server und auf einer Management-Station installiert werden. Das Ergebnis ist dann das vmware-cmd utility, mit dem man dann den Status des GSX und der virtuellen Maschinen abfragen und natürlich starten und stoppen kann.

Das läuft dann, über AT-Jobs gesteuert, vereinfacht dargestellt, wie folgt ab:
vmware-cmd <vm-cfg-path> start <powerop_mode>
vmware-cmd <vm-cfg-path> stop <powerop_mode>
vmware-cmd <vm-cfg-path> reset <powerop_mode>
vmware-cmd <vm-cfg-path> suspend <powerop_mode>

Da wir das vmware-cmd Tool nur zu Wartungszwecken einsetzen um den Status von virtuellen Maschinen abzufragen:
vmware-cmd <vm-cfg-path> getstate
muss ich auch im Einzelfall im Handbuch nachlesen, was dort noch alles an Möglichkeiten gegeben ist.

Ein Startscript über die Scripting_Api sieht übrigens so aus:

BEGIN {
if ($^O eq "MSWin32") {
@INC = (
# Set the path to your VmPerl Scripting directory if different
'C:\Program Files\VMware\VMware VmPerl Scripting API\perl5\site_perl\5.005',
'C:\Program Files\VMware\VMware VmPerl Scripting API\perl5\site_perl\5.005\MSWin32-x86');
}
}

use VMware::VmPerl;
use VMware::VmPerl::VM;
use VMware::VmPerl::ConnectParams;
use strict;

# Retrieves a pre-defined constant value.
sub vm_constant {
my $constant_str = shift;
return VMware::VmPerl::constant($constant_str, 0);
}

if (@ARGV < 1) {
print "Usage $0: <path_to_config_file> [<server> <user> <password>]\n";
exit(1);
}

my $state_string_map = {};
my @state_strings = (
"VM_EXECUTION_STATE_ON",
"VM_EXECUTION_STATE_OFF",
"VM_EXECUTION_STATE_SUSPENDED",
"VM_EXECUTION_STATE_STUCK",
"VM_EXECUTION_STATE_UNKNOWN"
);

foreach my $state_string (@state_strings) {
$state_string_map->{vm_constant($state_string)} = $state_string;
}

# Read in parameters.
my ($cfg_path, $server_name, $user, $passwd) = @ARGV;

# Use the default port of 902. Change this if your port is different.
my $port = 902;

my $connect_params = VMware::VmPerl::ConnectParams::new($server_name,$port,$user,$passwd);

my $vm = VMware::VmPerl::VM::new();
if (!$vm->connect($connect_params, $cfg_path)) {
my ($error_number, $error_string) = $vm->get_last_error();
die "Could not connect to vm: Error $error_number: $error_string\n";
}

# Get the power status of the virtual machine.
my $cur_state = $vm->get_execution_state();
if (!defined($cur_state)) {
my ($error_number, $error_string) = $vm->get_last_error();
die "Could not get execution state: Error $error_number: $error_string\n";
}
print "The execution state of $cfg_path is: $state_string_map->{$cur_state}\n";

Auch hier hat man natürlich die Möglichkeit, die Startreihenfolge festzulegen.

Alle Einzelheiten zu diesen Möglichkeiten findet man im
VMware Scripting API User Manual
Download from here:
http://www.vmware.com/pdf/Scripting_API_21.pdf


Eine andere Möglichkeit ist es, (noch ein bisschen) auf Virtual Center zu warten.
Virtual Center für den GSX wird, so sieht es aus, die Möglichkeit bieten, virtuelle Maschinen in einer bestimmten Reihenfolge zu starten und zu stoppen. Letztenendes denke ich, dass dies die sinnvollste aller Varianten sein wird, wobei natürlich jeder für sich unter Beachtung und Betrachtung seines technischen Umfeldes entscheiden muss, für welche Möglichkeit er sich letztenendes entscheidet.

Wie immer gilt, es gibt mehrere Möglichkeiten.


Hartmut Schaumburg

Zurück zu „VMserver 1 und GSX“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste