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!

scheduled Shutdown von Maschinen in einem bestimmten Folder

Alles zum Virtualisierungsmanagement und Servermanagement, was nicht direkt in ein festes Version-Schema paßt.

Moderatoren: irix, continuum, Dayworker

Member
Beiträge: 35
Registriert: 05.03.2004, 07:42
Wohnort: Schorndorf

scheduled Shutdown von Maschinen in einem bestimmten Folder

Beitragvon kugman » 05.04.2007, 11:46

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

Member
Beiträge: 475
Registriert: 17.06.2004, 13:06
Wohnort: Germany - Laichingen
Kontaktdaten:

Beitragvon stgepopp » 05.04.2007, 12:21

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

Member
Beiträge: 35
Registriert: 05.03.2004, 07:42
Wohnort: Schorndorf

Beitragvon kugman » 05.04.2007, 13:30

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.

Benutzeravatar
Experte
Beiträge: 1323
Registriert: 08.07.2005, 16:41
Wohnort: bei Trier

Beitragvon angoletti1 » 05.04.2007, 21:25

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

Benutzeravatar
Moderator
Beiträge: 3476
Registriert: 23.02.2005, 09:14
Wohnort: Burgberg im Allgäu
Kontaktdaten:

Beitragvon Tschoergez » 05.04.2007, 21:58

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

Member
Beiträge: 35
Registriert: 05.03.2004, 07:42
Wohnort: Schorndorf

Beitragvon kugman » 05.04.2007, 23:30

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

Benutzeravatar
Moderator
Beiträge: 3476
Registriert: 23.02.2005, 09:14
Wohnort: Burgberg im Allgäu
Kontaktdaten:

Beitragvon Tschoergez » 06.04.2007, 00:11

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

Member
Beiträge: 475
Registriert: 17.06.2004, 13:06
Wohnort: Germany - Laichingen
Kontaktdaten:

Beitragvon stgepopp » 06.04.2007, 08:58

Hi,

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

Erich

Benutzeravatar
Moderator
Beiträge: 3476
Registriert: 23.02.2005, 09:14
Wohnort: Burgberg im Allgäu
Kontaktdaten:

Beitragvon Tschoergez » 06.04.2007, 10:47

No problemo... aber verfeinern des Skripts geht erst näxte Woche, jetzt ist wirklich Urlaub :grin:

Viele Grüße,
Jörg

Member
Beiträge: 35
Registriert: 05.03.2004, 07:42
Wohnort: Schorndorf

Beitragvon kugman » 08.05.2007, 10:46

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

Benutzeravatar
Moderator
Beiträge: 3476
Registriert: 23.02.2005, 09:14
Wohnort: Burgberg im Allgäu
Kontaktdaten:

Beitragvon Tschoergez » 08.05.2007, 12:02

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

Member
Beiträge: 35
Registriert: 05.03.2004, 07:42
Wohnort: Schorndorf

Beitragvon kugman » 08.05.2007, 17:05

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.

Benutzeravatar
Moderator
Beiträge: 3476
Registriert: 23.02.2005, 09:14
Wohnort: Burgberg im Allgäu
Kontaktdaten:

Beitragvon Tschoergez » 08.05.2007, 17:31

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

Member
Beiträge: 35
Registriert: 05.03.2004, 07:42
Wohnort: Schorndorf

Beitragvon kugman » 08.05.2007, 17:44

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

Member
Beiträge: 35
Registriert: 05.03.2004, 07:42
Wohnort: Schorndorf

Beitragvon kugman » 11.05.2007, 10:16

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?

Benutzeravatar
Moderator
Beiträge: 3476
Registriert: 23.02.2005, 09:14
Wohnort: Burgberg im Allgäu
Kontaktdaten:

Beitragvon Tschoergez » 11.05.2007, 10:35

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

Member
Beiträge: 35
Registriert: 05.03.2004, 07:42
Wohnort: Schorndorf

Beitragvon kugman » 11.05.2007, 10:39

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

Member
Beiträge: 35
Registriert: 05.03.2004, 07:42
Wohnort: Schorndorf

gelöst

Beitragvon kugman » 11.05.2007, 13:19

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.

Benutzeravatar
Experte
Beiträge: 1323
Registriert: 08.07.2005, 16:41
Wohnort: bei Trier

Beitragvon angoletti1 » 11.05.2007, 14:09

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

Member
Beiträge: 35
Registriert: 05.03.2004, 07:42
Wohnort: Schorndorf

Beitragvon kugman » 14.05.2007, 11:28

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


Zurück zu „vCenter / VMware VirtualCenter“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast