<p>这个问题有多个移动部分,包括创建模板、修改模板和克隆VM</p>
<p>让我们先解决最简单的问题。这部分代码不正确:</p>
<pre><code>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
</code></pre>
<p>在查看了多个<code>pyvmomi</code>示例脚本之后,我发现您没有正确设置<code>unitNumber</code>。根据这些脚本,您需要确定磁盘的数量,并分配下一个可用的<code>unitNumber</code>,在您的情况下,我假设它是<code>2</code>,而不是<code>3</code></p>
<p>下面的代码是从<a href="https://github.com/vmware/pyvmomi-community-samples/blob/889a2fadcb24e6b1bc1e30caab66f1a41a950988/samples/add_raw_disk_to_vm.py" rel="nofollow noreferrer">add raw disk to vm</a>{<cd1>}脚本中提取的</p>
<pre><code>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]
</code></pre>
<p>关于你想解决的其他问题。有几个<a href="https://github.com/vmware/pyvmomi-community-samples/tree/master/samples" rel="nofollow noreferrer">pyvmomi script</a>可能是有用的。特别是<a href="https://github.com/vmware/pyvmomi-community-samples/blob/master/samples/clone_vm.py" rel="nofollow noreferrer">Clone VM</a>,它提供了从您试图创建的模板克隆VM的详细信息</p>
<p>我不确定这个脚本有多有用,因为看起来您正在寻找一个完整的解决方案来解决您的用例</p>
<p>我建议看一下这个旧的<code>Github</code>{a4},它有很多有用的代码用于创建模板、修改模板和克隆VM</p>
<p>关于您对使用已有一个磁盘(启动磁盘)的现有模板以及在克隆过程中添加辅助磁盘的评论</p>
<p>根据我对VM文档的解释,我目前认为这是不可能的,原因何在:</p>
<ol>
<li><p>VM模板是虚拟机的主副本映像,其中包括VM磁盘、虚拟设备和设置。此模板可用于VM克隆过程。此模板是静态的,应视为配置基线</p>
</li>
<li><p>在克隆过程中无法修改此模板。若出于任何原因需要修改此静态模板,则需要使用新添加的内容重新创建它。这意味着需要将原始模板转换为VM,需要编辑此VM,然后再转换回新模板</p>
</li>
</ol>
<p>如果不可能,您可以在新VM上克隆基线模板,并使用<code>pyvmomi</code>添加磁盘<a href="https://github.com/vmware/pyvmomi-community-samples/tree/master/samples" rel="nofollow noreferrer">scripts</a>中的一个来启用VM上的新磁盘</p>
<p>我不知道您的具体用例,但我认为重新创建模板是合乎逻辑的选择,但是您的用例在克隆后创建新磁盘可能会更好</p>
<p>我前面提到的GitHub项目使用一个基线模板来克隆VM,并且它还有一个<code>addDisks</code>函数。后者用于向克隆过程中创建的VM添加新磁盘</p>
<p>下面是一个较旧的<code>pyvmomi</code>{a6},其中有人想修改与正在克隆的模板相关的磁盘。建议OP在克隆后过程中执行此任务</p>
<p>GitHub项目展示了如何使用基线模板并根据需要修改VMs配置。从代码来看,它似乎是在克隆过程中使用<code>CloneSpec()</code>修改VM,而不是在克隆后过程中</p>