使用pyvmomi创建VM使用的API是createVM_Task, 具体使用说明如下:
在ESXi中创建VM一共分为三步:
- 确定VM的创建位置。
- 配置VM的基本配置信息(比如:VM的名字、CPU个数、Memory大小等)。
- 添加初始设备到VM。
- 运行创建VM的函数。
接下来我们一步一步来看怎么实现。
1. 确定VM的创建位置
在vCenter中我们可能需要确定datacenter和host的IP才能确定一个VM的创建位置。但是在ESXi中只有一个host,也只有一个datacenter(ha-datacenter),所以可以直接确定VM的创建位置。
destination_host = content.rootFolder.childEntity[0].hostFolder.childEntity[0].host[0]
# ESXi only 1 datacenter, call 'ha-datacenter'
datacenter_name = 'ha-datacenter'
# get resourcePool managed object
source_pool = destination_host.parent.resourcePool
for child in content.rootFolder.childEntity:
if child.name == self.datacenter_name:
vm_folder = child.vmFolder # child is a datacenter
break
这段代码中destination_host、source_pool和vm_folder都是创建VM要使用的关键参数。
2. 配置VM的基本配置信息
VM所有的配置信息都集中在VirtualMachineConfigSpec(vim.vm.ConfigSpec)这个Object 中。关于这个object的说明可参照pyvmomi的官方文档说明。
可配置项十分的多,这里只列出了必要的几个参数,其他参数可以根据需要自行添加。
"""
datastore_name (str): datastore name
name (str): vm name
cpu_num (int): Number of virtual processors in a virtual machine.
firmware (str): 'efi' or 'bios'
guest_os (str): Short guest operating system identifier.
memory (int): Size of a virtual machine's memory.
"""
config = vim.vm.ConfigSpec()
config.memoryMB = 4 * 1024
config.guestId = 'rhel8_64Guest'
config.name = "test_vm"
config.numCPUs = 4
config.firmware = 'efi'
使用函数vim.vm.ConfigSpec()创建object config,然后根据个人需要对该object进行填充。
3. 添加初始设备到VM
默认使用pyvmomi添加的VM是没有任何设备的,这里根据通过web创建VM时,默认带有的设备进行了添加。
# 1 SCSI Controller
config = add_scsi_controller_to_config(config)
# 1 SATA Controller
config = add_sata_controller_to_config(config)
# 1 USB Controller
config = add_usb_controller_to_config(config)
# 1 network adapter
config = add_nic_to_config(config)
# 1 hard disk
config = add_harddisk_to_config(config)
具体如何添加一个设备到VM,可以参见通过pyvmomi给ESXi现有VM添加一个SCSIcontroller。
唯一不同是这里不用执行WaitForTask(vm.ReconfigVM_Task(spec=spec)),只需要把设备信息添加到config里就可以,在create_vm时会通用进行添加。
创建不同的device的细节不尽相同。但只要掌握了一种添加device的机制,其他device只需要根据不同的情况稍作变化就可以。
4.运行创建VM的函数
完成上面三步就完成了对VM的配置,最后只需一步就可大功告成。
try:
WaitForTask(vm_folder.CreateVm(config, pool=source_pool, host=destination_host))
except Exception as e:
log.error("%sUnknown exception: %s.%s" % (red1, str(e), font))