如何在vCenter中查找未关联磁盘及通过pyVmomi获取VM ID?
问题解决:pyVmomi相关两个问题
一、查找未关联任何VM的磁盘
核心思路是先收集所有已被VM挂载的磁盘路径,再遍历所有数据存储中的VMDK文件,过滤掉已被引用的部分,剩下的就是未关联的磁盘。
步骤及代码示例:
- 收集所有VM已使用的磁盘路径
from pyVmomi import vim # 假设已建立service_instance连接 content = service_instance.RetrieveContent() # 获取所有VM并收集其挂载的磁盘路径 vm_container = content.viewManager.CreateContainerView(content.rootFolder, [vim.VirtualMachine], recursive=True) used_disk_paths = set() for vm in vm_container.view: if not vm.config or not vm.config.hardware: continue for device in vm.config.hardware.device: if isinstance(device, vim.vm.device.VirtualDisk) and device.backing and device.backing.fileName: used_disk_paths.add(device.backing.fileName) vm_container.Destroy()
- 遍历所有数据存储,筛选未被引用的VMDK
# 获取所有数据存储 ds_container = content.viewManager.CreateContainerView(content.rootFolder, [vim.Datastore], recursive=True) unattached_disks = [] for datastore in ds_container.view: browser = datastore.browser # 构建搜索规则,只找.vmdk文件(排除-flat.vmdk这类数据文件,只保留descriptor) search_spec = vim.host.DatastoreBrowserSearchSpec() search_spec.matchPattern = ["*.vmdk"] # 执行搜索并等待结果 search_task = browser.SearchDatastoreSubFolders(datastore.info.url, search_spec) search_result = search_task.wait_for_completion() for folder in search_result: for file_info in folder.file: # 拼接完整磁盘路径 full_path = f"{folder.folderPath}{file_info.path}" # 排除数据文件和已被使用的磁盘 if not file_info.path.endswith("-flat.vmdk") and full_path not in used_disk_paths: unattached_disks.append(full_path) ds_container.Destroy() # 输出结果 for disk in unattached_disks: print(f"未关联磁盘:{disk}")
注意:如果需要排除模板虚拟机的磁盘,可以在收集used_disk_paths时,判断vm.config.template是否为False,只收集非模板VM的磁盘。
二、获取VM的moId(如vm-1210809)
你看到的vm-xxxxxx是VM这个Managed Object的ID(moId),在pyVmomi中可以直接通过实例的_moId属性获取,不需要从repr中提取:
# 假设vm是已获取的VirtualMachine实例 vm_moid = vm._moId print(vm_moid) # 输出类似 vm-1210809
另外,如果你需要的是VM的全局唯一实例UUID(与moId不同),可以用vm.config.instanceUuid。
内容的提问来源于stack exchange,提问作者VagrantPaladin
相关产品推荐
相关产品推荐

