如何在从模板进行克隆时将磁盘添加到VM

  • 本文关键字:磁盘 添加 VM python vsphere
  • 更新时间 :
  • 英文 :


我已经找到了关于如何将磁盘添加到现有虚拟机的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文档的解释,我目前认为这是不可能的,原因是什么:

  1. VM模板是虚拟机的主副本映像,其中包括VM磁盘、虚拟设备和设置。此模板可用于VM克隆过程。此模板是静态的,应被视为配置基线。

  2. 在克隆过程中无法修改此模板。如果由于任何原因需要修改此静态模板,则需要使用新添加的内容重新创建它。这意味着需要将原始模板转换为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开始。

最新更新