虛擬化應(yīng)用(二)管理 vCenter Server 實(shí)體
正如企業(yè)中有多個(gè)管理部門(mén)一樣,在一個(gè)虛擬化系統(tǒng)中也分為若干個(gè)實(shí)體。
測(cè)試環(huán)境:
Windows Server 2008 R2 DataCenter
VMWare Workstation 7.1
VMWare vSphere 4.1、VMWare
vCenter Server 4.1
JDK 1.6 u-21 x64、Eclipse For
JavaEE 3.6 x64
VMWare vSphere Java API 2.1 GA、VMWare
vSphere PowerCLI 4.1(PowerShell 2.0)
PowerGUI Script Editor Free Edition x64
在VMWare vCenter Server中,其實(shí)體結(jié)構(gòu)如下:
處于最頂層的是一個(gè)服務(wù)實(shí)例對(duì)象,可以簡(jiǎn)單的認(rèn)為是一個(gè)虛擬服務(wù)器。下一級(jí)是根目錄,是一個(gè)容器對(duì)象;第三層中的Datacenter并不是物理服務(wù)器中的Datacenter,只是一個(gè)管理單元,可以是Folder、Datacenter或二者的混合體;
再往下又細(xì)分為虛擬機(jī)和計(jì)算機(jī)資源等。實(shí)體的種類(lèi)很多,除了Folder、Datacenter,還有VirtualMachine、ComputerResource、ClusterComputerResource、ResourcePool和HostSystem。本次我們只關(guān)注Folder和Datacenter,后續(xù)篇章再學(xué)習(xí)其他實(shí)體。
安裝好VMWare vCenter Server,使用vClient登錄后可以看到這些實(shí)體結(jié)構(gòu):
在GUI中可以方便的對(duì)實(shí)體結(jié)構(gòu)進(jìn)行管理,如新建、修改、移動(dòng)、刪除文件夾、數(shù)據(jù)中心等。但是,有時(shí)管理員需要同時(shí)管理大量的虛擬機(jī),這就需要用程序來(lái)自動(dòng)化管理了。2010.8.25官方放出了vSphere Java API 2.1 GA,這次版本全面支持了前不久發(fā)布的vSphere 4.1,修復(fù)了一些bug:(英文原文)
Bug Fixes
3049871 Missing SetPublicKey in ExtensionManager
3040909 getProfile in HostProfilesManager throws a classcastexceptio
3042149 match version in SessionManager.cloneSession() method
3042167 xml characters not escaped (partial fix with password which is more likely to contain special chars)
同時(shí)也放出了vSphere Java API 3.0的開(kāi)發(fā)計(jì)劃,代碼代號(hào)"Crescendo"(逐漸增強(qiáng)),具體細(xì)節(jié)在這篇博客查看。
一、下面開(kāi)始用程序來(lái)管理vCenter Server中的部分實(shí)體。
- 新建一個(gè)Java項(xiàng)目,添加vSphere Java API 2.1 GA的Jar包:
建議將源代碼添加進(jìn)Eclipse,可以隨時(shí)查看指定方法或類(lèi)的源代碼:
- 管理實(shí)體:
代碼import java.net.MalformedURLException;
import java.net.URL;
import java.rmi.RemoteException;
import com.vmware.vim25.mo.Folder;
import com.vmware.vim25.mo.ManagedEntity;
import com.vmware.vim25.mo.SearchIndex;
import com.vmware.vim25.mo.ServiceInstance;
import com.vmware.vim25.mo.Task;
public class EntityManage {
/**
* @param args
* @throws MalformedURLException
* @throws RemoteException
*/
private static void fnAddEntity(URL v_Url, String v_strUserName,
String v_strUserPass) {
try {
ServiceInstance si = new ServiceInstance(v_Url, v_strUserName,
v_strUserPass, true);
Folder rootFolder = si.getRootFolder();
Folder secFolder = rootFolder.createFolder("cnBlogs");
secFolder.createDatacenter("HomePage");
secFolder.createDatacenter("News");
secFolder.createDatacenter("Blogs");
secFolder.createDatacenter("BBS");
secFolder.createDatacenter("Attention");
si.getServerConnection().logout();
System.out.println("添加實(shí)體成功!");
} catch (Exception ex) {
ex.printStackTrace();
}
}
private static void fnDeleteEntity(URL v_Url, String v_strUserName,
String v_strUserPass) {
try {
ServiceInstance si = new ServiceInstance(v_Url, v_strUserName,
v_strUserPass, true);
Folder rootFolder = si.getRootFolder();
ManagedEntity[] mes = rootFolder.getChildEntity();
for (int i = 0; mes != null && i < mes.length; i++) {
if ("cnBlogs".equals(mes[i].getName())) {
mes[i].destroy_Task();
}
if ("HomePage".equals(mes[i].getName())) {
mes[i].destroy_Task();
}
if ("News".equals(mes[i].getName())) {
mes[i].destroy_Task();
}
if ("Blogs".equals(mes[i].getName())) {
mes[i].destroy_Task();
}
if ("BBS".equals(mes[i].getName())) {
mes[i].destroy_Task();
}
if ("Attention".equals(mes[i].getName())) {
mes[i].destroy_Task();
}
}
si.getServerConnection().logout();
System.out.println("刪除實(shí)體成功!");
} catch (Exception ex) {
ex.printStackTrace();
}
}
private static void fnMoveEntity(URL v_Url, String v_strUserName,
String v_strUserPass) {
try {
ServiceInstance si = new ServiceInstance(v_Url, v_strUserName,
v_strUserPass, true);
Folder rootFolder = si.getRootFolder();
SearchIndex index = si.getSearchIndex();
rootFolder.createFolder("Folder1");
Folder folder2 = rootFolder.createFolder("Folder2");
ManagedEntity me = index.findByInventoryPath("Folder1");
folder2.moveIntoFolder_Task(new ManagedEntity[] { me });
System.out.println("移動(dòng)實(shí)體成功!");
} catch (Exception ex) {
ex.printStackTrace();
}
}
private static void fnRenameEntity(URL v_Url, String v_strUserName,
String v_strUserPass) {
try {
ServiceInstance si = new ServiceInstance(v_Url, v_strUserName,
v_strUserPass, true);
Folder rootFolder = si.getRootFolder();
Folder folder1 = rootFolder.createFolder("Folder1");
Task task = folder1.rename_Task("Folder2");
if (task.waitForTask() == Task.SUCCESS) {
System.out.println("重命名實(shí)體成功!");
} else {
System.out.println("重命名實(shí)體失敗!");
}
si.getServerConnection().logout();
} catch (Exception ex) {
ex.printStackTrace();
}
}
public static void main(String[] args) throws MalformedURLException {
// TODO Auto-generated method stub
fnAddEntity(new URL(args[0]), args[1], args[2]);
fnRenameEntity(new URL(args[0]), args[1], args[2]);
fnMoveEntity(new URL(args[0]), args[1], args[2]);
fnDeleteEntity(new URL(args[0]), args[1], args[2]);
}
}
配置下命令行參數(shù):
二、使用PowerShell來(lái)管理實(shí)體。
vSphere PowerCLI提供了豐富的命令,今天偶然在網(wǎng)上找到一個(gè)PDF,還不錯(cuò):
將PowerShell按不同類(lèi)別進(jìn)行了分類(lèi),非常便于查找、使用,注意這是2009年7月14日官方發(fā)布的,最新版中可能有部分改動(dòng),請(qǐng)參照最新官方文檔。
2.1、管理Folder。
2.1.1、如果你還沒(méi)有添加PSSnapin,則先進(jìn)行添加:
Add-PSSnapin VMWare.VimAutomation.Core
2.1.2、連接vCenter Server:
Connect-VIServer -Server 192.168.220.1 -Protocol https -Port 444 -User BrooksPC\Administrator -Password ****** -Credential False(請(qǐng)用你的vCenter Server的IP、端口號(hào)、用戶(hù)名、密碼進(jìn)行替換):
運(yùn)行結(jié)果:
2.1.3、獲取根目錄:
Get-Folder –NoRecursion
運(yùn)行結(jié)果:
2.1.4、在根目錄中新建一個(gè)Folder:
New-Folder -Name Folder0 -Location Brooks
運(yùn)行結(jié)果:
2.1.5、重命名Folder:
Set-Folder -Folder Folder0 -Name Folder2
運(yùn)行結(jié)果:
這個(gè)命令有點(diǎn)不太完善,未能提供根據(jù)路徑定位到具體Folder的方法,若有Folder重名,但位于不同F(xiàn)older中,則該命令會(huì)失敗。
2.1.6、移動(dòng)Folder:
Move-Folder -Folder Folder2 -Destination cnBlogs
運(yùn)行結(jié)果:
2.1.6、刪除Folder:
刪除時(shí)會(huì)提示確認(rèn),這里居然沒(méi)有提供不確認(rèn)的參數(shù),難以批量刪除。
2.1.7、獲取所有Datacenter:
Get-Datacenter
運(yùn)行結(jié)果:
2.1.8、創(chuàng)建一個(gè)Datacenter:
New-Datacenter -Name dc1 -Location cnBlogs
運(yùn)行結(jié)果:
2.1.9、重命名Datacenter:
Set-Datacenter -Name dc2 -Datacenter dc1
注意-Name是修改后的名字。
運(yùn)行結(jié)果:
2.1.10、移動(dòng)Datacenter時(shí)有點(diǎn)問(wèn)題,遇到一個(gè)錯(cuò)誤,若有朋友知道解決方法,請(qǐng)指教:
Move-Datacenter -Datacenter dc2 -Destination cnBlogs
2.1.11、刪除Datacenter:
Remove-Datacenter -Datacenter dc2
運(yùn)行結(jié)果:
依然會(huì)先提示確認(rèn)。
小結(jié)
本次我們熟悉了下vCenter Server中的實(shí)體架構(gòu),能夠使用其對(duì)象模型和PowerShell腳本進(jìn)行簡(jiǎn)單的管理,可以看到,腳本管理非常高效。其實(shí)除了VMWare vSphere,Hyper-V、思捷的Xen Server均提供了PowerShell的擴(kuò)展,后續(xù)篇章會(huì)繼續(xù)深入學(xué)習(xí)ESX和vCenter Server,以及PowerShell在虛擬化管理中的應(yīng)用。


浙公網(wǎng)安備 33010602011771號(hào)