使用Perl進(jìn)行虛擬化環(huán)境的自動(dòng)化管理和部署
概述
虛擬化作為云計(jì)算的基礎(chǔ),是目前一個(gè)重要的趨勢(shì)。通過(guò)虛擬化可以提高 IT 資源和應(yīng)用程序的效率和可用性?;趦?nèi)核的虛擬機(jī) KVM 在 2008 年被 RedHat 收購(gòu)后,在 IBM 和 RedHat 的聯(lián)合推動(dòng)下得到了全面的發(fā)展。最新發(fā)布的 RHEL 版本中已經(jīng)全面支持了 KVM 虛擬機(jī),并集成了一整套基于 libvirt 的管理工具 (virsh/virt-top/virt-install/virt-manager 等 )。虛擬化領(lǐng)域的主要廠商 VMware 的 vSphere 虛擬環(huán)境提供的 vSphere Client 讓用戶可通過(guò)直觀的圖形化方式管理 vCenter/ESX server/datacenter/cluster/VM 等對(duì)象。但是當(dāng)被管理對(duì)象數(shù)量龐大時(shí),使用 virt-manager 或者 vSphere Client 的圖形化方式來(lái)處理一些日常事務(wù)就顯得費(fèi)時(shí)費(fèi)力了。為此用戶可以通過(guò)相應(yīng)的 API 來(lái)編寫程序管理這些日常事務(wù)。本文將介紹 libvirt API 和 vSphere SDK for Perl 在系統(tǒng)管理方面的應(yīng)用。本文將對(duì)于開(kāi)發(fā)人員、系統(tǒng)管理員、系統(tǒng)測(cè)試人員有所幫助。
使用 libvirt 管理 KVM 環(huán)境
libvirt 是一套實(shí)現(xiàn) Linux 虛擬化功能的開(kāi)源 API,旨在提供一種單一的方式管理多種不同的虛擬化方案。目前 libvirt 支持如下的 hypervisor:
- KVM/QEMU
 - Xen
 - LXC
 - OpenVZ
 - VirtualBox
 - VMware ESX, workstation, player
 - Microsoft Hyper-V
 
伴隨著 libvirt,RHEL 最新的發(fā)行版還包含了一系列基于 libvirt 的工具用于簡(jiǎn)化虛擬機(jī)的維護(hù)管理:
- virt-install: 用于創(chuàng)建虛擬機(jī)
 - virsh: 交互式/批處理 shell,可以用于完成虛擬環(huán)境的日常管理工作
 - virt-manager: 一個(gè)圖形化的界面 , 用于 Hypervisor 及其虛擬機(jī)的管理
 - virt-clone: 用于虛擬機(jī)克隆
 - virt-viewer: 安全連接虛擬機(jī)的圖形控制臺(tái)工具
 
雖然 libvirt 本身由 C 開(kāi)發(fā) , 它提供了多種主流語(yǔ)言的綁定。系統(tǒng)管理員可以自由選擇他們熟悉的語(yǔ)言,如 Python、Perl、Ruby、Java、PHP 等 .#p#
使用 virsh 管理 KVM 虛擬機(jī)
基于 libvirt 的管理工具中最常用的是 virsh。virsh 命令的格式如下:
virsh [OPTION] COMMAND ARG
在不提供任何參數(shù)時(shí),virsh 提供一個(gè)交互式 shell。管理員可以通過(guò) virsh 編寫一些簡(jiǎn)單的 shell 腳本完成虛擬機(jī)/網(wǎng)絡(luò)/存儲(chǔ)的配置。下面的代碼片段顯示了 virsh 命令的使用方法。
使用 ssh 協(xié)議連接到 KVM hypervisor:
[root@BJGSSLA]# virsh connect qemu+ssh://9.9.9.9/system root@9.9.9.9's password:
列舉域 (guest VM):
[root@BJGSSLA]# virsh list Id Name State -------------------------- 32 rhkvm running 33 rhkvm01 running 34 xpkvm running
列舉域的詳細(xì)信息:
[root@BJGSSLA]# virsh dominfo rhkvm Id: 32 Name: rhkvm UUID: 9d37e044-b134-c923-bbe6-0db40707ff9b OS Type: hvm State: running CPU(s): 1 CPU time: 92.6s Max memory: 524288 kB Used memory: 524288 kB Persistent: yes Autostart: disable Managed save: yes
掛起,繼續(xù),重啟域:
[root@BJGSSLA]# virsh suspend rhkvm Domain rhkvm suspended [root@BJGSSLA]# virsh resume rhkvm Doamin rhkvm resumed [root@BJGSSLA]# virsh reboot rhkvm Domain rhkvm is being rebooted
快照管理:
[root@BJGSSLA]# virsh snapshot-create rhkvm Domain snapshot 1336311489 created [root@BJGSSLA]# virsh snapshot-list rhkvm Name Create Time State ----------------------------------------------------- 1336311489 2012-05-06 09:38:09 -0400 running [root@BJGSSLA]# virsh snapshot-revert rhkvm 1336311489
注:在 KVM 虛擬環(huán)境中物理宿主機(jī)被稱為節(jié)點(diǎn) (node),每個(gè) guest 被稱為域 (domain) 。#p#
基于 libvirt API 編寫 Perl 腳本
virsh 可以勝任大部分日常的工作,更復(fù)雜的需求可以通過(guò) libvirt API 編程實(shí)現(xiàn)。本節(jié)將介紹基于如何使用 libvirt for Perl 來(lái)獲得更加精細(xì)的虛擬機(jī)信息。
CPAN 上的 Sys::Virt 模塊即為 libvirt 的 Perl 綁定。首先根據(jù) KVM 環(huán)境中 libvirt 的版本下載、編譯、安裝對(duì)應(yīng)的 Sys-Virt 模塊。本文的實(shí)驗(yàn)環(huán)境中使用 0.9.4 版 libvirt, 因此使用 Sys-Virt-0.9.4:
http://search.cpan.org/~danberr/Sys-Virt-0.9.4/
編譯安裝 Sys::Virt 模塊:
[root@BJGSSLA]# perl Makefile.PL [root@BJGSSLA]# make [root@BJGSSLA]# make install
下面將通過(guò)編寫一個(gè)簡(jiǎn)單的監(jiān)控程序來(lái)介紹 libvirt API 的使用。在生產(chǎn)環(huán)境中,管理員經(jīng)常需要監(jiān)視虛擬機(jī)的 CPU 使用率。如果發(fā)現(xiàn)某些虛擬機(jī)的 CPU 使用率異常,管理員可以提醒虛擬機(jī)的主人或者掛起某些虛擬機(jī)來(lái)保證整個(gè)虛擬化環(huán)境的正常運(yùn)轉(zhuǎn)。
基于 libvirt 開(kāi)發(fā)的虛擬機(jī)性能監(jiān)視工具 virt-top 的文檔中提供了一個(gè)簡(jiǎn)化的實(shí)現(xiàn)算法:
- 對(duì)虛擬機(jī)的 cpuTime 進(jìn)行周期性采樣。此值可以通過(guò) Sys::Virt::Domain 類的 get_info 方法得到,以納秒為單位,記錄了開(kāi)機(jī)到目前所經(jīng)過(guò)的 CPU 時(shí)間
 - 假定兩次采樣的實(shí)際時(shí)間是 t1 和 t2,虛擬機(jī) CPU 運(yùn)行時(shí)間為 vt1 和 vt2
 - 此虛擬機(jī)的 CPU 使用率可以按下式計(jì)算:
 
%CPU = 100% * (vt2 - vt1) / ((t2-v1) * #_of_cores * 10^9)
上述公式中的采樣實(shí)際時(shí)間 (t1 和 t2) 可以通過(guò) Perl 標(biāo)準(zhǔn)庫(kù)模塊 Time::HiRes 的 gettimeofday 方法獲得。 #_of_cores 表示宿主機(jī)的 CPU 核數(shù)。此參數(shù)可以通過(guò) Sys::Virt 類的 get_node_info 方法得到。
  清單 1. vcpu_util.pl
  #!/usr/bin/perl -w
  # usage: vcpu_util --uri uri --dom DOM_Name
  use strict;
  use warnings;
  use Time::HiRes;
  use Getopt::Long;
  use Sys::Virt;
  my ($uri, $dom);
  # 從命令行參數(shù)中獲得 hypervisor 連接信息和虛擬機(jī)名
  GetOptions('uri=s' => \$uri, 'dom=s' => \$dom);
  # 獲得 hypervisor 連接對(duì)象
  my $conn   = Sys::Virt->new(address => $uri) or die \
  "Cannot connect to the hypervisor: $uri. $!\n";
  # 獲得虛擬機(jī)對(duì)象
  my $vm   = $conn->get_domain_by_name($dom) or die \
  "Cannot find the domain: $dom. $!\n";
  my ($start_time, $end_time, $start_vtime, $end_vtime);
  # 獲得第一次采樣的實(shí)際時(shí)間
  $start_time   = Time::HiRes::gettimeofday();
  # 獲得第一次采樣的虛擬機(jī) CPU 時(shí)間
  $start_vtime   = $vm->get_info()->{'cpuTime'};
  # 等待下一次采樣
  sleep(1);
  # 獲得第二次采樣的實(shí)際時(shí)間
  $end_time   = Time::HiRes::gettimeofday();
  # 獲得第二次采樣的虛擬機(jī) CPU 時(shí)間
  $end_vtime   = $vm->get_info()->{'cpuTime'};
  # 獲得宿主 CPU 的核數(shù)
  my $n_cores   = $conn->get_node_info()->{'cores'};
  # 計(jì)算虛擬機(jī) CPU 的利用率
  my $util_rate   = 100 * ($end_vtime - $start_vtime) / (($end_time - \
  $start_time) * 1000000000 * $n_cores);
  printf "CPU utilization of $dom in $uri is: %.2f%%.\n", $util_rate;
下面是某次運(yùn)行的結(jié)果:
[root@BJGSSLA]# ./vcpu_util.pl --uri qemu:///system --dom rhkvm CPU utilization of rhkvm in qemu:///system is: 4.46%
#p#
使用 vSphere SDK 管理 VMware 環(huán)境
上一節(jié)介紹的 libvirt 是一套通用的 API,因此也可以用來(lái)管理 VMware 環(huán)境。但是在這方面 VMware 本身提供的 vSphere SDK 的功能則更具針對(duì)性。下面我們將學(xué)習(xí)如何使用 vSphere SDK for Perl 來(lái)管理 VMware 虛擬化環(huán)境。
搭建 vSphere SDK for Perl 開(kāi)發(fā)環(huán)境
可以從 VMware 的官方站點(diǎn)找到最新的 vSphere SDK for Perl。 讀者需要注冊(cè) VMware 帳號(hào),登錄后根據(jù)需要選擇合適的平臺(tái)版本下載。
在開(kāi)始使用 vSphere SDK for Perl 之前,需要確保開(kāi)發(fā)環(huán)境與 vSphere 之間的連接正常工作。我們可以通過(guò)訪問(wèn) Managed Object Browser (MOB) 來(lái)測(cè)試連接狀況:
https://<vCenter_IP>/mob
MOB 是一個(gè)基于 Web 的服務(wù)器端 (ESX/vCenter) 程序,用以瀏覽服務(wù)器端各種對(duì)象的屬性方法等。如果瀏覽器能正確顯示下面的頁(yè)面,則說(shuō)明開(kāi)發(fā)環(huán)境與 vSphere 之間的連接正常。
圖 1. 使用 MOB 檢查連接狀態(tài)
確保與 VMware 環(huán)境連接正常后,我們需要安裝 vSphere SDK for Perl。安裝前確保其所依賴的 OpenSSL/LibXML2/e2fsprogs 等工具已經(jīng)安裝。vSphere SDK for Perl 的安裝過(guò)程非常簡(jiǎn)單,解壓安裝包,執(zhí)行 vmware-install.pl,接受默認(rèn)參數(shù)即可:
[root@BJGSSLA]# tar – zxvf VMware-vSphere-CLI-4.X.X-XXXXX.i386.tar.gz [root@BJGSSLA]# /<extract_location>/sudo vmware-vsphere-cli-distrib/vmware-install.pl
安裝完成后可運(yùn)行 vSphere SDK for Perl 的一些示例程序來(lái)測(cè)試開(kāi)發(fā)環(huán)境是否可用,例如 datacenterlisting.pl。此程序可獲得 ESX/ESXi 主機(jī)以及這些主機(jī)上虛機(jī)的列表:
[root@BJGSSLA]# cd /usr/share/doc/vmware-vcli/samples/discovery/ [root@BJGSSLA]# perl datacenterlisting.pl --server <vCenter_IP> \ --datacenter <datacenter_name> \ --username <user_name> --password <password>
在本文的實(shí)驗(yàn)環(huán)境中,該腳本的運(yùn)行結(jié)果為:
[root@BJGSSLA]# perl datacenterlisting.pl --server 9.115.66.131 --datacenter MyDC \ --username administrator --password passw0rd Hosts found: 1: 9.115.208.49 VM's found: 1: WIN2K3 2: WIN2K8R2 3: RHEL5
#p#
與 VMware 環(huán)境交互的一般流程
vSphere SDK for Perl 和 vSphere 環(huán)境之間的交互流程大致分以下 4 步:
- 驗(yàn)證命令行參數(shù)
 - 連接遠(yuǎn)程服務(wù)器,傳遞參數(shù)
 - 執(zhí)行用戶定義操作,如從遠(yuǎn)程服務(wù)器端查詢對(duì)象、收集服務(wù)器端對(duì)象的信息、獲取或者修改遠(yuǎn)程服務(wù)器端對(duì)象狀態(tài)等
 - 斷開(kāi)連接
 
了解此交互流程將有助于我們理解示例程序的邏輯,更加清晰的組織自己開(kāi)發(fā)的自動(dòng)化腳本。下面通過(guò)解析一段簡(jiǎn)單的代碼來(lái)說(shuō)明這個(gè)交互過(guò)程。
清單 2. simple_flow.pl
  #! /usr/bin/perl -w
  use strict;
  use warnings;
  # 導(dǎo)入 vSphere SDK for Perl 的運(yùn)行支持模塊
  # 此模塊用來(lái)完成服務(wù)器端 - 客戶端數(shù)據(jù)映射、載入客戶端和服務(wù)器端之間的交互函數(shù)等
  use VMware::VIRuntime;
  # hash 結(jié)構(gòu) %opts 存放自定義命令行參數(shù)
  my %opts =(
  entity => {
  type => "=s",
  variable => "VI_ENTITY",
  help => "ManagedEntity type: HostSystem, etc",
  required => 1,
  },
  );
  # vSphere SDK for Perl 為所有腳本提供了一些基本的命令行參數(shù),如 --server,--url 等
  # Opts::add_options 方法用以添加用戶自定義參數(shù)
  Opts::add_options(%opts);
  # 解析命令行參數(shù)
  Opts::parse();
  # 驗(yàn)證命令行參數(shù)
  Opts::validate();
  # 連接遠(yuǎn)程服務(wù)器,vCenter 或 ESX server
  Util::connect();
  # 提取命令行參數(shù) entity 的值
  my $entity_type = Opts::get_option('entity');
  # 根據(jù) entity 值查詢服務(wù)器端對(duì)象,
  # Vim::find_entity_views 返回服務(wù)器端對(duì)象對(duì)應(yīng)的 Perl 視圖
  my $entity_views = Vim::find_entity_views(view_type=>$entity_type);
  # 輸出服務(wù)器端對(duì)象 Perl 視圖的信息,如類型和名稱等
  foreach my $entity_view (@$entity_views) {
  my $entity_name = $entity_view->name;
  Util::trace(0, "Found $entity_type: $entity_name\n");
  }
  # 斷開(kāi)與遠(yuǎn)程服務(wù)器的連接
  Util::disconnect();
simple_flow.pl 展示了 vSphere SDK for Perl 腳本的一般結(jié)構(gòu),同時(shí)也演示了 Opts 包、Util 包和 Vim 包中一部分常見(jiàn)函數(shù)的用法。simple_flow.pl 在本文的實(shí)驗(yàn)環(huán)境中的運(yùn)行結(jié)果為:
[root@BJGSSLA]# ./simple_flow.pl --server 9.115.66.131 --username administrator \ --password passw0rd --entity HostSystem Found HostSystem: 9.115.208.49 [root@BJGSSLA]# ./simple_flow.pl --server 9.115.66.131 --username administrator \ --password passw0rd --entity VirtualMachine Found VirtualMachine: WIN2K3 Found VirtualMachine: WIN2K8R2 Found VirtualMachine: RHEL55
#p#
VMware 服務(wù)器端對(duì)象與 Perl 視圖
用戶編寫 vSphere SDK for Perl 腳本的目的是訪問(wèn)和修改服務(wù)器端對(duì)象,如虛擬機(jī)、集群、快照等。為此我們需要了解 vSphere 服務(wù)器端對(duì)象的組織、服務(wù)器端對(duì)象與本地 Perl 對(duì)象的關(guān)系。
vSphere 服務(wù)器端對(duì)象被稱為 managed object。每個(gè) managed object 都具有屬性集 (properties) 并提供相關(guān)服務(wù) (methods)。下圖顯示 managed object 的繼承結(jié)構(gòu)(部分 ):
圖 2. 服務(wù)器端 managed object 繼承結(jié)構(gòu)(部分 )
抽象類 ManagedEntity 為服務(wù)器端對(duì)象定義了最基本的屬性集(如 name,parent 等)和方法(如 Reload,Rename_Task 等)。常見(jiàn)的服務(wù)器端對(duì)象,如 ResoucePool、HostSystem、Datacenter、VirtualMachine 等都繼承自 ManagedEntity,提供特定的屬性及方法。感興趣的讀者可以通過(guò)訪問(wèn) MOB 或者 vSphere SDK API 在線參考來(lái)深入了解各種 managed object 的細(xì)節(jié)。
vSphere SDK for Perl 可以將服務(wù)器端對(duì)象的屬性和方法映射為本地 Perl 對(duì)象,即服務(wù)器端對(duì)象的本地 Perl 視圖,所以 Perl 視圖可以看作服務(wù)器端對(duì)象的本地副本,其屬性和方法和服務(wù)器端對(duì)象一一對(duì)應(yīng)。不過(guò)需要注意的是,服務(wù)器端對(duì)象會(huì)實(shí)時(shí)更新,而 Perl 視圖是靜態(tài)的副本,所以當(dāng)需要最新?tīng)顟B(tài)信息時(shí),用戶必須使用 Vim::update_view_data 顯式刷新 Perl 視圖。
我們通??梢允褂?Vim::find_entity_views 和 Vim::find_entity_view 函數(shù)來(lái)獲得獲得本地 Perl 視圖(參考 simple_flow.pl 中的示例 )。有時(shí) Vim::find_entity_views 返回結(jié)果過(guò)多,而 Vim::find_entity_view 返回的結(jié)果集中的第一個(gè)結(jié)果可能并不是我們需要的,此時(shí)我們可以使用 filter 參數(shù)細(xì)化查詢條件、控制查詢結(jié)果。下面的代碼片段使用 guestFullName 屬性進(jìn)行過(guò)濾,獲得所有 Windows 虛擬機(jī)的視圖:
清單 3. 使用 filter 參數(shù)過(guò)濾
  ...
  my $vm_views = Vim::find_entity_views(
  view_type => 'VirtualMachine',
  filter => {
  # config(VirtualMachineConfigInfo 類 ) 是 VirtualMachine 類的屬性
  # guestFullName(xsd:string 類 ) 是 VirtualMachineConfigInfo 類的屬性
  'config.guestFullName' => qr/Windows/
  }
  );
  foreach my $vm (@$vm_views) {
  print "Name: " . $vm->name . "\n";
  }
  ...
大部分服務(wù)器端 managed object 擁有大量的屬性,而我們編寫任務(wù)腳本時(shí)往往只對(duì)其中的一部分感興趣。為得到某個(gè)屬性值而構(gòu)造完整的 Perl 視圖是非常低效的,為此我們可以通過(guò) properties 參數(shù)來(lái)指定 Perl 視圖中需要的屬性:
清單 4. 使用 properties 參數(shù)獲取必要屬性
  ...
  my $vm_view = Vim::find_entity_view(
  view_type => 'VirtualMachine',
  filter => { 'name' => 'foo' },
  # 只獲取 runtime 屬性中的 powerState 屬性
  properties => [ 'runtime.powerState' ]
  );
  # 讀取 Perl 視圖的 powerState 屬性
  my $state = $vm_view->runtime->powerState;
  ...
#p#
使用 vSphere SDK for Perl 完成虛擬機(jī)的部署和定制
虛擬機(jī)模板是一種可重用的虛擬機(jī)映像,通過(guò)模板來(lái)部署虛擬機(jī)可以避免在安裝系統(tǒng)過(guò)程中很多重復(fù)操作,極大地提高了效率。但是即使使用模板來(lái)部署系統(tǒng),我們?nèi)匀恍枰謩?dòng)為各個(gè)虛擬機(jī)完成一些定制性的工作,如配置 IP、主機(jī)名之類。這些定制化工作可以在部署模板時(shí)使用 vSphere 提供的 Customization Wizard 或者 Customization Specification 文件來(lái)完成。Customization Wizard 以向?qū)У男问阶層脩糨斎胱远x信息,用戶也可以把定制信息保存為 Customization Specification 文件以便以后復(fù)用。對(duì)于小規(guī)模的部署,這些工具已經(jīng)足夠。但是當(dāng)規(guī)模變大時(shí),手動(dòng)輸入、編輯、維護(hù)這些信息也會(huì)消耗相當(dāng)多的精力。下面給出的示例代碼將自動(dòng)化地完成虛擬機(jī)部署以及網(wǎng)絡(luò)配置工作。
w2k8_deploy.pl 演示了如何通過(guò) Window 2008R2 模板自動(dòng)部署虛擬機(jī)并配置其網(wǎng)絡(luò)。該腳本適用于 XP/2003 以后的 Windows 版本,包括 Windows 2008/Windows 2008 R2/Vista/Win 7 sp1。其中 Windows 2008R2 和 Win7 sp1 的定制需要 vCenter 4.1 update 1。具體 Windows Guest OS 定制化支持請(qǐng)參考 vSphere 相關(guān)文檔。
清單 5. w2k8_deploy.pl
  #!/usr/bin/perl -w
  use strict;
  use warnings;
  use VMware::VIRuntime;
  Opts::parse();
  Opts::validate();
  Util::connect();
  # 部署 Windows 目標(biāo)虛機(jī)并配置網(wǎng)絡(luò)
  deploy_W2K8();
  Util::disconnect();Virt-top documentation
  sub deploy_W2K8 {
  my $vmhost = "9.115.208.49";   # 目標(biāo)虛機(jī)所在 ESX server 的地址
  my $ds = "datastore1";   # 目標(biāo)虛機(jī)所在的 datastore
  my $vm_template = "WIN2K8R2";   # 部署目標(biāo)虛機(jī)用的模板
  my $respool = "ResPool";   # 目標(biāo)虛機(jī)所在的 resource pool
  my $vm_name = "WIN2K8R2A";   # 目標(biāo)虛機(jī)的虛機(jī)名
  # 獲得模板視圖
  my $vm_template_view = Vim::find_entity_view(
  view_type => 'VirtualMachine',
  filter => {name => $vm_template}
  );
  # 獲得 ESX server 視圖
  my $vmhost_view = Vim::find_entity_view(
  view_type => 'HostSystem',
  filter => {name => $vmhost}
  );
  # 獲得 resource pool 視圖
  my $respool_view = Vim::find_entity_view(
  view_type => 'ResourcePool',
  filter => {name => $respool}
  );
  # 獲得 datastore 視圖
  my $ds_view = Vim::find_entity_view(
  view_type => 'Datastore',
  filter => {name => $ds}
  );
  # 目標(biāo)虛機(jī)重定位信息,指定目標(biāo)虛機(jī)的 datastore/host/resource pool
  my $relocate_spec = VirtualMachineRelocateSpec->new(
  datastore => $ds_view,
  host => $vmhost_view,
  pool => $respool_view,
  );
  # 自定義 Guest Windows os 的網(wǎng)絡(luò)配置信息
  # 主機(jī)名 /DNS 域 /IP 地址 / 網(wǎng)關(guān) / 子網(wǎng)掩碼 /DNS 服務(wù)器 / 用戶及組織 / 序列號(hào) / 密碼等
  my $host_name = "WIN2K8R2A";
  my $domain = "cn.ibm.com";
  my $ip_address = "9.115.208.62";
  my @gateway = ("9.115.208.1");
  my $netmask = "255.255.255.0";
  my @dnsServers = ("9.181.2.101", "9.181.2.102");
  my $full_name = "IBMCN";
  my $org_name = "IBMCN";
  my $prod_ID = "";
  my $password = "passw0rd";
  # Windows Guest OS 的定制不需要指定 Global IP 設(shè)置
  my $cust_global_settings = CustomizationGlobalIPSettings->new();
  # 加入 workgroup 組。
  # 若使用域配置,需提供 domainAdmin/domainAdminPassword/joinDomain 參數(shù)
  my $cust_identification = CustomizationIdentification->new(
  joinWorkgroup => "workgroup",
  );
  my $cust_gui_unattended = CustomizationGuiUnattended->new(
  autoLogon => 1,
  autoLogonCount => 1,
  timeZone => 190,
  password => CustomizationPassword->new(
  plainText => "true",
  value => $password
  ),
  );
  my $cust_user_data = CustomizationUserData->new(
  computerName => CustomizationFixedName->new(name => $host_name),
  fullName => $full_name,
  orgName => $org_name,
  productId => $prod_ID,
  );
  my $win_prep = CustomizationSysprep->new(
  guiUnattended => $cust_gui_unattended,
  identification => $cust_identification,
  userData => $cust_user_data,
  );
  my $cust_IP_settings = CustomizationIPSettings->new(
  dnsDomain => $domain,
  dnsServerList => \@dnsServers,
  ip => CustomizationFixedIp->new(ipAddress => $ip_address),
  gateway => \@gateway,
  subnetMask => $netmask,
  );
  my $cust_adapter_mapping = CustomizationAdapterMapping->new(
  adapter => $cust_IP_settings,
  );
  my $cust_adapter_mapping_list = [$cust_adapter_mapping];
  my $cust_spec = CustomizationSpec->new(
  globalIPSettings => $cust_global_settings,
  identity => $win_prep,
  nicSettingMap => $cust_adapter_mapping_list,
  );
  my $clone_spec = VirtualMachineCloneSpec->new(
  powerOn => 1,
  template => 0,
  location => $relocate_spec,
  customization => $cust_spec,
  );
  # 啟動(dòng)任務(wù)
  $vm_template_view->CloneVM_Task(
  folder => $vm_template_view->parent,
  name => $vm_name,
  spec=>$clone_spec
  );
  }
CloneVM_Task 方法執(zhí)行定制化的模板部署,其中 folder 參數(shù)確定目標(biāo)虛機(jī)所在目錄,name 參數(shù)確定目標(biāo)虛機(jī)的虛機(jī)名,VirtualMachineCloneSpec 類型的 spec 參數(shù)用于自定義虛擬機(jī)克隆的過(guò)程(包括虛擬機(jī)硬件配置的定制,Guest OS 定制等 )??梢钥吹角懊娲蠖蔚拇a都是在構(gòu)造 VirtualMachineCloneSpec 對(duì)象。下面的類圖顯示了各定制對(duì)象之間的關(guān)系:
圖 3. VirtualMachineCloneSpec 組成
windows 2003/xp 以及之前的版本的定制化流程稍有不同。主要表現(xiàn)在:
- 構(gòu)造 CustomizationSysprep 時(shí)需要提供 CustomizationLicenseFilePrintData 對(duì)象作為參數(shù)。至于 CustomizationLicenseFilePrintData 對(duì)象的具體構(gòu)造方法,讀者可以參考 vSphere SDK API 在線文檔。
 - 在 vCenter 端需要準(zhǔn)備 sysprep 文件 (vista/2008 之后的 OS 具有內(nèi)置的 sysprep,不再需要在 vCenter 端準(zhǔn)備 )。從 OS 安裝介質(zhì)中找到 DEPLOY.cab,解壓到 vCenter sysprep 的相關(guān) OS 目錄下:
 
- 若 vCenter 安裝在 2003 Server 上,此路徑為:
 
C:\Documents and Settings\All Users\Application Data\VMware\VMware VirtualCenter\sysprep\<os-level>\
- 若 vCenter 安裝在 2008 Server 上,此路徑為:
 
C:\ProgramData\VMware\VMware VirtualCenter\sysprep\<os-level>\
在實(shí)際應(yīng)用中,考慮的代碼的可重用性,比較合適的方法是將需要定制化的參數(shù)放到外部文件中(例如使用 XML 格式進(jìn)行組織 ),以后每次批量部署虛擬機(jī)的時(shí)候只需要改動(dòng)必要部分即可。但是為了突出重點(diǎn),盡可能用簡(jiǎn)單的例子來(lái)說(shuō)明自動(dòng)化配置的邏輯流程,這里仍然把參數(shù)直接寫在配置流程中。
Linux 的定制化過(guò)程和 Windows 大致相同,本文不再贅述。其主要區(qū)別在于構(gòu)造 CustomizationSpec 時(shí)傳入 CustomizationLinuxPrep 對(duì)象作為參數(shù)。CustomizationLinuxPrep 和 CustomizationSysprep 均繼承自 CustomizationIdentitySettings。


















 
 
 







 
 
 
 