我已经找到了关于如何将磁盘添加到现有虚拟机的pyvmomi示例,但我想自定义虚拟机模板,然后进行克隆。设置CPU和内存非常简单,但在现有模板中添加一个或多个磁盘(除了启动磁盘之外)让我很难
# Add an additional 200 GB disk
new_disk_kb = int(20) * 1024 * 1024
disk_spec = vim.vm.device.VirtualDeviceSpec()
disk_spec.fileOperation = "create"
disk_spec.operation = vim.vm.device.VirtualDeviceSpec.Operation.add
disk_spec.device = vim.vm.device.VirtualDisk()
disk_spec.device.backing = vim.vm.device.VirtualDisk.RawDiskMappingVer1BackingInfo()
disk_spec.device.backing.diskMode = 'persistent'
disk_spec.device.unitNumber = 3
disk_spec.device.capacityInKB = new_disk_kb
# vm configuration
vmconf = vim.vm.ConfigSpec()
vmconf.numCPUs = 8 # change the template's cpus from 4 to 8
vmconf.memoryMB = 16 * 1024 # change the template's memory from 4 GB to 16 GB
# change the template's disks from
# 1 250 GB boot, 1 x 200 GB disk
# to
# 1 250 gB boot, 2 x 200 GB disks
vmconf.deviceChange = [ disk_spec ] # something is not right
clonespec = vim.vm.CloneSpec()
clonespec.location = relospec
clonespec.powerOn = True
clonespec.config = vmconf
clonespec.customization = customspec
task = template.Clone(folder = destfolder, name = vmname, spec = clonespec)
代码在没有vmconf.deviceChange的情况下工作。一旦我尝试添加磁盘,我就会看到错误
Invalid configuration for device '0'.
或
Incompatible device backing specified for device '0'.
这个问题有多个活动部分,包括创建模板、修改模板和克隆VM。
让我们先解决最简单的问题。这部分代码不正确:
new_disk_kb = int(20) * 1024 * 1024
disk_spec = vim.vm.device.VirtualDeviceSpec()
disk_spec.fileOperation = "create"
disk_spec.operation = vim.vm.device.VirtualDeviceSpec.Operation.add
disk_spec.device = vim.vm.device.VirtualDisk()
disk_spec.device.backing = vim.vm.device.VirtualDisk.RawDiskMappingVer1BackingInfo()
disk_spec.device.backing.diskMode = 'persistent'
disk_spec.device.unitNumber = 3
disk_spec.device.capacityInKB = new_disk_kb
在查看了多个pyvmomi
示例脚本后,我可以看到您没有正确设置unitNumber
。根据这些脚本,您需要确定磁盘数量并分配下一个可用的unitNumber
,在您的情况下,我假设它是2
,而不是3
。
下面的代码是从添加原始磁盘到vmpyvmomi
脚本中提取的。
spec = vim.vm.ConfigSpec()
# get all disks on a VM, set unit_number to the next available
unit_number = 0
controller = None
for device in vm.config.hardware.device:
if hasattr(device.backing, 'fileName'):
unit_number = int(device.unitNumber) + 1
# unit_number 7 reserved for scsi controller
if unit_number == 7:
unit_number += 1
if unit_number >= 16:
print("we don't support this many disks")
return -1
if isinstance(device, vim.vm.device.VirtualSCSIController):
controller = device
if controller is None:
print("Disk SCSI controller not found!")
return -1
disk_spec = vim.vm.device.VirtualDeviceSpec()
disk_spec.fileOperation = "create"
disk_spec.operation = vim.vm.device.VirtualDeviceSpec.Operation.add
disk_spec.device = vim.vm.device.VirtualDisk()
rdm_info = vim.vm.device.VirtualDisk.RawDiskMappingVer1BackingInfo()
disk_spec.device.backing = rdm_info
disk_spec.device.backing.compatibilityMode = disk_compatibility_mode
disk_spec.device.backing.diskMode = disk_mode
# The device_name will look something like
# /vmfs/devices/disks/naa.41412340757396001d7710df0fdd22a9
disk_spec.device.backing.deviceName = device_name
disk_spec.device.unitNumber = unit_number
disk_spec.device.controllerKey = controller.key
spec.deviceChange = [disk_spec]
关于你想解决的其他问题。有几个pyvmomi脚本可能很有用。一个特别的例子是克隆虚拟机,它提供了从您试图创建的模板克隆虚拟机的详细信息。
我不确定这个脚本会有多有用,因为看起来你正在寻找一个完整的解决方案来解决你的用例。
我建议您看看这个旧的Github
项目,它有很多用于创建模板、修改模板和克隆VM的有用代码。
关于您关于使用已经有一个磁盘(启动磁盘)的现有模板并在克隆过程中添加辅助磁盘的评论。
根据我对VM文档的解释,我目前认为这是不可能的,原因是什么:
VM模板是虚拟机的主副本映像,其中包括VM磁盘、虚拟设备和设置。此模板可用于VM克隆过程。此模板是静态的,应被视为配置基线。
在克隆过程中无法修改此模板。如果由于任何原因需要修改此静态模板,则需要使用新添加的内容重新创建它。这意味着需要将原始模板转换为VM,需要编辑此VM,然后再转换回新模板。
如果无法做到这一点,您可以在新的虚拟机上克隆基线模板,并使用其中一个pyvmomi
添加磁盘脚本在虚拟机上启用新磁盘。
我不知道你的确切用例,但我认为重新创建模板是合乎逻辑的选择,但你的用例可能更适合在克隆后创建新磁盘。
我之前提到的GitHub项目使用了一个基线模板来克隆VM,它还有一个addDisks
函数。后者用于将新磁盘添加到在克隆过程中创建的虚拟机中。
这是一个较旧的pyvmomi
问题,其中有人想修改与正在克隆的模板相关的磁盘。建议OP在克隆后过程中执行此任务。
GitHub项目展示了如何使用基线模板并根据需要修改VM配置。从代码来看,它似乎是在克隆过程中使用CloneSpec()
来修改VM,而不是在克隆后过程中。
我刚刚在向vm添加RDM磁盘时遇到了这个问题。
问题是:
disk_spec.device.backing=vim.vm.device.VirtualDisk.RawDiskMappingVer1BackingInfo()
你需要为你的规范提供backing.deviceName和backing.lunUuid。之后它就可以工作了。我很有信心,因为我看到了完全相同的错误消息,它为我修复了它。
您可以从host.config.storageDevice.scsiLun获取感兴趣的lun的lun-uuid和deviceName。
您收到的错误似乎表明您需要修复unit_number
。请记住,7是为scsi控制器保留的,16是VMWare支持的最大磁盘数(查看示例代码)。
我不熟悉pyvmomi
工具,但在我看来,磁盘应该连接到控制器。如果没有控制器为单元供电,那么UnitNumber就没有意义。
将虚拟设备与默认设备关联时,控制器的key属性应重置为controllerKey[此处]
你能试试上面的关联吗?(对不起,我不太确定你应该使用vmconf
还是clonespec.config
)
controller = next(
(device for device in vmconf.hardware.device
if isinstance(device, vim.vm.device.VirtualSCSIController)
), None)
disk_spec.device.controllerKey = controller.key
问题似乎出现在代码的以下部分:
# Add an additional 200 GB disk
new_disk_kb = int(20) * 1024 * 1024
disk_spec = vim.vm.device.VirtualDeviceSpec()
disk_spec.fileOperation = "create"
disk_spec.operation = vim.vm.device.VirtualDeviceSpec.Operation.add
disk_spec.device = vim.vm.device.VirtualDisk()
disk_spec.device.backing = vim.vm.device.VirtualDisk.RawDiskMappingVer1BackingInfo()
disk_spec.device.backing.diskMode = 'persistent'
disk_spec.device.unitNumber = 2
disk_spec.device.capacityInKB = new_disk_kb
如果虚拟机已经有一个磁盘,即引导磁盘,那么unitNumber应该从2开始。