Article View: pl.comp.lang.perl
Article #51961skrypt vmware dlugie
From: wwwd
Date: Mon, 19 Jul 2010 21:07
Date: Mon, 19 Jul 2010 21:07
1296 lines
38613 bytes
38613 bytes
Cześć
Jako, że nie jestem programistą z perl-a stanałem przed problemem
przerobienia skryptu do UPS-a.
Docelowo skrypt ma robić
1. wprowadzać esxi w tryb maitenance_mode
2. wykonać shutdown
Nie chcę korzystać z skryptów VMware gdyż mogą się zmienić np. po
upgrade software.
Otóż jest sobie skrypt (dostarczony przez VMware) - potrafi wprowadzić
tryb maitnance_mode
1
------------
#!/usr/bin/perl -w
#
# Copyright (c) 2007 VMware, Inc. All rights reserved.
use strict;
use warnings;
use FindBin;
use lib "$FindBin::Bin/../";
use VMware::VIRuntime;
use AppUtil::HostUtil;
$Util::script_version = "1.0";
my %operations = (
"add_standalone", "",
"disconnect", "" ,
"reconnect", "" ,
"enter_maintenance", "",
"exit_maintenance", "",
"reboot", "",
"shutdown", "",
"addhost", "",
"removehost", "",
"moveintofolder", "",
"moveintocluster", "",
);
my %opts = (
target_host => {
type => "=s",
help => "Target host",
required => 1,
},
target_username => {
type => "=s",
help => "Target host username ",
required => 0,
},
target_password => {
type => "=s",
help => "Target host password ",
required => 0,
},
# bug 300034
operation => {
type => "=s",
help => "Operation to perform on target host:"
."add_standalone, disconnect, enter_maintenance,"
."exit_maintenance, reboot, shutdown, addhost, reconnect,"
."removehost, moveintofolder, moveintocluster",
required => 1,
},
suspend => {
type => "=i",
help => " Flag to specify whether or not to suspend the virtual
machines",
required => 0,
default => 0,
},
quiet => {
type => "=i",
help => " Flag to specify whether or not to provide progress
messages"
. " as the virtual machines are suspended for some
operations.",
required => 0,
default => 1,
},
port => {
type => "=s",
help => " The port number for the connection",
required => 0,
},
cluster => {
type => "=s",
help => " The cluster in which to add the host",
required => 0,
},
folder => {
type => "=s",
help => " The folder in which to add the host",
required => 0,
},
force => {
type => "=i",
help => " Flag to specify whether or not to force the addition of
host"
. " even if this is being managed by other virtual center.",
required => 0,
default => 0,
},
);
Opts::add_options(%opts);
Opts::parse();
Opts::validate(\&validate);
Util::connect();
my $operation = Opts::get_option('operation');
my $target_host = Opts::get_option('target_host');
my $entity_view;
my $folder_views;
my $folder;
my $cluster;
my $cluster_views;
my %filterHash = create_hash($target_host );
my $suspendFlag = Opts::get_option('suspend');
my $quietflag = Opts::get_option('quiet');
if (Opts::get_option('operation') eq 'add_standalone') {
$folder_views = get_folder_views();
add_standalone_host($folder_views);
}
elsif (Opts::get_option('operation') eq 'addhost') {
add_host();
}
else {
my $host_views = HostUtils::get_hosts ('HostSystem',undef,undef,
%filterHash);
if ($host_views) {
$entity_view = shift @$host_views;
if( $operation eq "disconnect" ) {
disconnect_host($entity_view);
}
elsif( $operation eq "reconnect" ) {
reconnect_host($entity_view);
}
elsif( $operation eq "enter_maintenance" ) {
enter_maintenance_mode($entity_view);
}
elsif( $operation eq "exit_maintenance" ) {
exit_maintenance_mode($entity_view);
}
elsif( $operation eq "reboot" ) {
reboot_host($entity_view);
}
elsif( $operation eq "shutdown" ) {
shutdown_host($entity_view);
}
elsif( $operation eq "removehost" ) {
remove_host($entity_view);
}
elsif( $operation eq "moveintofolder" ) {
move_into_folder($entity_view);
}
elsif( $operation eq "moveintocluster" ) {
move_into_cluster($entity_view);
}
}
}
Util::disconnect();
sub create_hash {
my ($target_host) = @_;
my %filterHash;
if ($target_host) {
$filterHash{'name'} = $target_host;
}
return %filterHash;
}
sub get_folder_views {
my $folder_name = Opts::get_option('folder');
if (defined Opts::get_option('folder')) {
$folder_views =
Vim::find_entity_views(view_type => 'Folder',
filter => {name => $folder_name});
if (@$folder_views) {
$folder = shift @$folder_views;
return $folder;
}
else {
Util::trace(0,"No folder found\n ");
return $folder;
}
}
else {
$folder_views =
Vim::find_entity_views(view_type => 'Folder');
foreach(@$folder_views) {
my $folder = $_;
my $childType = $folder->childType;
foreach(@$childType){
if($_ eq "ComputeResource") {
return $folder;
}
}
}
Util::trace(0,"No folder found\n");
return;
}
}
sub get_cluster_views {
my $cluster_name = Opts::get_option('cluster');
if (defined Opts::get_option('cluster')) {
$cluster_views =
Vim::find_entity_views(view_type => 'ClusterComputeResource',
filter => {name => $cluster_name});
if (@$cluster_views) {
$cluster = shift @$cluster_views;
return $cluster;
}
else {
Util::trace(0,"No cluster found\n ");
return $cluster;
}
}
}
#Add host to a cluster
#
sub add_host {
my $target_host = Opts::get_option('target_host');
my $target_username = Opts::get_option('target_username');
my $target_password = Opts::get_option('target_password');
my $port = Opts::get_option('port');
my $force = Opts::get_option('force');
my $clusterfound = get_cluster_views();
if(defined $clusterfound) {
eval {
my $host_connect_spec = (HostConnectSpec->new(force => ($force
|| 0),
hostName =>
$target_host,
userName =>
$target_username,
password =>
$target_password,
port => $port,
));
$cluster->AddHost(spec => $host_connect_spec, asConnected => 1);
my $host_views = HostUtils::get_hosts ('HostSystem',undef,undef,
%filterHash);
if ($host_views) {
$entity_view = shift @$host_views;
}
# defect 224265
my $check_mode = $entity_view->runtime->inMaintenanceMode;
if($check_mode == 1) {
exit_maintenance_mode($entity_view);
}
Util::trace(0, "\nHost '$target_host' added successfully\n");
};
if ($@) {
if (ref($@) eq 'SoapFault') {
if (ref($@->detail) eq 'DuplicateName') {
Util::trace(0,"\nHost $target_host already exist\n");
}
elsif (ref($@->detail) eq 'AlreadyConnected') {
Util::trace(0, "\nSpecified host is already ".
"connected to the Virtual Center\n");
}
elsif (ref($@->detail) eq 'NoHost') {
Util::trace(0, " \nSpecified host does not exist\n");
}
elsif (ref($@->detail) eq 'AlreadyBeingManaged') {
Util::trace(0, " \nHost is already being managed by other
host\n");
}
elsif (ref($@->detail) eq 'InvalidLogin') {
Util::trace(0, "\nHost authentication failed."
." Invalid Username and\/or Password\n ");
}
else {
Util::trace(0, "Error: " . $@ . " ");
}
}
else {
Util::trace(0, "Error: " . $@ . " ");
}
}
}
else {
Util::trace(0," ");
}
}
#Remove host
#
sub remove_host {
my $target_host = shift;
my $host_name = Opts::get_option('target_host');
# Bug 289362 fix start
if ($entity_view->parent->type eq 'ComputeResource') {
$target_host = ($entity_view->parent);
my $target_host_view = Vim::get_view(mo_ref => $target_host);
$target_host = $target_host_view;
}
elsif ($entity_view->parent->type eq 'ClusterComputeResource') {
$target_host = ($entity_view);
if (!$entity_view->runtime->inMaintenanceMode) {
enter_maintenance_mode($entity_view);
}
}
# Bug 289362 fix end
eval {
$target_host->Destroy();
Util::trace(0, "\nHost '$host_name' removed successfully\n");
};
if ($@) {
if (ref($@) eq 'SoapFault') {
if (ref($@->detail) eq 'InvalidState') {
Util::trace(0,"\n The operation is not allowed in the
current state\n");
}
elsif (ref($@->detail) eq 'RuntimeFault') {
Util::trace(0,"\nRuntime Fault\n");
}
else {
Util::trace(0, "Error: " . $@ . " ");
}
}
else {
Util::trace(0, "Error: " . $@ . " ");
}
}
}
#Move the existing host into cluster
sub move_into_cluster {
my $clusterfound = get_cluster_views();
my $flag = 0;
# Bug 289362 / 223627 fix start
if(defined $clusterfound) {
my $cluster_name = Opts::get_option('cluster');
my @listArray = ($entity_view);
eval {
if ($entity_view->parent->type eq 'ClusterComputeResource') {
if (!$entity_view->runtime->inMaintenanceMode) {
enter_maintenance_mode($entity_view);
$flag = 1;
}
}
$cluster->MoveInto(host=>@listArray);
Util::trace(0,"\nHost $target_host moved into cluster
$cluster_name \n");
if($flag == 1){
exit_maintenance_mode($entity_view);
}
# Bug 289362 223627 fix end
};
if ($@) {
if (ref($@) eq 'SoapFault') {
if (ref($@->detail) eq 'DuplicateName') {
Util::trace(0,"\nHost $target_host already exist\n");
}
elsif (ref($@->detail) eq 'InvalidFolder') {
Util::trace(0, "\nInvalid folder");
}
elsif (ref($@->detail) eq 'InvalidState') {
Util::trace(0, " \nmoveintocluster operation is not
allowed in "
."the current state\n");
}
elsif (ref($@->detail) eq 'InvalidArgument') {
Util::trace(0, " \nA specified parameter was not
correct\n");
}
elsif (ref($@->detail) eq 'NotSupported') {
Util::trace(0, "\nmovehost operation is not supported on
the object\n");
}
else {
Util::trace(0, "Error: " . $@ . " ");
}
}
else {
Util::trace(0, "Error: " . $@ . " ");
}
}
}
else {
Util::trace(0," ");
}
}
sub move_into_folder {
my $folderfound = get_folder_views();
# bug 223627 fix start
my $flag = 0;
if(defined $folderfound) {
my $folder_name = Opts::get_option('folder');
# defect 270711
my @listArray = undef;
if ($entity_view->parent->type eq 'ComputeResource') {
@listArray = ($entity_view->parent);
}
elsif ($entity_view->parent->type eq 'ClusterComputeResource') {
@listArray = ($entity_view);
if (!$entity_view->runtime->inMaintenanceMode) {
enter_maintenance_mode($entity_view);
$flag = 1;
}
} else {
@listArray = ($entity_view);
}
eval {
$folder->MoveIntoFolder(list=>@listArray);
Util::trace(0,"\nHost $target_host moved into folder
$folder_name \n");
if($flag == 1){
exit_maintenance_mode($entity_view);
}
# bug 223627 fix end
};
if ($@) {
if (ref($@) eq 'SoapFault') {
if (ref($@->detail) eq 'DuplicateName') {
Util::trace(0,"\nHost $target_host already exist\n");
}
elsif (ref($@->detail) eq 'InvalidFolder') {
Util::trace(0, "\nInvalid folder");
}
elsif (ref($@->detail) eq 'InvalidState') {
Util::trace(0, " \nmoveinto folder operation is not
allowed in the "
."current state\n");
}
elsif (ref($@->detail) eq 'InvalidArgument') {
Util::trace(0, " \nA specified parameter was not
correct\n");
}
elsif (ref($@->detail) eq 'NotSupported') {
Util::trace(0, "\nmoveinto folder operation is not
supported on the object\n");
}
else {
Util::trace(0, "Error: " . $@ . " ");
}
}
else {
Util::trace(0, "Error: " . $@ . " ");
}
}
}
else {
Util::trace(0, " ");
}
}
# Add standalone server host
sub add_standalone_host {
my $folder = shift;
my $target_host = Opts::get_option('target_host');
my $target_username = Opts::get_option('target_username');
my $target_password = Opts::get_option('target_password');
my $port = Opts::get_option('port');
my $force = Opts::get_option('force');
eval {
my $host_connect_spec = (HostConnectSpec->new(force => ($force || 0),
hostName =>
$target_host,
userName =>
$target_username,
password =>
$target_password,
port => $port,
));
$folder->AddStandaloneHost(spec => $host_connect_spec,
addConnected => 1);
my $host_views = HostUtils::get_hosts ('HostSystem',undef,undef,
%filterHash);
if ($host_views) {
$entity_view = shift @$host_views;
}
Util::trace(0, "\nHost '$target_host' added successfully\n");
};
if ($@) {
if (ref($@) eq 'SoapFault') {
if (ref($@->detail) eq 'DuplicateName') {
Util::trace(0,"\nHost $target_host already exist\n");
}
elsif (ref($@->detail) eq 'AlreadyConnected') {
Util::trace(0, "\nSpecified host is already ".
"connected to the Virtual Center\n");
}
elsif (ref($@->detail) eq 'NoHost') {
Util::trace(0, " \nSpecified host does not exist\n");
}
elsif (ref($@->detail) eq 'InvalidLogin') {
Util::trace(0, "\nHost authentication failed."
." Invalid Username and\/or Password\n ");
}
else {
Util::trace(0, "Error: " . $@ . " ");
}
}
else {
Util::trace(0, "Error: " . $@ . " ");
}
}
}
# Disconnect a host
# -----------------
sub disconnect_host {
my $target_host = shift;
eval {
$target_host->DisconnectHost();
Util::trace(0, "\nHost '" . $target_host->name . "' disconnected
successfully\n");
};
if ($@) {
if (ref($@) eq 'SoapFault') {
if (ref($@->detail) eq 'NotSupported') {
Util::trace(0,"\nRunning directly on an ESX Server host.");
}
elsif (ref($@->detail) eq 'InvalidState') {
Util::trace(0,"\nThe operation is not allowed in the
current state.\n");
}
else {
Util::trace (0, "\nHost can't be disconnected \n" . $@. "" );
}
}
else {
Util::trace (0, "\nHost can't be disconnected \n" . $@. "" );
}
}
}
# Reconnect a host
# ----------------
sub reconnect_host {
my $target_host = shift;
eval {
$target_host->ReconnectHost();
Util::trace(0, "\nHost '" . $target_host->name . "' reconnected
successfully\n");
};
if ($@) {
if (ref($@) eq 'SoapFault') {
if (ref($@->detail) eq 'InvalidState') {
Util::trace(0,"\nThe operation is not allowed in the
current state\n");
}
elsif (ref($@->detail) eq 'AlreadyBeingManaged') {
Util::trace(0,"\nHost is already being managed by"
. " another VirtualCenter server\n");
}
else {
Util::trace(0,"\nHost can't be reconnected \n" . $@. "");
}
}
else {
Util::trace(0,"\nHost can't be reconnected \n" . $@. "");
}
}
}
# This subroutine is used to suspend the virtual machines, it is called from
# enter_maintenance, reboot, shutdown_host subroutines
sub suspend_vm {
my $target_host = shift;
my $vm_views = Vim::get_views(mo_ref_array => $target_host->vm);
foreach (@$vm_views) {
if ($_->runtime->powerState->val eq 'poweredOn') {
## bug 299737 fix start
if ($suspendFlag != 1) {
Util::trace(0, "\nThis operation is not allowed as one or".
" more Virtual machines is currently powered
On \n");
return 1;
}
## bug 299737 fix end
elsif ($suspendFlag ==1) {
if($quietflag==0) {
Util::trace(0, "\nSuspending virtual machine: '" .
$_->name . "'...");
}
eval {
$_->SuspendVM();
if($quietflag==0) {
Util::trace($quietflag, "\n\nVirtual machine '" .
$_->name
. "' Suspended successfully\n");
}
};
if ($@) {
if (ref($@) eq 'SoapFault') {
if (ref($@->detail) eq 'InvalidPowerState') {
Util::trace(0,"\nVM should be powered on");
}
elsif (ref($@->detail) eq 'NotSupported') {
Util::trace(0,"\nVirtual machine is marked as a
template.");
}
else {
Util::trace(0,"\nVM cannot be suspended \n" . $@. "");
}
}
else {
Util::trace(0,"\nVM cannot be suspended \n" . $@. "");
}
}
}
}
}
}
# This is used to enter the host in maintenance mode. All the powered On
VM's
# are first suspended if the suspend flag is set to '1' else if suspend flag
# is set to '0' then the operation will not be performed if any of the
virtual
# machine is powered On.
sub enter_maintenance_mode {
my $target_host = shift;
my $suspend_call = 0 ;
#$suspend_call = suspend_vm($entity_view);
if((defined $suspend_call)&&($suspend_call ==1)) {
return;
}
eval {
$target_host->EnterMaintenanceMode(timeout => 0);
Util::trace(0, "\nHost '" . $target_host->name
. "' entered maintenance mode successfully\n");
};
if ($@) {
if (ref($@) eq 'SoapFault') {
if (ref($@->detail) eq 'InvalidState') {
Util::trace(0,"\nThe enter_maintenancemode operation".
" is not allowed in the current state");
}
elsif (ref($@->detail) eq 'Timedout') {
Util::trace(0,"\nOperation is timed out\n");
}
elsif (ref($@->detail) eq 'HostNotConnected') {
Util::trace(0,"\nUnable to communicate with the"
. " remote host, since it is disconnected.\n");
}
else {
Util::trace(0,"\nHost cannot be entered into maintenance
mode \n" . $@. "");
}
}
else {
Util::trace(0,"\nvvgmvnvnost cannot be entered into
maintenance mode \n" . $@. "");
}
}
}
# This subroutine is used to exit the host from maintenance mode
# --------------------------------------------------------------
sub exit_maintenance_mode {
my $target_host = shift;
eval {
$target_host->ExitMaintenanceMode(timeout => 0);
Util::trace(0, "\nHost '" . $target_host->name
. "' exited maintenance mode successfully\n ");
};
if ($@) {
if (ref($@) eq 'SoapFault') {
if (ref($@->detail) eq 'InvalidState') {
Util::trace(0,"\nThe operation is not allowed in the
current state");
}
else {
Util::trace(0,"\nHost cannot exit maintenance mode \n" .
$@. "");
}
}
else {
Util::trace(0,"\nHost cannot exit maintenance mode \n" . $@. "");
}
}
}
# This subroutine is required for rebooting the host. All the powered On
VM's
# are first suspended if the suspend flag is set to '1' else if suspend flag
# is set to '0' then the operation will not be performed if any of the
virtual
# machine is powered On.
sub reboot_host {
my $target_host = shift;
if(suspend_vm($entity_view)==1) {
return;
}
eval {
$target_host->RebootHost(force => 0);
Util::trace(0, "\nHost '" . $target_host->name . "' rebooted
successfully\n");
};
if ($@) {
if (ref($@) eq 'SoapFault') {
if (ref($@->detail) eq 'InvalidState') {
Util::trace(0,"\nThe operation is not allowed in the
current state");
}
elsif (ref($@->detail) eq 'HostNotConnected') {
Util::trace(0,"\nUnable to communicate"
. " with the remote host, since it is
disconnected");
}
else {
Util::trace (0,"\nHost can't reboot \n" . $@ ."" );
}
}
else {
Util::trace (0,"\nHost can't reboot \n" . $@. "" );
}
}
if ($target_host->runtime->inMaintenanceMode) {
exit_maintenance_mode($entity_view);
}
}
# This is used for shutting down the host. All the powered On VM's
# are first suspended if the suspend flag is set to '1' else if suspend flag
# is set to '0' then the operation will not be performed if any of the
virtual
# machine is powered On.
sub shutdown_host {
my $target_host = shift;
if(suspend_vm($entity_view)==1) {
return;
}
eval {
$target_host->ShutdownHost(force => 0);
Util::trace(0, "\nShutdown of host '" . $target_host->name
. "' done successfully\n");
};
if ($@) {
if (ref($@) eq 'SoapFault') {
if (ref($@->detail) eq 'InvalidState') {
Util::trace(0,"\nThe operation is not allowed in the
current state");
}
else {
Util::trace(0,"\nCan't shutdown host\n" . $@ ."" );
}
}
}
}
sub validate {
my $operation = Opts::get_option('operation');
my $valid = 1;
if (($operation eq 'add_standalone') &&
((!Opts::option_is_set('target_username'))||
!Opts::option_is_set('target_password'))) {
Util::trace(0, "Must specify target_username and target_password "
. "options for add_standalone operation \n");
$valid = 0;
}
if (($operation eq 'addhost') &&
((!Opts::option_is_set('target_username'))||
(!Opts::option_is_set('target_password'))||(!Opts::option_is_set('cluster'))))
{
Util::trace(0, "Must specify target_username and target_password
and cluster "
. "options for addhost operation \n");
$valid = 0;
}
# Bug 289362/300062/300066 fix start
if (($operation eq 'moveintofolder') &&
(!Opts::option_is_set('folder'))) {
Util::trace(0, "Must specify folder name "
. "options for moveinto folder operation \n");
$valid = 0;
}
if (($operation eq 'moveintocluster') &&
(!Opts::option_is_set('cluster'))){
Util::trace(0, "Must specify cluster "
. "name options for moveinto cluster operation \n");
$valid = 0;
}
# Bug 289362/300062/300066 fix end
if (!exists($operations{$operation})) {
Util::trace(0,"\nInvalid operation: $operation\n");
Util::trace(0,"List of valid operations \n");
map { print " $_\n"; } sort keys %operations;
$valid = 0;
}
return $valid;
}
__END__
## bug 217605
=head1 NAME
hostops.pl - Performs these operations: add standalone, disconnect,
reconnect,
enter maintenance mode, exit from maintenance mode, reboot, shutdown
host, add host, remove host,
and move host into folder/cluster.
=head1 SYNOPSIS
hostops.pl --operation <disconnect|reconnect|enter_maintenance|
exit_maintenance|reboot|shutdown|add_standalone|
addhost|moveintofolder|moveintocluster|removehost> [options]
=head1 DESCRIPTION
This script allows users to perform basic operations on the host server.
The supported operations are: add_standalone, disconnect,
reconnect, enter_maintenance, exit_maintenance, reboot, shutdown, addhost
moveintofolder, moveintocluster, removehost.
=head1 OPTIONS
=over
=item B<operation>
Required. Operation to be performed must be one of the following:
I<shutdown> E<ndash> shutdown the host
I<reboot> E<ndash> reboot the host
I<enter_maintenance> E<ndash> set host into maintenance mode
I<exit_maintenance> E<ndash> exit the maintenance mode
I<disconnect> E<ndash> disconnect the host
I<reconnect> E<ndash> reconnect the host
I<add_standalone> E<ndash> add new host
I<addhost> E<ndash> add host to a cluster
I<moveintofolder> E<ndash> move host out of a cluster to a folder
I<moveintocluster> E<ndash> move host out of a folder to a cluster
I<removehost> E<ndash> remove move host
=back
=head2 ADD STANDALONE OPTIONS
=over
=item B<target_host>
Required. Domain name or IP address of the target host.
=item B<target_username>
Required. Username for logging into the VirtualCenter server to be added.
=item B<target_password>
Required. Password for logging into the VirtualCenter server to be added.
=back
=head2 ADD HOST OPTIONS
=over
=item B<target_host>
Required. Domain name or IP address of the target host.
=item B<target_username>
Required. Username for logging into the VirtualCenter server to be added.
=item B<target_password>
Required. Password for logging into the VirtualCenter server to be added.
=item B<cluster>
Required. Name of the cluster into which host is to be added.
=item B<force>
Optional. Flag to specify whether or not to force the addition of host
even if this is being managed by other virtual center.
=item B<port>
Optional. Port number for the connection.
=back
=head2 MOVE HOST INTO FOLDER OPTIONS
=over
=item B<target_host>
Required. Domain name or IP address of the target host.
=item B<folder>
Required. Folder name into which host is to be moved in from the cluster
in the
current datacenter.
=back
=head2 MOVE HOST INTO CLUSTER OPTIONS
=over
=item B<target_host>
Required. Domain name or iIP address of the target host.
=item B<cluster>
Required. Cluster name into which host is to be moved in from the folder
in the
current datacenter.
=back
=head2 REMOVE HOST OPTIONS
=over
=item B<target_host>
Required. Domain name or IP address of the target host.
=back
=head2 DISCONNECT HOST OPTIONS
=over
=item B<target_host>
Required. Domain name or IP address of the target host.
=back
=head2 RECONNECT HOST OPTIONS
=over
=item B<target_host>
Required. Domain name or IP address of the target host.
=back
=head2 ENTER MAINTENANCE MODE OPTIONS
=over
=item B<target_host>
Required. Domain name or IP address of the target host.
=item B<suspend>
Optional. Flag to specify whether or not to suspend to virtual machine.
=item B<quiet>
Optional. Flag to specify whether or not to provide progress messages
as the virtual machines are suspended for some operations.
=back
=head2 EXIT MAINTENANCE MODE OPTIONS
=over
=item B<target_host>
Required. Domain name or IP address of the target host.
=back
=head2 SHUTDOWN OPTIONS
=over
=item B<target_host>
Required. Domain name or IP address of the target host.
=item B<suspend>
Optional. Flag to specify whether or not to suspend to virtual machine.
=item B<quiet>
Optional. Flag to specify whether or not to provide progress messages
as the virtual machines are suspended for some operations.
=back
=head2 REBOOT OPTIONS
=over
=item B<target_host>
Required. Domain name or IP address of the target host.
=item B<suspend>
Optional. Flag to specify whether or not to suspend to virtual machine.
Default: 0
=item B<quiet>
Optional. Flag to specify whether or not to provide progress messages
as the virtual machines are suspended for some operations.
Default: 1
=back
=head1 EXAMPLES
Shut down a host with progress messages. i.e "quiet = 0":
hostops.pl --username root --password esxadmin --operation shutdown
--url https://<ipaddress>:<port>/sdk/webService
--target_host targetABC --suspend 1 --quiet 0
Reboot a host with progress messages. i.e "quiet = 0":
hostops.pl --username root --password esxadmin --operation reboot
--url https://<ipaddress>:<port>/sdk/webService
--target_host targetABC --suspend 1 --quiet 0
Enter maintenance mode with no progress messages. i.e "quiet = 1":
hostops.pl --username root --password esxadmin --operation
enter_maintenance
--url https://<ipaddress>:<port>/sdk/webService
--target_host targetABC --suspend 1 --quiet 1
Exit maintenance mode:
hostops.pl --username root --password esxadmin --operation
exit_maintenance
--url https://<ipaddress>:<port>/sdk/webService
--target_host targetABC
Reconnect a host:
hostops.pl --url https://<ipaddress>:<port>/sdk/webService --username user
--password mypassword --target_host targetABC
--operation reconnect
Disconnect a host:
hostops.pl --url https://<ipaddress>:<port>/sdk/webService --username user
--password mypassword --target_host targetABC
--operation disconnect
Add standalone host, this host is already being managed by other virtual
center
use force option to add it to the given virtual center:
hostops.pl --url https://<ipaddress>:<port>/sdk/webService --username user
--password mypassword --target_host targetABC
--target_username root --target_password esxadmin
--operation add_standalone --force 1
Remove host:
hostops.pl --url https://<ipaddress>:<port>/sdk/webService --username user
--password mypassword --target_host targetABC
--operation removehost
Add host to a cluster:
hostops.pl --url https://<ipaddress>:<port>/sdk/webService --username user
--password mypassword --target_host targetABC
--operation addhost --cluster myCluster
Move host from cluster to a folder:
hostops.pl --url https://<ipaddress>:<port>/sdk/webService --username user
--password mypassword --target_host targetABC
--operation moveintofolder --folder myFolder
Move host from folder to a cluster:
hostops.pl --url https://<ipaddress>:<port>/sdk/webService --username user
--password mypassword --target_host targetABC
--operation moveintocluster --cluster mycluster
=head1 SUPPORTED PLATFORMS
All operations supported on VirtualCenter 2.0.1.
Only enter_maintenance, exit_maintenance, shutdown, and reboot work with
ESX Sever 3.0.1.
-------------
Który wyłącza esxi ale tylko jeżeli na esx nie działa żadna VM. - udało
mi się obejść ten problem jednak nie mogę zastosować kopiuj wklej do
skryptu do UPS.
Gdyż ten skrypt wygląda tak
2
------------------
#!/usr/bin/perl -w
##################################################################
# Author: William Lam
# Email: william2003[at]gmail[dot]com
# 02/13/2009
# http://www.engineering.ucsb.edu/~duonglt/vmware/
##################################################################
use strict;
use warnings;
use Getopt::Long;
use VMware::VIRuntime;
use VMware::VILib;
####################
# GLOBAL VARIABLES
####################
my $host_type;
my $host_view;
my $ups_vm_name;
my $ups_vm;
my $content;
my $sleep_duration;
my $final_host_wait = 30;
my %opts = (
ups_vm => {
type => "=s",
help => "The name of VM that is monitoring your UPS",
required => 1,
},
sleep => {
type => "=i",
help => "The amount of time (secs) to wait after a guestOS shutdown
(default 15 secs)",
required => 0,
},
);
# validate options, and connect to the server
Opts::add_options(%opts);
print "-------------------------------------";
# validate options, and connect to the server
Opts::parse();
Opts::validate();
Util::connect();
if (Opts::option_is_set ('ups_vm') ) {
$ups_vm_name = Opts::get_option('ups_vm');
}
if (Opts::option_is_set ('sleep') ) {
$sleep_duration = Opts::get_option('sleep');
} else { $sleep_duration = 15; }
############################
# PARSE COMMANDLINE OPTIONS
#############################
$content = Vim::get_service_content();
$host_type = $content->about->apiType;
if($host_type eq 'HostAgent') {
$host_view = Vim::find_entity_views(view_type => 'HostSystem');
if (!$host_view) {
print "ESX/ESXi host was not found\n";
} else {
shutdownVMs($host_view);
}
}
Util::disconnect();
### HELPER FUNCTIONS ###
sub shutdownVMs {
print "\n===shutdownVMs";
my ($host) = @_;
my $found_vima;
foreach(@$host) {
print giveMeDate('MDYHMS')," -- Found ESX/ESXi host: ",$_->name,"!\n";
print "\t",giveMeDate('MDYHMS')," -- Begin shutdown process ...\n";
my $vm_views = Vim::get_views (mo_ref_array => $_->vm);
my $found_vima = 0;
#shutdown if you did not find VIMA
if($found_vima == 0) {
shutdownHost($_,'1');
} elsif ($found_vima == 1) {
my $vima_host_view = Vim::get_view(mo_ref =>
$ups_vm->runtime->host);
shutdownHost($vima_host_view,'2');
}
}
}
sub shutdownHost {
print "\n====shutdownhost";
my ($host,$shutdown_type) = @_;
my $hostname = $host->name;
if($shutdown_type eq '1') {
print "\t", giveMeDate('MDYHMS')," -- HOST: ", $hostname, " is
shutting down!\n";
eval { $host->EnterMaintenanceMode(timeout => 0); };
} else {
print "\t", giveMeDate('MDYHMS')," -- Shutting down final host:
$hostname and UPS VM: $ups_vm_name!\n";
sleep($final_host_wait);
eval { $host->EnterMaintenanceMode(timeout => 0); };
print
"==============================================================================================\n";
}
}
sub giveMeDate {
my ($date_format) = @_;
my %dttime = ();
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
localtime(time);
my $my_time;
### begin_: initialize DateTime number formats
$dttime{year } = sprintf "%04d",($year + 1900); ## four
digits to specify the year
$dttime{mon } = sprintf "%02d",($mon + 1); ## zeropad months
$dttime{mday } = sprintf "%02d",$mday; ## zeropad
day of the month
$dttime{wday } = sprintf "%02d",$wday + 1; ## zeropad
day of week; sunday = 1;
$dttime{yday } = sprintf "%02d",$yday; ## zeropad
nth day of the year
$dttime{hour } = sprintf "%02d",$hour; ## zeropad hour
$dttime{min } = sprintf "%02d",$min; ## zeropad
minutes
$dttime{sec } = sprintf "%02d",$sec; ## zeropad
seconds
$dttime{isdst} = $isdst;
if($date_format eq 'MDYHMS') {
$my_time = "$dttime{mon}-$dttime{mday}-$dttime{year}
$dttime{hour}:$dttime{min}:$dttime{sec}";
}
elsif ($date_format eq 'YMD') {
$my_time = "$dttime{year}-$dttime{mon}-$dttime{mday}";
}
return $my_time;
}
------------
system nie może wprowadzić maszyny w tryb maitnenace ponieważ działa na
nim VM.
I tak chciałbym ze skryptu nr 1 przenieśc tą funkcjonalność do skryptu nr 2
Technical Details
Message-ID:
<i22eqb$mt$1@inews.gazeta.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mailShow Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mail From: wwwd <d-wasyl@NOSPAM.gazeta.pl> Newsgroups: pl.comp.lang.perl Subject: skrypt vmware dlugie Date: Mon, 19 Jul 2010 23:07:20 +0200 Organization: "Portal Gazeta.pl -> http://www.gazeta.pl" Lines: 1296 Message-ID: <i22eqb$mt$1@inews.gazeta.pl> NNTP-Posting-Host: aqj208.neoplus.adsl.tpnet.pl Mime-Version: 1.0 X-Trace: inews.gazeta.pl 1279573645 733 83.26.169.208 (19 Jul 2010 21:07:25 GMT) X-Complaints-To: usenet@agora.pl NNTP-Posting-Date: Mon, 19 Jul 2010 21:07:25 +0000 (UTC) X-User: d-wasyl User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; pl; rv:1.9.1.10) Gecko/20100512 Lightning/1.0b1 Thunderbird/3.0.5 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit