Vijava 学习笔记之(Template 克隆虚拟机并指定自定义规范)
哈哈
阅读:822
2021-03-31 22:30:07
评论:0
源代码:
package com.vmware.template;
import com.vmware.util.Session;
import com.vmware.vim25.*;
import com.vmware.vim25.mo.*;
import java.rmi.RemoteException;
/**
* 创建虚拟机使用自定义规范
* @auther 周志刚
* Created by vixuan-008 on 2015/6/4.
*/
public class TemplateCustomzation {
public static void main(String[] args) {
// TODO Auto-generated method stub
// vijava
com.vmware.vim25.mo.VirtualMachine templateVM = null;
com.vmware.vim25.mo.ResourcePool pool = null;
com.vmware.vim25.mo.HostSystem system=null;
com.vmware.vim25.mo.Datastore datastore = null;
ComputeResource computerResource = null;
InventoryNavigator inventoryNavigator = null;
Task task = null;
ServiceInstance instance = null;
String templatename="wintem3";
String poolname="core";
String hostname="";
String virtualmachinename="xuniji5";
String datastorename="local02-2";
long disksizekb=40*1024*1024;
String diskmode="persistent";
// 逻辑处理
try {
// Map map = util.getURL();
String ip = "172.16.1.20";
String username = "root";
String password = "vmware";
instance = Session.getInstance(ip, username, password);
if(instance!=null){
System.out.println("vmware 连接成功");
}else{
System.out.println("vmware 连接失败,请检查vmware连接相关配置信息");
}
Folder rootFolder = instance.getRootFolder();
inventoryNavigator = new InventoryNavigator(rootFolder);
try {
templateVM = (com.vmware.vim25.mo.VirtualMachine) inventoryNavigator
.searchManagedEntity("VirtualMachine", templatename);
if(templateVM!=null){
System.out.println("template 查询成功");
}else{
System.out.println("template 查询失败,请仔细检查配置模板是否存在");
}
} catch (RemoteException e) {
e.printStackTrace();
System.out.println("虚拟机模板文件存在问题:" + e.getMessage());
}
try{
datastore=(com.vmware.vim25.mo.Datastore) inventoryNavigator
.searchManagedEntity("Datastore", datastorename);
}catch (Exception e){
e.printStackTrace();
System.out.println("指定Datastore存在问题:" + e.getMessage());
}
VirtualMachineRelocateSpec virtualMachineRelocateSpec = new VirtualMachineRelocateSpec();
if (null != poolname && !"".equals(poolname)) {
try {
pool = (com.vmware.vim25.mo.ResourcePool) inventoryNavigator
.searchManagedEntity("ResourcePool", poolname);
virtualMachineRelocateSpec.setPool(pool.getMOR());
virtualMachineRelocateSpec.setDatastore(datastore.getMOR());
if(pool!=null){
System.out.println("pool 查询成功");
}else{
System.out.println("pool 查询失败,请仔细检查配置资源池是否存在");
}
} catch (RemoteException e) {
System.out.println("Vcenter资源池存在问题:" + e.getMessage());
}
} else {
try {
computerResource = (ComputeResource) inventoryNavigator.searchManagedEntity("ComputeResource", hostname);
if(computerResource!=null){
if(computerResource.getResourcePool()!=null){
virtualMachineRelocateSpec.setPool(computerResource.getResourcePool().getMOR());
}
virtualMachineRelocateSpec.setDatastore(datastore.getMOR());
virtualMachineRelocateSpec.setHost(computerResource.getHosts()[0].getMOR());
}
} catch (RemoteException e) {
e.printStackTrace();
System.out.println("Vcenter下Esxi存在问题:" + e.getMessage());
}
}
//虚拟机CPU和内存配置信息
VirtualMachineConfigSpec configSpec = new VirtualMachineConfigSpec();
// 设置CPU核数
configSpec.setNumCPUs(4);
// 设置内存大小
long memory=2048;
configSpec.setMemoryMB(memory);
// 设置虚拟机名称
configSpec.setName(virtualmachinename);
// 设置虚拟机描述
configSpec.setAnnotation("VirtualMachine Annotation");
//更改磁盘大小
VirtualDeviceConfigSpec virtualDeviceConfigSpec = new VirtualDeviceConfigSpec();
VirtualDeviceConfigSpec diskSpec = createDiskSpec(
templateVM, "local02-2",
disksizekb, diskmode);
if (diskSpec != null) {
System.out.println("创建disk不为空");
} else {
System.out.println("创建disk为空");
}
VirtualMachineCloneSpec cloneSpec = new VirtualMachineCloneSpec();
cloneSpec.setLocation(virtualMachineRelocateSpec);
cloneSpec.setPowerOn(true);
cloneSpec.setTemplate(false);
cloneSpec.setConfig(configSpec);
//查询用户自定义规范(重点代码(自定义规范中:定义网卡数量和指定IP地址)和其他相关的配置信息)
<span style="color:#ff0000;"> CustomizationSpec customizationSpec=getCustomizationSpec(instance,"windows7");
if(customizationSpec!=null){
cloneSpec.setCustomization(customizationSpec);
}</span>
try {
task = templateVM.cloneVM_Task((Folder) templateVM.getParent(),
virtualmachinename, cloneSpec);
String result = task.waitForTask();
if (result.equals(Task.SUCCESS)) {
System.out.println("模板生成虚拟机成功");
} else {
System.out.println("模板生成虚拟机失败,请查询Vcenter 上相关日志信息");
}
} catch (RemoteException e) {
System.out.println("创建任务失败:" + e.getMessage());
if (instance != null) {
instance.getServerConnection().logout();
System.out.println("存在异常:" + e.getMessage());
}
}
}catch(Exception e){
e.printStackTrace();
}
}
public static VirtualDeviceConfigSpec createDiskSpec(VirtualMachine vm,String dsName,
long diskSizeKB, String diskMode) {
//虚拟磁盘配置信息
VirtualDeviceConfigSpec diskSpec = new VirtualDeviceConfigSpec();
VirtualMachineConfigInfo vmConfig = (VirtualMachineConfigInfo)vm.getConfig();
VirtualDevice[] vds = vmConfig.getHardware().getDevice();
//虚拟磁盘相关操作
diskSpec.setOperation(VirtualDeviceConfigSpecOperation.add);
diskSpec.setFileOperation(VirtualDeviceConfigSpecFileOperation.create);
VirtualDisk vd = new VirtualDisk();
vd.setCapacityInKB(diskSizeKB);
diskSpec.setDevice(vd);
vd.setKey(0);
vd.setUnitNumber(0);
int key = 0;
for(int k=0;k<vds.length;k++)
{
if(vds[k].getDeviceInfo().getLabel().equalsIgnoreCase("SCSI Controller 0"))
{
key = vds[k].getKey();
}
}
vd.setControllerKey(key);
VirtualDiskFlatVer2BackingInfo diskfileBacking = new VirtualDiskFlatVer2BackingInfo();
String fileName = "[" + dsName + "]";
diskfileBacking.setFileName(fileName);
diskfileBacking.setDiskMode(diskMode);
diskfileBacking.setThinProvisioned(true);
vd.setBacking(diskfileBacking);
return diskSpec;
}
//查询用户已经创建的自定义规范
public static CustomizationSpec getCustomizationSpec( ServiceInstance instance,String customizationName){
CustomizationSpec customizationSpec=null;
CustomizationSpecItem customizationSpecItem=null;
com.vmware.vim25.mo.CustomizationSpecManager manager=instance.getCustomizationSpecManager();
CustomizationSpecInfo[] infos=manager.getInfo();
if(infos!=null && infos.length>0){
for(CustomizationSpecInfo info:infos){
if(info.getName().equalsIgnoreCase(customizationName)){
try{
customizationSpecItem=manager.getCustomizationSpec(customizationName);
customizationSpec=customizationSpecItem.getSpec();
}catch (Exception e){
e.printStackTrace();
return customizationSpec;
}
}
}
}
return customizationSpec;
}
}
声明
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。