您如何使用pyvmomi删除虚拟磁盘

问题描述 投票:0回答:2

我正在尝试使用pyvmomi库编写Python程序,以“擦除”与VM关联的虚拟硬盘驱动器。手动完成此操作的方法是删除虚拟磁盘并创建具有相同规格的新虚拟磁盘。我期望我需要对pyvmomi做同样的事情,所以我已经开始了这条路。我的问题是我可以使用ReconfigVM_Task删除虚拟驱动器,但是会留下VMDK文件本身。

我最初尝试使用DeleteVStorageObject_Task(因为不推荐使用DeleteVirtualDisk_Task)来删除虚拟磁盘文件,但这需要我无法在任何地方找到的对象(VMDK文件)的ID。从理论上讲,可以从VirtualDisk属性vDiskId获得,但它为null。在进一步的研究中,似乎仅填充了一流的磁盘。

所以我改为尝试直接使用DeleteDatastoreFile_Task删除VMDK文件,但是当我这样做时,最终在数据存储区中得到一个XXXX-flat.vmdk文件,因此它似乎实际上并未删除该文件。

关于我在这里哪里出错的任何想法,或者如何更好地做到这一点? pyvmomi的VMWare SDK文档正在丢失。

谢谢!

python vmware esxi pyvmomi
2个回答
0
投票

您必须执行ReconfigVM_Task操作。这样做的关键是应该销毁文件操作。这是在UI中执行操作的原始输出:

spec = vim.vm.ConfigSpec()
spec_deviceChange_0 = vim.vm.device.VirtualDeviceSpec()
spec_deviceChange_0.fileOperation = 'destroy'
spec_deviceChange_0.device = vim.vm.device.VirtualDisk()
spec_deviceChange_0.device.shares = vim.SharesInfo()
spec_deviceChange_0.device.shares.shares = 1000
spec_deviceChange_0.device.shares.level = 'normal'
spec_deviceChange_0.device.capacityInBytes = 8589934592
spec_deviceChange_0.device.storageIOAllocation = vim.StorageResourceManager.IOAllocationInfo()
spec_deviceChange_0.device.storageIOAllocation.shares = vim.SharesInfo()
spec_deviceChange_0.device.storageIOAllocation.shares.shares = 1000
spec_deviceChange_0.device.storageIOAllocation.shares.level = 'normal'
spec_deviceChange_0.device.storageIOAllocation.limit = -1
spec_deviceChange_0.device.storageIOAllocation.reservation = 0
spec_deviceChange_0.device.backing = vim.vm.device.VirtualDisk.FlatVer2BackingInfo()
spec_deviceChange_0.device.backing.backingObjectId = ''
spec_deviceChange_0.device.backing.fileName = '[kruddy_2TB_01] web01/web01_2.vmdk'
spec_deviceChange_0.device.backing.split = False
spec_deviceChange_0.device.backing.writeThrough = False
spec_deviceChange_0.device.backing.datastore = search_index.FindByUuid(None, "datastore-14", True, True)
spec_deviceChange_0.device.backing.eagerlyScrub = True
spec_deviceChange_0.device.backing.contentId = 'e26f44020e7897006bec81b1fffffffe'
spec_deviceChange_0.device.backing.thinProvisioned = False
spec_deviceChange_0.device.backing.diskMode = 'persistent'
spec_deviceChange_0.device.backing.digestEnabled = False
spec_deviceChange_0.device.backing.sharing = 'sharingNone'
spec_deviceChange_0.device.backing.uuid = '6000C292-7895-54ee-a55c-49d0036ef1bb'
spec_deviceChange_0.device.controllerKey = 200
spec_deviceChange_0.device.unitNumber = 0
spec_deviceChange_0.device.nativeUnmanagedLinkedClone = False
spec_deviceChange_0.device.capacityInKB = 8388608
spec_deviceChange_0.device.deviceInfo = vim.Description()
spec_deviceChange_0.device.deviceInfo.summary = '8,388,608 KB'
spec_deviceChange_0.device.deviceInfo.label = 'Hard disk 2'
spec_deviceChange_0.device.diskObjectId = '148-3000'
spec_deviceChange_0.device.key = 3000
spec_deviceChange_0.operation = 'remove'
spec.deviceChange = [spec_deviceChange_0]
spec.cpuFeatureMask = []
managedObject.ReconfigVM_Task(spec)  

0
投票

Kyle Ruddy让我指出了正确的方向。这是一个代码片段,显示了我如何使它适合将来的人们搜索有关如何执行此操作的信息:

#Assuming dev is already set to the vim.vm.device.VirtualDisk you want to delete...
virtual_hdd_spec = vim.vm.device.VirtualDeviceSpec()
virtual_hdd_spec.fileOperation = vim.vm.device.VirtualDeviceSpec.FileOperation.destroy
virtual_hdd_spec.operation = vim.vm.device.VirtualDeviceSpec.Operation.remove
virtual_hdd_spec.device = dev
spec = vim.vm.ConfigSpec()
spec.deviceChange = [virtual_hdd_spec]
WaitForTask(vm.ReconfigVM_Task(spec=spec))

API文档位于https://pubs.vmware.com/vi3/sdk/ReferenceGuide/vim.vm.device.VirtualDeviceSpec.html

© www.soinside.com 2019 - 2024. All rights reserved.