通过VMware vCenter 7 REST API导出虚拟机的操作步骤有哪些
VMware vSphere REST API 导出虚拟机操作步骤及示例
以下方案适用于vSphere 7.0及以上版本官方REST API,无需依赖第三方工具包。
前置准备
- 已完成API身份认证,拿到有效的
vmware-api-session-id请求头 - 目标虚拟机处于关机或者挂起状态,运行状态下无法执行导出
- 操作账号对目标VM持有
VirtualMachine.Export权限
核心操作步骤
获取目标虚拟机唯一标识符
从你已实现的VM信息查询接口返回体中提取vm字段值即可,格式通常为vm-xxxx。
2. ### 创建导出下载会话
调用POST /api/vcenter/vm/{vm}/export接口,请求头携带身份session id,可通过请求体自定义导出规则:
示例请求体:
{ "export_options": ["COMPRESS", "INCLUDE_SECURITY_INFORMATION"], "name": "自定义导出任务名称" }
调用成功后会返回sid字段(下载会话ID),同时返回所有待下载的文件列表,包含每个文件的下载路径、文件大小、分片大小参数。
注意:下载会话默认超时时间为5分钟,大文件下载场景下需要每3分钟主动调用
POST /api/vcenter/vm/download-session/{sid}?action=keep-alive接口保活,避免会话失效。
遍历下载所有关联文件
从创建会话返回的files数组中逐一下载文件:
- 每个文件的
download_link字段为直链地址,请求时同样需要携带vmware-api-session-id头 - 大文件可根据返回的
chunk_size参数做分片下载,避免单请求超时 - 下载时建议按返回的
name字段命名本地文件,后续导入时可被直接识别
销毁下载会话
所有文件下载完成后,调用DELETE /api/vcenter/vm/download-session/{sid}接口主动销毁会话,释放vCenter端资源。
极简Python示例片段
import requests import os # 基础配置 VC_HOST = "你的vCenter地址" SESSION_ID = "已获取的身份会话ID" TARGET_VM_ID = "目标虚拟机ID(如vm-1234)" SAVE_PATH = "./vm_export/" os.makedirs(SAVE_PATH, exist_ok=True) HEADERS = { "vmware-api-session-id": SESSION_ID, "Content-Type": "application/json" } # 测试环境关闭SSL校验,生产环境建议删除该行并配置可信证书 requests.packages.urllib3.disable_warnings() # 1. 创建导出会话 create_export_url = f"https://{VC_HOST}/api/vcenter/vm/{TARGET_VM_ID}/export" export_payload = { "export_options": ["COMPRESS"], "name": "test_vm_export" } resp = requests.post(create_export_url, json=export_payload, headers=HEADERS, verify=False) export_info = resp.json() download_sid = export_info["sid"] file_list = export_info["files"] # 2. 逐一下载文件 for file_item in file_list: file_name = file_item["name"] download_url = f"https://{VC_HOST}{file_item['download_link']}" print(f"开始下载:{file_name}") with requests.get(download_url, headers=HEADERS, verify=False, stream=True) as r: r.raise_for_status() with open(f"{SAVE_PATH}/{file_name}", 'wb') as f: for chunk in r.iter_content(chunk_size=8192): f.write(chunk) # 每下载一个文件触发一次保活,避免会话超时 keep_alive_url = f"https://{VC_HOST}/api/vcenter/vm/download-session/{download_sid}?action=keep-alive" requests.post(keep_alive_url, headers=HEADERS, verify=False) # 3. 销毁会话 delete_session_url = f"https://{VC_HOST}/api/vcenter/vm/download-session/{download_sid}" requests.delete(delete_session_url, headers=HEADERS, verify=False)
常见注意事项
- 如使用vSphere 6.7版本,REST API路径略有差异,对应为
/rest/com/vmware/vcenter/vm/{vm}/export,参数格式也存在小调整,优先适配7.0+版本即可 - 单文件超过10G的场景建议开启分片下载,每下载完一个分片主动触发一次保活接口
- 导出的文件默认为OVF格式,包含.ovf描述文件、.vmdk磁盘文件、.mf校验文件三类
内容的提问来源于stack exchange,提问作者user2295457
相关产品推荐
相关产品推荐

