使用Perl進(jìn)行虛擬化環(huán)境的自動化管理和部署
概述
虛擬化作為云計算的基礎(chǔ),是目前一個重要的趨勢。通過虛擬化可以提高 IT 資源和應(yīng)用程序的效率和可用性?;趦?nèi)核的虛擬機(jī) KVM 在 2008 年被 RedHat 收購后,在 IBM 和 RedHat 的聯(lián)合推動下得到了全面的發(fā)展。最新發(fā)布的 RHEL 版本中已經(jīng)全面支持了 KVM 虛擬機(jī),并集成了一整套基于 libvirt 的管理工具 (virsh/virt-top/virt-install/virt-manager 等 )。虛擬化領(lǐng)域的主要廠商 VMware 的 vSphere 虛擬環(huán)境提供的 vSphere Client 讓用戶可通過直觀的圖形化方式管理 vCenter/ESX server/datacenter/cluster/VM 等對象。但是當(dāng)被管理對象數(shù)量龐大時,使用 virt-manager 或者 vSphere Client 的圖形化方式來處理一些日常事務(wù)就顯得費(fèi)時費(fèi)力了。為此用戶可以通過相應(yīng)的 API 來編寫程序管理這些日常事務(wù)。本文將介紹 libvirt API 和 vSphere SDK for Perl 在系統(tǒng)管理方面的應(yīng)用。本文將對于開發(fā)人員、系統(tǒng)管理員、系統(tǒng)測試人員有所幫助。
使用 libvirt 管理 KVM 環(huán)境
libvirt 是一套實現(xiàn) Linux 虛擬化功能的開源 API,旨在提供一種單一的方式管理多種不同的虛擬化方案。目前 libvirt 支持如下的 hypervisor:
- KVM/QEMU
- Xen
- LXC
- OpenVZ
- VirtualBox
- VMware ESX, workstation, player
- Microsoft Hyper-V
伴隨著 libvirt,RHEL 最新的發(fā)行版還包含了一系列基于 libvirt 的工具用于簡化虛擬機(jī)的維護(hù)管理:
- virt-install: 用于創(chuàng)建虛擬機(jī)
- virsh: 交互式/批處理 shell,可以用于完成虛擬環(huán)境的日常管理工作
- virt-manager: 一個圖形化的界面 , 用于 Hypervisor 及其虛擬機(jī)的管理
- virt-clone: 用于虛擬機(jī)克隆
- virt-viewer: 安全連接虛擬機(jī)的圖形控制臺工具
雖然 libvirt 本身由 C 開發(fā) , 它提供了多種主流語言的綁定。系統(tǒng)管理員可以自由選擇他們熟悉的語言,如 Python、Perl、Ruby、Java、PHP 等 .#p#
使用 virsh 管理 KVM 虛擬機(jī)
基于 libvirt 的管理工具中最常用的是 virsh。virsh 命令的格式如下:
virsh [OPTION] COMMAND ARG
在不提供任何參數(shù)時,virsh 提供一個交互式 shell。管理員可以通過 virsh 編寫一些簡單的 shell 腳本完成虛擬機(jī)/網(wǎng)絡(luò)/存儲的配置。下面的代碼片段顯示了 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é)點 (node),每個 guest 被稱為域 (domain) 。#p#
基于 libvirt API 編寫 Perl 腳本
virsh 可以勝任大部分日常的工作,更復(fù)雜的需求可以通過 libvirt API 編程實現(xiàn)。本節(jié)將介紹基于如何使用 libvirt for Perl 來獲得更加精細(xì)的虛擬機(jī)信息。
CPAN 上的 Sys::Virt 模塊即為 libvirt 的 Perl 綁定。首先根據(jù) KVM 環(huán)境中 libvirt 的版本下載、編譯、安裝對應(yīng)的 Sys-Virt 模塊。本文的實驗環(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
下面將通過編寫一個簡單的監(jiān)控程序來介紹 libvirt API 的使用。在生產(chǎn)環(huán)境中,管理員經(jīng)常需要監(jiān)視虛擬機(jī)的 CPU 使用率。如果發(fā)現(xiàn)某些虛擬機(jī)的 CPU 使用率異常,管理員可以提醒虛擬機(jī)的主人或者掛起某些虛擬機(jī)來保證整個虛擬化環(huán)境的正常運(yùn)轉(zhuǎn)。
基于 libvirt 開發(fā)的虛擬機(jī)性能監(jiān)視工具 virt-top 的文檔中提供了一個簡化的實現(xiàn)算法:
- 對虛擬機(jī)的 cpuTime 進(jìn)行周期性采樣。此值可以通過 Sys::Virt::Domain 類的 get_info 方法得到,以納秒為單位,記錄了開機(jī)到目前所經(jīng)過的 CPU 時間
- 假定兩次采樣的實際時間是 t1 和 t2,虛擬機(jī) CPU 運(yùn)行時間為 vt1 和 vt2
- 此虛擬機(jī)的 CPU 使用率可以按下式計算:
%CPU = 100% * (vt2 - vt1) / ((t2-v1) * #_of_cores * 10^9)
上述公式中的采樣實際時間 (t1 和 t2) 可以通過 Perl 標(biāo)準(zhǔn)庫模塊 Time::HiRes 的 gettimeofday 方法獲得。 #_of_cores 表示宿主機(jī)的 CPU 核數(shù)。此參數(shù)可以通過 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 連接對象 my $conn = Sys::Virt->new(address => $uri) or die \ "Cannot connect to the hypervisor: $uri. $!\n"; # 獲得虛擬機(jī)對象 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); # 獲得第一次采樣的實際時間 $start_time = Time::HiRes::gettimeofday(); # 獲得第一次采樣的虛擬機(jī) CPU 時間 $start_vtime = $vm->get_info()->{'cpuTime'}; # 等待下一次采樣 sleep(1); # 獲得第二次采樣的實際時間 $end_time = Time::HiRes::gettimeofday(); # 獲得第二次采樣的虛擬機(jī) CPU 時間 $end_vtime = $vm->get_info()->{'cpuTime'}; # 獲得宿主 CPU 的核數(shù) my $n_cores = $conn->get_node_info()->{'cores'}; # 計算虛擬機(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,因此也可以用來管理 VMware 環(huán)境。但是在這方面 VMware 本身提供的 vSphere SDK 的功能則更具針對性。下面我們將學(xué)習(xí)如何使用 vSphere SDK for Perl 來管理 VMware 虛擬化環(huán)境。
搭建 vSphere SDK for Perl 開發(fā)環(huán)境
可以從 VMware 的官方站點找到最新的 vSphere SDK for Perl。 讀者需要注冊 VMware 帳號,登錄后根據(jù)需要選擇合適的平臺版本下載。
在開始使用 vSphere SDK for Perl 之前,需要確保開發(fā)環(huán)境與 vSphere 之間的連接正常工作。我們可以通過訪問 Managed Object Browser (MOB) 來測試連接狀況:
https://<vCenter_IP>/mob
MOB 是一個基于 Web 的服務(wù)器端 (ESX/vCenter) 程序,用以瀏覽服務(wù)器端各種對象的屬性方法等。如果瀏覽器能正確顯示下面的頁面,則說明開發(fā)環(huán)境與 vSphere 之間的連接正常。
圖 1. 使用 MOB 檢查連接狀態(tài)
確保與 VMware 環(huán)境連接正常后,我們需要安裝 vSphere SDK for Perl。安裝前確保其所依賴的 OpenSSL/LibXML2/e2fsprogs 等工具已經(jīng)安裝。vSphere SDK for Perl 的安裝過程非常簡單,解壓安裝包,執(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 的一些示例程序來測試開發(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>
在本文的實驗環(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 步:
- 驗證命令行參數(shù)
- 連接遠(yuǎn)程服務(wù)器,傳遞參數(shù)
- 執(zhí)行用戶定義操作,如從遠(yuǎn)程服務(wù)器端查詢對象、收集服務(wù)器端對象的信息、獲取或者修改遠(yuǎn)程服務(wù)器端對象狀態(tài)等
- 斷開連接
了解此交互流程將有助于我們理解示例程序的邏輯,更加清晰的組織自己開發(fā)的自動化腳本。下面通過解析一段簡單的代碼來說明這個交互過程。
清單 2. simple_flow.pl
#! /usr/bin/perl -w use strict; use warnings; # 導(dǎo)入 vSphere SDK for Perl 的運(yùn)行支持模塊 # 此模塊用來完成服務(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(); # 驗證命令行參數(shù) Opts::validate(); # 連接遠(yuǎn)程服務(wù)器,vCenter 或 ESX server Util::connect(); # 提取命令行參數(shù) entity 的值 my $entity_type = Opts::get_option('entity'); # 根據(jù) entity 值查詢服務(wù)器端對象, # Vim::find_entity_views 返回服務(wù)器端對象對應(yīng)的 Perl 視圖 my $entity_views = Vim::find_entity_views(view_type=>$entity_type); # 輸出服務(wù)器端對象 Perl 視圖的信息,如類型和名稱等 foreach my $entity_view (@$entity_views) { my $entity_name = $entity_view->name; Util::trace(0, "Found $entity_type: $entity_name\n"); } # 斷開與遠(yuǎn)程服務(wù)器的連接 Util::disconnect();
simple_flow.pl 展示了 vSphere SDK for Perl 腳本的一般結(jié)構(gòu),同時也演示了 Opts 包、Util 包和 Vim 包中一部分常見函數(shù)的用法。simple_flow.pl 在本文的實驗環(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ù)器端對象與 Perl 視圖
用戶編寫 vSphere SDK for Perl 腳本的目的是訪問和修改服務(wù)器端對象,如虛擬機(jī)、集群、快照等。為此我們需要了解 vSphere 服務(wù)器端對象的組織、服務(wù)器端對象與本地 Perl 對象的關(guān)系。
vSphere 服務(wù)器端對象被稱為 managed object。每個 managed object 都具有屬性集 (properties) 并提供相關(guān)服務(wù) (methods)。下圖顯示 managed object 的繼承結(jié)構(gòu)(部分 ):
圖 2. 服務(wù)器端 managed object 繼承結(jié)構(gòu)(部分 )
抽象類 ManagedEntity 為服務(wù)器端對象定義了最基本的屬性集(如 name,parent 等)和方法(如 Reload,Rename_Task 等)。常見的服務(wù)器端對象,如 ResoucePool、HostSystem、Datacenter、VirtualMachine 等都繼承自 ManagedEntity,提供特定的屬性及方法。感興趣的讀者可以通過訪問 MOB 或者 vSphere SDK API 在線參考來深入了解各種 managed object 的細(xì)節(jié)。
vSphere SDK for Perl 可以將服務(wù)器端對象的屬性和方法映射為本地 Perl 對象,即服務(wù)器端對象的本地 Perl 視圖,所以 Perl 視圖可以看作服務(wù)器端對象的本地副本,其屬性和方法和服務(wù)器端對象一一對應(yīng)。不過需要注意的是,服務(wù)器端對象會實時更新,而 Perl 視圖是靜態(tài)的副本,所以當(dāng)需要最新狀態(tài)信息時,用戶必須使用 Vim::update_view_data 顯式刷新 Perl 視圖。
我們通常可以使用 Vim::find_entity_views 和 Vim::find_entity_view 函數(shù)來獲得獲得本地 Perl 視圖(參考 simple_flow.pl 中的示例 )。有時 Vim::find_entity_views 返回結(jié)果過多,而 Vim::find_entity_view 返回的結(jié)果集中的第一個結(jié)果可能并不是我們需要的,此時我們可以使用 filter 參數(shù)細(xì)化查詢條件、控制查詢結(jié)果。下面的代碼片段使用 guestFullName 屬性進(jìn)行過濾,獲得所有 Windows 虛擬機(jī)的視圖:
清單 3. 使用 filter 參數(shù)過濾
... 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ù)腳本時往往只對其中的一部分感興趣。為得到某個屬性值而構(gòu)造完整的 Perl 視圖是非常低效的,為此我們可以通過 properties 參數(shù)來指定 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ī)映像,通過模板來部署虛擬機(jī)可以避免在安裝系統(tǒng)過程中很多重復(fù)操作,極大地提高了效率。但是即使使用模板來部署系統(tǒng),我們?nèi)匀恍枰謩訛楦鱾€虛擬機(jī)完成一些定制性的工作,如配置 IP、主機(jī)名之類。這些定制化工作可以在部署模板時使用 vSphere 提供的 Customization Wizard 或者 Customization Specification 文件來完成。Customization Wizard 以向?qū)У男问阶層脩糨斎胱远x信息,用戶也可以把定制信息保存為 Customization Specification 文件以便以后復(fù)用。對于小規(guī)模的部署,這些工具已經(jīng)足夠。但是當(dāng)規(guī)模變大時,手動輸入、編輯、維護(hù)這些信息也會消耗相當(dāng)多的精力。下面給出的示例代碼將自動化地完成虛擬機(jī)部署以及網(wǎng)絡(luò)配置工作。
w2k8_deploy.pl 演示了如何通過 Window 2008R2 模板自動部署虛擬機(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 定制化支持請參考 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ù)器 / 用戶及組織 / 序列號 / 密碼等 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, ); # 啟動任務(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ī)克隆的過程(包括虛擬機(jī)硬件配置的定制,Guest OS 定制等 )??梢钥吹角懊娲蠖蔚拇a都是在構(gòu)造 VirtualMachineCloneSpec 對象。下面的類圖顯示了各定制對象之間的關(guān)系:
圖 3. VirtualMachineCloneSpec 組成
windows 2003/xp 以及之前的版本的定制化流程稍有不同。主要表現(xiàn)在:
- 構(gòu)造 CustomizationSysprep 時需要提供 CustomizationLicenseFilePrintData 對象作為參數(shù)。至于 CustomizationLicenseFilePrintData 對象的具體構(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>\
在實際應(yīng)用中,考慮的代碼的可重用性,比較合適的方法是將需要定制化的參數(shù)放到外部文件中(例如使用 XML 格式進(jìn)行組織 ),以后每次批量部署虛擬機(jī)的時候只需要改動必要部分即可。但是為了突出重點,盡可能用簡單的例子來說明自動化配置的邏輯流程,這里仍然把參數(shù)直接寫在配置流程中。
Linux 的定制化過程和 Windows 大致相同,本文不再贅述。其主要區(qū)別在于構(gòu)造 CustomizationSpec 時傳入 CustomizationLinuxPrep 對象作為參數(shù)。CustomizationLinuxPrep 和 CustomizationSysprep 均繼承自 CustomizationIdentitySettings。