Seite 1 von 1

"Virtual Machines and Templates" Ordner per Skript

Verfasst: 19.05.2009, 10:35
von arudolf
Hallo zusammen,

im VI Client gibt es unter der Ansicht "Virtual Machines and Templates" die Möglichkeit, Ordner anzulegen. Man kann die Guests daraufhin per Drag & Drop dahin verschieben und diese so übersichtlich gruppieren.

Wie kann ich per Skript / Kommandozeile erreichen, was ich mit der Maus im VI Client mache? Gibt es eine Möglcihkeit, bei der Registrierung per Skript bereits den Ziel Ordner auszuwählen?

Ich habe im Programming Guide VI Perl Toolkit, VMware VIX usw. nichts dazu gefunden. Auch habe ich versucht, beim Registrieren als "--vmname" Parameter gleich den Ordner mitzugeben. Wie auch immer, jeder Name wurde akzeptiert, so dass dann die VM auch mal "Folder1\DRSSRV02" hieß :(

Mittels "vmware-cmd" sehe ich keine Möglichkeit, da der ESX Hosts keine Ordner kennt. Also muss dass gegen den VC Server getan werden.

Wie kann ich das lösen?

Verfasst: 19.05.2009, 11:39
von Heros
Ja, geht alles! Schau dir mal die Powershell bzw das VI Toolkit an. Da geht alles und es ist gut beschrieben.

Verfasst: 19.05.2009, 11:50
von arudolf
Danke für die rasche Antwort.

Allerdings laufen in der Umgebung schon eine große Anzahl bash Skripte, die das Perl Toolkit bemühen und z.T. per ssh Kommandos auf den ESX Servern absetzen. Ich würde das gern in mittels dieser Kombination erschlagen. Jetzt zusätzlich noch die Powershell und das passende Toolkit zu installieren sehe ich als letzte Möglichkeit.

Verfasst: 19.05.2009, 12:44
von arudolf
Ich habe folgendes Perl Skript "gebastelt":

=========================
#!/usr/bin/perl -w

use strict;
use warnings;

use VMware::VIRuntime;

$Util::script_version = "1.0";

my %opts = (
'vmname' => {
type => "=s",
help => "The name of the vm",
required => 1,
},
'folder' => {
type => "=s",
help => "The name of the vmFolder",
required => 1,
},
'datacenter' => {
type => "=s",
variable => "datacenter",
help => "Name of the datacenter",
required => 0,
},
'pool' => {
type => "=s",
variable => "pool",
help => "Name of the resource pool",
required => 0,
},
'host' => {
type => "=s",
variable => "host",
help => "Name of the host" ,
required => 0,
},
);

Opts::add_options(%opts);
Opts::parse();
Opts::validate(\&validate);

Util::connect();

my $vmname = Opts::get_option('vmname');
my $folder = Opts::get_option('folder');

my $vm_views = Vim::find_entity_views((view_type => 'VirtualMachine'), filter => { name => $vmname } );
my $vm_moref = shift @$vm_views;

my $folder_views = Vim::find_entity_views((view_type => 'Folder'), filter => { name => $folder } );
my $folder_moref = shift @$folder_views;

eval
{
$folder_moref->MoveIntoFolder(list => $vm_moref);
};

Util::disconnect();
=========================

Ich bekomme folgende Fehlermeldung:

# Undefined subroutine &main::validate called at C:/Program Files/VMware/VMware VI
# Perl Toolkit/Perl/lib/VMware/VILib.pm line 519.

Ich bin leider in Perl nicht fit genug um den Unterschied zu anderen Skripten zu erkennen, die ich als Quelle benutzt habe. "c:\Programme\VMware\VMware VI Perl Toolkit\Perl\samples\vm\vmprovision.pl" Dort wird das IMHO ebenso benutzt. :roll:

Kommentiere ich die Zeile "Opts::validate(\&validate);" aus, dann tut das Skript seinen Dienst. Aber "validate" prüft sicher die Parameter, worauf ich nicht verzichten will...

Verfasst: 19.05.2009, 19:35
von Tschoergez
Zum Vermeiden der Fehlermeldung musst Du wahrscheinlich ein weiteres Perl-Paket am Anfang mit einbinden:

Code: Alles auswählen

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

my %opts = (
        entity => {
        type => "=s",
        help => "ManagedEntity type: HostSystem, etc",
        required => 1,
    },
);
Opts::add_options(%opts);

....
(aus: http://www.vmware.com/support/developer ... guide.html)

Die genaue Referenz zu den zusätzlichen Funktionen befindet sich dann hier:
http://www.vmware.com/support/developer ... s_idx.html

edit: Oh, habs aus dem Stehgreif wohl zu kompliziert gemeint: Dein Fehler liegt wohl woanders (copy&paste schiefgelaufen?):
Schreib mal bei der validate-Zeile nur:

Code: Alles auswählen

Opts::validate();


Viele Grüße,
Jörg

Verfasst: 25.05.2009, 14:48
von arudolf
Hallo Jörg, Danke - du hast den entscheidenden Hinweis geliefert.

Das was hinter "Opts::validate" in den Klammern stand war eine Referenz auf eine eigene Routine die "Opts::validate" ergänzen soll. Da ich aber keine eigene Sub "validate" habe - bzw nicht mit kopiert habe - ging das an der Stelle schief.

Hier nun das funktionsfähige Skript:

Code: Alles auswählen

#!/usr/bin/perl -w

use strict;
use warnings;

use VMware::VIRuntime;
use VMware::VILib;

$Util::script_version = "1.0";

my %opts = (
   'vmname' => {
      type     => "=s",
      help     => "The name of the vm",
      required => 1,
   },
   'folder' => {
      type     => "=s",
      help     => "The name of the vmFolder",
      required => 1,
   },
   'datacenter'  => {
      type     => "=s",
      variable => "datacenter",
      help     => "Name of the datacenter",
      required => 0,
   },
   'pool'  => {
      type     => "=s",
      variable => "pool",
      help     => "Name of the resource pool",
      required => 0,
   },
   'host' => {
      type     => "=s",
      variable => "host",
      help     => "Name of the host" ,
      required => 0,
   },
);

Opts::add_options(%opts);
Opts::parse();
Opts::validate();

Util::connect();

my $vmname = Opts::get_option('vmname');
my $folder = Opts::get_option('folder');

my $vm_views = Vim::find_entity_views((view_type => 'VirtualMachine'), filter => { name => $vmname } );
my $vm_moref = shift @$vm_views;

my $folder_views = Vim::find_entity_views((view_type => 'Folder'), filter => { name => $folder } );
my $folder_moref = shift @$folder_views;

eval {
   $folder_moref->MoveIntoFolder(list => $vm_moref);
};

Util::disconnect();