Chinaunix首页 | 论坛 | 博客
  • 博客访问: 181962
  • 博文数量: 56
  • 博客积分: 2305
  • 博客等级: 大尉
  • 技术积分: 591
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-13 10:42
文章分类

全部博文(56)

文章存档

2012年(3)

2011年(17)

2010年(36)

我的朋友

分类: LINUX

2011-04-14 13:03:27

VM/Host auto shutdown script, we will first try "Shutdown Guest", and then "Power Off" for Virtual Machines. Finally we will shutdown the host:
 
 

[root@localhost webex_vm_tools]# vi vm_host_auto_shut.pl

#!/usr/bin/perl

BEGIN { push @INC, "/opt/webex_vm_tools" };

use lib::vmware;
use strict;
use warnings;
use VMware::VIRuntime;
use VMware::VILib;
use MIME::Lite;
use Time::Format;

my $DC="test";

#my %opts = (

# 'vmname' => {

# type => "=s",

# help => "The name of the virtual machine",

# required => 1,

# },

#);


#Opts::add_options(%opts);

Opts::parse();
Opts::validate();

# connect to the server

Util::connect();

#customize ip, hostname of virtual machines

poweroff();

#Disconnect from the server

Util::disconnect();

sub poweroff {
   my $HostList=&get_dc_host($DC);
   my @DisConnectedHost;

   foreach my $host(@$HostList)
   {
     my $hostinfo=&get_host_info($host);
     if ( $$hostinfo{state} ne "connected") { @$HostList=grep { $_ ne "$host" } @$HostList; push ( @DisConnectedHost, $host);}
   }
# print "@$HostList\n";


   my $number=0;
   foreach my $host(@$HostList)
   {
     my $VMList=&get_host_vm($host);

     foreach my $vm(@$VMList)
     {
       eval{

          my $powerstatus=&get_vm_power_state("$vm");
          if ( $powerstatus eq "poweredOn" ) { &shutdown_vm("$vm"); print "Shutdown $vm successfully\n"; }
       };
       if ($@) {
          if ( ref($@->detail) eq "ToolsUnavailable") {
            print "VMTools was not installed in $vm, please check!\n";
            &power_off_vm("$vm");
            print "Power off $vm successfully\n";
          }
       }
     }
 sleep(60);

 &power_off_host("$host"); print "Power off $host successfully\n";

   }

}

 

Auto start VM script:

#!/usr/bin/perl

BEGIN { push @INC, "/opt/webex_vm_tools" };

use lib::vmware;
use strict;
use warnings;
use VMware::VIRuntime;
use VMware::VILib;
use MIME::Lite;
use Time::Format;

my $DC="test";

#my %opts = (

# 'vmname' => {

# type => "=s",

# help => "The name of the virtual machine",

# required => 1,

# },

#);


#Opts::add_options(%opts);

Opts::parse();
Opts::validate();

# connect to the server

Util::connect();

#customize ip, hostname of virtual machines

poweron();

#Disconnect from the server

Util::disconnect();

sub poweron {
   my $HostList=&get_dc_host($DC);
   my @DisConnectedHost;

   foreach my $host(@$HostList)
   {
     my $hostinfo=&get_host_info($host);
     if ( $$hostinfo{state} ne "connected") { @$HostList=grep { $_ ne "$host" } @$HostList; push ( @DisConnectedHost, $host);}
   }

   my $number=0;
   foreach my $host(@$HostList)
   {
     my $VMList=&get_host_vm($host);

     foreach my $vm(@$VMList)
     {
       eval{

          my $powerstatus=&get_vm_power_state("$vm");
          if ( $powerstatus eq "poweredOff" ) { &power_on_vm("$vm"); print "Power on $vm successfully\n"; }
       };
     }
   }

}


 

The functions in vmware.pm:


 

sub shutdown_vm {

my ( $vm_name ) = @_ ;
my $vm_view = Vim::find_entity_view( view_type => 'VirtualMachine' ,
        filter => { 'name' => $vm_name }
) ;
$vm_view->ShutdownGuest() ;
}


sub power_off_host {

my ( $host_name ) = @_ ;
my $host_view = Vim::find_entity_view( view_type => 'HostSystem' ,
        filter => { 'name' => $host_name }
) ;
$host_view->ShutdownHost_Task( force => 1 ) ;

}


sub power_off_vm {

my ( $vm_name ) = @_ ;
my $vm_view = Vim::find_entity_view( view_type => 'VirtualMachine' ,
        filter => { 'name' => $vm_name }
) ;
$vm_view->PowerOffVM() ;
}

 

sub power_on_vm {

my ( $vm_name ) = @_ ;
my $vm_view = Vim::find_entity_view( view_type => 'VirtualMachine' ,
        filter => { 'name' => $vm_name }
) ;
$vm_view->PowerOnVM() ;
}

 

sub get_vm_power_state {

my ( $vm_name ) = @_ ;
my $vm_view = Vim::find_entity_view( view_type => 'VirtualMachine',
        filter => { 'name' => $vm_name } ,
        properties => [ 'name','runtime' ]
 ) ;
my $power_state = $vm_view->runtime->powerState->val ;

  return $power_state ;
}

 

sub get_host_info {

my ( $host_name ) = @_ ;
my $host_icon ;
my $network_icon ;
my $storage_icon ;
my $host_view = Vim::find_entity_view( view_type => 'HostSystem' ,
        filter => { 'name' => $host_name } ,
        properties => [ 'name','summary','config','runtime','network','datastore' ]
) ;
my $storage_view = Vim::get_views( mo_ref_array => $host_view->datastore ) ;
my $network_view = Vim::get_views( mo_ref_array => $host_view->network ) ;
my $cpu_mhz = $host_view->summary->hardware->cpuMhz ;
my $num_cpu_core = $host_view->summary->hardware->numCpuCores ;
my $manufacture = $host_view->summary->hardware->vendor ;
my $model = $host_view->summary->hardware->model ;
my $cpu_model = $host_view->summary->hardware->cpuModel ;
my $num_cpu_pkg = $host_view->summary->hardware->numCpuPkgs ;
my $num_cpu_thread = $host_view->summary->hardware->numCpuThreads ;
my $ht = ( $host_view->config->hyperThread->active eq "1" ) ? "true" : "false" ;
my $num_nic = $host_view->summary->hardware->numNics ;
my $state = $host_view->runtime->connectionState->val ;
my $status = $host_view->summary->overallStatus->val ;
switch ( $status ) {
  case(green) { $host_icon = "menu_normal.png" }
  case(red) { $host_icon = "menu_alert.png" }
  case(yellow) { $host_icon = "menu_warning.png" }
  case(gray) { $host_icon = "menu_unknown.png" }
}

sub get_host_vm {

my ( $host_ip ) = @_ ;
my @vm_list ;
my $host_view = Vim::find_entity_view( view_type => 'HostSystem',
        filter => { name => $host_ip } ,
        properties => [ 'name' ]
) ;

my $vm_views = Vim::find_entity_views( view_type => 'VirtualMachine',
        begin_entity => $host_view ,
        filter => {'config.template' => qr/false/i},
        properties => [ 'name' ]
) ;

foreach ( @$vm_views ) {
  push( @vm_list, $_->name ) ;
}

  return \@vm_list ;
}

sub get_dc_host {

my ( $dc_name ) = @_ ;
my @host_list ;
my $dc_view = Vim::find_entity_view( view_type => 'Datacenter',
                                filter => { name => $dc_name } ,
                                properties => ['name']
) ;
my $host_views = Vim::find_entity_views( view_type => 'HostSystem' ,
                         begin_entity => $dc_view ,
                        properties => ['name','parent']
) ;

foreach my $host_view ( @$host_views ) {
  push ( @host_list, $host_view->name ) ;
}

 

 



阅读(995) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~