如何使用Python扩展VMware vCenter现有虚拟机磁盘大小
可行方案说明
你查阅的新版vSphere Automation SDK确实未封装现有虚拟磁盘的直接修改接口,目前用Python完成vCenter虚拟机磁盘扩容的成熟可行方案是基于pyVmomi(vSphere原生Python API绑定)实现,无需删除原有磁盘重建,同时支持关机冷扩容、开机热扩容两种场景。
前置注意事项
- 操作前建议为目标虚拟机创建快照,避免配置异常导致数据丢失
- 开机热扩容需满足:vCenter版本≥6.0、虚拟机操作系统支持磁盘热扩展、磁盘未设置独立持久化之外的特殊模式
- 扩容传入的容量单位为KB,新设置的容量必须大于磁盘现有容量,该API不支持磁盘缩容
- vCenter侧的扩容操作只完成虚拟磁盘块设备的容量调整,操作完成后需要登录虚拟机操作系统内部扩展分区、文件系统,才能正常使用新增容量
实现示例代码
from pyVim.connect import SmartConnectNoSSL, Disconnect from pyVmomi import vim import time def expand_vm_disk(vcenter_host, vcenter_user, vcenter_pwd, vm_name, disk_label, new_total_size_gb): # 建立vCenter连接 si = SmartConnectNoSSL( host=vcenter_host, user=vcenter_user, pwd=vcenter_pwd, port=443 ) content = si.RetrieveContent() # 匹配目标虚拟机 target_vm = None container = content.viewManager.CreateContainerView(content.rootFolder, [vim.VirtualMachine], True) for vm_item in container.view: if vm_item.name == vm_name: target_vm = vm_item break if not target_vm: raise RuntimeError(f"未找到名称为{vm_name}的虚拟机") # 匹配目标虚拟磁盘 target_disk = None for device in target_vm.config.hardware.device: if isinstance(device, vim.vm.device.VirtualDisk) and device.deviceInfo.label == disk_label: target_disk = device break if not target_disk: raise RuntimeError(f"未找到标签为{disk_label}的虚拟磁盘") # 容量单位转换(GB转KB) new_capacity_kb = new_total_size_gb * 1024 * 1024 if new_capacity_kb <= target_disk.capacityInKB: raise RuntimeError("新设置的容量必须大于磁盘现有容量,接口不支持缩容操作") # 构造磁盘编辑配置 disk_change_spec = vim.vm.device.VirtualDeviceSpec() disk_change_spec.operation = vim.vm.device.VirtualDeviceSpec.Operation.edit disk_change_spec.device = target_disk disk_change_spec.device.capacityInKB = new_capacity_kb # 构造虚拟机重配置参数 vm_reconfig_spec = vim.vm.ConfigSpec() vm_reconfig_spec.deviceChange = [disk_change_spec] # 提交扩容任务并等待执行结果 task = target_vm.ReconfigVM_Task(spec=vm_reconfig_spec) while task.info.state not in [vim.TaskInfo.State.success, vim.TaskInfo.State.error]: time.sleep(2) if task.info.state == vim.TaskInfo.State.error: raise RuntimeError(f"磁盘扩容失败: {task.info.error.msg}") print(f"磁盘{disk_label}已成功扩容至{new_total_size_gb}GB") Disconnect(si) # 调用示例 if __name__ == "__main__": expand_vm_disk( vcenter_host="vCenter访问地址", vcenter_user="vCenter管理员账号", vcenter_pwd="vCenter管理员密码", vm_name="待操作的虚拟机名称", disk_label="Hard disk 1", # 磁盘标签可在vCenter虚拟机硬件详情页查看 new_total_size_gb=100 # 此处填写扩容完成后的磁盘总容量,不是新增容量 )
补充说明
- 示例代码中使用
SmartConnectNoSSL跳过了vCenter自签名证书校验,如果你的环境配置了可信SSL证书,替换为SmartConnect方法并传入证书路径即可 - 若虚拟机挂载了多块磁盘,除了通过磁盘标签匹配,也可以通过磁盘对应的SCSI控制器ID、单元号匹配目标磁盘,避免误操作
- 批量扩容场景下,只需要提前整理好虚拟机、磁盘、目标容量的对应关系,遍历执行上述逻辑即可
内容的提问来源于stack exchange,提问作者srinu259
相关产品推荐
相关产品推荐

