python - 从模板克隆时如何将磁盘添加到 VM?

标签 python vsphere

我找到了有关如何将磁盘添加到现有 VM 的 pyvmomi 示例,但我想自定义 VM 模板,然后进行克隆。设置 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.

以下代码摘自 add raw disk to vm pyvmomi 脚本。

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 script这可能会有用。特别是 Clone VM ,它提供了有关从您尝试创建的模板克隆 VM 的详细信息。

我不确定该脚本会有多大用处,因为您似乎正在寻找一个完整的解决方案来解决您的用例。

我建议查看这个旧的 Github project ,其中包含许多用于创建模板、修改模板和克隆 VM 的有用代码。

关于您对使用已有一个磁盘(引导磁盘)并在克隆过程中添加辅助磁盘的现有模板的评论。

根据我对 VM 文档的解释,我目前认为这是不可能的,原因如下:

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

  2. 此模板在克隆过程中无法修改。如果出于任何原因需要修改此静态模板,则需要使用新添加的内容重新创建它。这意味着需要将原始模板转换为 VM,需要编辑此 VM,然后再转换回新模板。

如果这不可能,您可以在新 VM 上克隆基线模板并使用 pyvmomi 添加磁盘之一 scripts在您的 VM 上启用新磁盘。

我不知道您的确切用例,但我认为重新创建模板是合乎逻辑的选择,但您的用例可能更适合在克隆后创建新磁盘。

我之前提到的那个 GitHub 项目使用基准模板克隆虚拟机,它还有一个 addDisks 函数。后者用于将新磁盘添加到在克隆过程中创建的 VM。

这是一个较旧的 pyvmomi issue有人想修改与正在克隆的模板相关的磁盘。建议 OP 在克隆后过程中执行此任务。

该 GitHub 项目展示了如何使用基线模板并根据需要修改虚拟机配置。从代码来看,它似乎是在克隆过程中使用 CloneSpec() 来修改 VM,而不是在克隆后过程中。

关于python - 从模板克隆时如何将磁盘添加到 VM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68537695/

相关文章:

Python:如何计算年份之间按月产生的收入?

python - 无法通过 HTML 表单在 Django 中上传文件并且发布时无法在表单中设置值

python - BeautifulSoup 查找有条件的结果

python - Pandas:如果在循环内则滚动计数

python - 是否可以使用 Google Cloud Storage 创建自定义 channel ?

java - 是否有 API 可将 vSphere JSON 结果映射到适当的 Java 对象?

docker - vmwarevsphere上的Windows docker

python - vSphere 中的虚拟交换机保存在哪里? (通过 pyVmomi)

c# - vsphere api 更改虚拟机的 IP 地址

java - 在 vCenter 8.0 上部署 vSphere 客户端插件失败