Seite 1 von 1

scheduled Shutdown von Maschinen in einem bestimmten Folder

Verfasst: 05.04.2007, 11:46
von kugman
Hallo zusammen,

zuerst möchte ich kurz anmerken, dass ich mir nicht 100% sicher bin, das das Topic hier richtig ist, oder ob es eher nach "ESX-Server" gehört. Aber da es sich um eine Funktionalität des VC handelt, denke ich, dass ich eher hier richtig bin. Wenn nicht, möge mir bitte verziehen werden.

Aber nun zu meiner Frage:

Ich habe hier eine VI3 mit mehreren ESXen und 1VC am Laufen. Im VC habe ich unter "Virtual Machines and Templates" einige Folders definiert, in denen je nach Kategorie diverse virtuelle Server stecken.

Eines dieser Folder nennt sich z.Bsp. "Entwicklungsserver" Darin liegen ca 60 virtuelle Maschinen, die alle ausnahmslos um 23:30 Uhr heruntergefahren werden müssen.

Über den VirtualInfrastructureClient kann ich lediglich für jede virtuelle Maschine einzeln eine Aktion schedulen.
Meine Frage: Gibt es eine Möglichkeit (z.Bsp gescriptet) zu sagen, dass alle Maschinen die in dem entsprechenden Folder liegen automatisiert heruntergefahren werden sollen? Dass das nicht auf gleichzeitig geht, ist klar, denn 60 Maschinen, die parallel runterfahren würden wohl ziemlich auf die Performance meiner VI schlagen.

Für Tipps und/oder Lösungsansätze wäre ich sehr dankbar.

vielen Dank schon mal

mfg

Markus Kugler

Verfasst: 05.04.2007, 12:21
von stgepopp
Hallo,

da gibt es mehrere Varianten:

- per CLI: # vmware-cmd Pfad_zur_vmx stop soft
- per VIPerlkit
- per VI SDK
- per Prozessmodellierung z.B. Dunes VS-O

Erich

Verfasst: 05.04.2007, 13:30
von kugman
Hallo stgepopp,

vielen Dank für Deine Antwort,
das ist dann alles geskriptet. Könnt ich mir schon auch vorstellen, aber es geht je darum eine Formel zu bauen, die mir in Quasi-Quelltext ausgedrückt folgendes macht:

for each VM in Folder "Entwicklungsserver" do shutdown VM@23:30Uhr


Deine Möglichkeit mit dem vmware-cmd könnte ich automatisieren, wenn ich alle VMs , die auf einer bestimmten LUN liegen automatisiert herunterfahren wollte - das ist aber leider nicht gegeben.

Verfasst: 05.04.2007, 21:25
von angoletti1
Hi,

wie Erich bereits geschrieben hat, kannst du das mit VI SDK lösen. Dort muss deine Abfrage dann halt auch die Zugehörigkeit zu einem Resource-Pool enthalten, dann sollte das klappen.
Wenn ich mich die Tage noch mal mit SDK auseinandersetze, guck ich mal nach und gib dir Bescheid.
Wenn jemand anderes vorher drauf kommt -> posten :D

Grüße
Chris

Verfasst: 05.04.2007, 21:58
von Tschoergez
Hi,

das Ganze ist eigentlich eine sehr schöne Aufgabe für das Viperltoolkit (http://sourceforge.net/projects/viperltoolkit/).

Damit lässt sich das relativ einfach lösen. Eine kurze Einführung gibts unter www.run-virtual.com.

Es sind auch ein paar Beispiele dabei, die genau Deine Aufgabe ausführen, müsste man nur zusammenstückeln.

Stay tuned.... werd mich mal dransetzen...

Viele Grüße,
Jörg

Verfasst: 05.04.2007, 23:30
von kugman
das klingt ja ganz interessant. das VIPerlToolkit hört sich ganz nett an. Die Gesamtkonfiguration sollte jedoch natürlich nach Möglichkeit auch von VMWare supportet sein, nicht dass mir dann da der Support erlischt

Verfasst: 06.04.2007, 00:11
von Tschoergez
Hi @all,

also ich hab mal den vi angeschmissen und das VI-Toolkit genutzt. Folgendes Skript schaltet alle VMs im Ordner $ordnername (hier z.B. test) aus, genauer gesagt, generiert einen PowerOff-Task im VC.

Code: Alles auswählen

#!/usr/bin/perl -w
#
# Sucht alle VMs im Ordner $ordnername und generiert dafuer einen PowerOff-Task
#
# by tschoergez fuer www.vmware-forum.de
# use at own risk :-)

use strict;
use warnings;
use Getopt::Long;
use VMware::VIRuntime;

## Verbindungsparamter:
my $myservice = 'https://VC-Server/sdk/vimService';
my $user = 'Administrator';
my $password = 'geheim';

my $ordnername = 'test';

# Einloggen im VC
Vim::login(     service_url => $myservice,
                user_name => $user,
                password => $password);

# entsprechenden ordner finden
my $folder_view = Vim::find_entity_view(view_type => 'Folder',
                                      filter => { 'name' => $ordnername });

# die zwei lines Waren zum testen....
#my $folder_moref = $folder_view->value;
#printf $folder_view. ':' . $folder_moref . "\n";

# VMs im Ordner aufrufen
my $vms_in_folder = $folder_view->childEntity;
#printf $vms_in_folder . "\n";

# Fuer jede VM NAmen anzeigen und Aktion durchfuehren
foreach (@$vms_in_folder) {
        printf "moref:".$_->value;
        my $vm_moref = $_;
        my $vm = Vim::find_entity_view( view_type => 'VirtualMachine',
                                                begin_entity => $vm_moref);
        printf " Name:".$vm->name;

        #Aktion durchfuehren
        $vm->PowerOffVM_Task();
        print "    Poweroff-Task successfully generated...\n";
}

Vim::logout();


Das Ganze ist nur ganz kurz getestet und bei weitem nicht sauber ausprogrammiert. Denkbar wäre z.B eine Statusüberprüfung vor dem Ausschalten. Für höhere Flexibilität wäre es außerdem schön, die Power-Operation als Kommandozeilen-Parameter angeben zu können.

Das Skript läßt sich dann einfach als cronjob um 23.30 Uhr starten.

Dient natürlich nur als Ideengeber, produktiv einsetzen würde ich das in der Form noch nicht.

Dadurch, dass das viperl-Toolkit ja nur die offizielle API vom VC nutzt, verliert man eigentlich keinen Support. Es wird ja nix auf dem VC oder den ESX-Servern verändert.

Denkanstöße hab ich gefunden in:
http://download3.vmware.com/vmworld/200 ... MANUAL.pdf
bzw. im Lab auf der TSX gestern 8)

edit: Achja, Fehlerüberprüfung wird auch noch keine vorgenommen, z.B. wenns den ordner gar nicht gibt, keine VMs drinliegen usw. Läßt sich noch viel verbessern....

Viele Grüße,
Jörg

@Erich: Ja, ich weiß, eigentlich sollte man den Abend in Nizza andersweitig verbringen.... :D

Verfasst: 06.04.2007, 08:58
von stgepopp
Hi,

@Jörg: ja, ich war gestern mit Dennis nochmals Essen. Was sagt eigentlcih Deine Freundin dazu?

Erich

Verfasst: 06.04.2007, 10:47
von Tschoergez
No problemo... aber verfeinern des Skripts geht erst näxte Woche, jetzt ist wirklich Urlaub :grin:

Viele Grüße,
Jörg

Verfasst: 08.05.2007, 10:46
von kugman
Hallo zusammen.

sorry, dass ich mich erst jetzt wieder zurückmelde.

Habe mir das viperltoolkit mal angeschaut, komme aber ehrlich gesagt nicht damit klar, weil ich keine Ahnung von Perl habe.

was ich noch anmerken wollte: Ich habe in meinem ersten Posting von Ordnern gesprochen. Damit meinte ich nicht Ordner im VMFS sondern wirklich nur die Folders in der "Inventory"-Ansicht des Virtual Centers

Gruß
Markus

Verfasst: 08.05.2007, 12:02
von Tschoergez
schon klar. Genau das macht das Skript ja...

Eine andere Möglichkeit als die API wirds nicht geben.
Schau mal auf www.run-virtual.com, da gibts eine Einführung ins viperltoolkit.

Ansonsten müsstest Du halt die API-Webservices direkt ansprechen, das geht dann natürlich mit allen möglichen Programmiersprachen.

Viele Grüße,
Jörg

Verfasst: 08.05.2007, 17:05
von kugman
Tschoergez hat geschrieben:Hi @all,

also ich hab mal den vi angeschmissen und das VI-Toolkit genutzt. Folgendes Skript schaltet alle VMs im Ordner $ordnername (hier z.B. test) aus, genauer gesagt, generiert einen PowerOff-Task im VC.

Code: Alles auswählen

#!/usr/bin/perl -w
#
# Sucht alle VMs im Ordner $ordnername und generiert dafuer einen PowerOff-Task
[schnipp]
[/schnipp]       
#Aktion durchfuehren
        $vm->PowerOffVM_Task();
        print "    Poweroff-Task successfully generated...\n";
}

Vim::logout();




Ich hab da mal noch ne Frage: dieser Poweroff-Task. fährt der die Windows-Rechner herunter (Guest-Shutdown) oder schaltet der hart aus?



Beim Ausführen des Skriptes bekomme ich diese Fehlermeldung:

Can't call method "childEntity" on an undefined value at test.pl line 34.

Verfasst: 08.05.2007, 17:31
von Tschoergez
Der PowerOff-Task schaltet hart aus.

es gibt aber noch einen vergleichbaren Befehl, der einen "graceful"-Shutdown anstößt, also über die VMware dem Windows sagt: runterfahren!

Den weiß ich aber nicht auswendig :-( Kann beizeiten mal nachschauen...

Die Fehlermeldung resultiert wohl daraus, dass der Folder nicht gefunden wird. (wie gesagt, das Skript hat noch keine Fehlertoleranz).

Viele Grüße,
Jörg

Verfasst: 08.05.2007, 17:44
von kugman
Tschoergez hat geschrieben:Der PowerOff-Task schaltet hart aus.

es gibt aber noch einen vergleichbaren Befehl, der einen "graceful"-Shutdown anstößt, also über die VMware dem Windows sagt: runterfahren!


der lautet ShutdownGuest()

Das mit dem Fehler hab ich auch rausgefunden - das Skript mag keine Umlaute. Habe den Ordner umbenannt und jetzt funktioniert das Skript im Test soweit einwandfrei.... werds heute nacht mal gegen das VC rennen lassen - no risk no fun ;-)

Verfasst: 11.05.2007, 10:16
von kugman
Was mir grad noch aufgefallen ist.

das Skript fällt auf die Nase, sobald es auf eine VM stösst, die nicht an ist. Setzt also voraus, dass alle Maschinen in dem Folder laufen.

Wie kann ich das Skript so ergänzen, dass vorab geprüft wird, ob die Maschine powered-on ist, und dann nur diese Maschinen den Shutdown-Task bekommen?

Verfasst: 11.05.2007, 10:35
von Tschoergez
Du kannst mal schauen, im viperltoolkit-Ordner gibts ein Verzeichnis "samples", da müsste ein Beispielskript mit Namen powerops oder so ähnlich drin liegen.

Das ist so programmiert, dass vorher der aktuelle Status der VM abgefragt wird.

Vielleicht kannst Du Dir da Anregungen holen, bzw. sogar per Copy und Paste die Abfragen rausholen.

Viele Grüße und schönes Wochenende!
Jörg

Verfasst: 11.05.2007, 10:39
von kugman
Tschoergez hat geschrieben:Du kannst mal schauen, im viperltoolkit-Ordner gibts ein Verzeichnis "samples", da müsste ein Beispielskript mit Namen powerops oder so ähnlich drin liegen.

Das ist so programmiert, dass vorher der aktuelle Status der VM abgefragt wird.

Vielleicht kannst Du Dir da Anregungen holen, bzw. sogar per Copy und Paste die Abfragen rausholen.

Viele Grüße und schönes Wochenende!
Jörg


Danke für den Hinweis - ich muss mal schauen ob ich mich da zurecht find, ich hab halt von dieser ganzen Skripterei absolut keine Ahnung... für mich sind das alle spanische Dörfer im Nebel ;-)

viele Grüße zurück

gelöst

Verfasst: 11.05.2007, 13:19
von kugman
das Thema scheint jetzt soweit gelöst zu sein:

Hier das fertige Skript:

Code: Alles auswählen

#!/usr/bin/perl -w
#
# Sucht alle VMs im Ordner $ordnername und generiert dafuer einen PowerOff-Task
#
# by tschoergez fuer www.vmware-forum.de
# use at own risk :-)

use strict;
use warnings;
use Getopt::Long;
use VMware::VIRuntime;

## Verbindungsparamter:
my $myservice = 'https://VC-Server/sdk/vimService';
my $user = 'Administrator';
my $password = 'geheim';

my $ordnername = 'test';


# Einloggen im VC
Vim::login(     service_url => $vc,
                user_name => $user,
                password => $password);


# entsprechenden Ordner finden
my $folder_view = Vim::find_entity_view(view_type => 'Folder',
                                      filter => { 'name' => $ordnername });

# VMs im Ordner aufrufen
my $vms_in_folder = $folder_view->childEntity;
#printf $vms_in_folder . "\n";

# Fuer jede VM den Namen anzeigen und Aktion durchfuehren

foreach (@$vms_in_folder) {


        #printf "moref:".$_->value;
        my $vm_moref = $_;
        my $vm = Vim::find_entity_view( view_type => 'VirtualMachine',
                                                begin_entity => $vm_moref);
 

        #Aktion durchfuehren
        if($vm->runtime->powerState->val eq 'poweredOn')
        {
   $vm->ShutdownGuest();   
        printf $vm->name;
        print "    Shutdown veranlasst...\n";
        }
}

Vim::logout();



Dieses Skript ermittelt also alle VMs im Ordner $ordnername und generiert im VC einen ShutDown-Task für diejenigen Maschinen die den Powerstate poweredOn haben.

Verfasst: 11.05.2007, 14:09
von angoletti1
Hi,

ich will ja nicht klugscheissen, aber ich denke hier ist noch ein kleiner Fehler drin

Code: Alles auswählen

my $myservice = 'https://VC-Server/sdk/vimService';
Vim::login(     service_url => $vc,
                      ....);


Hier muss entweder die Variable vc auf myservice oder umgekehrt geändert werden.

Grüße
Chris

Verfasst: 14.05.2007, 11:28
von kugman
angoletti1 hat geschrieben:Hier muss entweder die Variable vc auf myservice oder umgekehrt geändert werden.

Grüße
Chris


hmmm... wie auch immer - auf jeden Fall tuts ;-)