如何通过PyVmomi API统计指定时间区间内各VM的快照数量?
使用PyVmomi统计vCenter中近7天创建的虚拟机快照数量
PyVmomi没有提供直接按时间区间过滤快照的API,你需要手动遍历所有虚拟机的快照树,对比快照的创建时间来统计。以下是实现思路和代码示例:
核心思路
- 连接vCenter并获取所有虚拟机对象
- 遍历每个虚拟机的快照树(快照是层级结构,需递归/迭代处理子快照)
- 计算7天前的UTC时间戳,对比每个快照的
createTime属性(该属性为UTC时间) - 统计所有符合时间条件的快照数量
代码实现
from pyVim.connect import SmartConnect, Disconnect from pyVmomi import vim import datetime def count_recent_snapshots(content, days=7): # 计算7天前的UTC时间,避免时区偏差 cutoff_time = datetime.datetime.now(datetime.timezone.utc) - datetime.timedelta(days=days) total_count = 0 # 获取所有虚拟机视图 vm_container = content.viewManager.CreateContainerView( content.rootFolder, [vim.VirtualMachine], recursive=True ) all_vms = vm_container.view vm_container.Destroy() for vm in all_vms: # 跳过无快照的虚拟机 if not vm.snapshot: continue # 递归遍历快照树 def traverse_snaps(snap_nodes): nonlocal total_count for node in snap_nodes: if node.snapshot.createTime >= cutoff_time: total_count += 1 # 处理子快照 if node.childSnapshotList: traverse_snaps(node.childSnapshotList) traverse_snaps(vm.snapshot.rootSnapshotList) return total_count # 连接vCenter(根据实际环境修改参数) vcenter_host = "your-vcenter-address" vcenter_user = "your-account" vcenter_pwd = "your-password" si = SmartConnect( host=vcenter_host, user=vcenter_user, pwd=vcenter_pwd, port=443, disableSslCertValidation=False # 生产环境请保留证书验证,如需禁用请谨慎 ) if not si: print("无法连接到vCenter服务器") exit() content = si.RetrieveContent() recent_snap_count = count_recent_snapshots(content, days=7) print(f"近7天创建的快照总数: {recent_snap_count}") Disconnect(si)
注意事项
- 时区处理:vCenter返回的
createTime是UTC时间,所以计算截止时间时必须使用UTC,否则会出现统计偏差 - 证书验证:生产环境不要禁用证书验证,可通过导入
ssl模块配置信任证书 - 性能优化:如果vCenter中虚拟机数量极多,可考虑添加分页获取或并行处理逻辑,避免API请求过载
内容的提问来源于stack exchange,提问作者Kumar
相关产品推荐
相关产品推荐

