使用pyvmomi获取虚拟机bootTime报错及扩展功能咨询
解决PyVmomi获取虚拟机启动时间报错的问题
问题原因
当虚拟机处于关机、挂起等非运行状态时,runtime.bootTime(或summary.runtime.bootTime)属性并不存在,使用collect_properties获取时不会返回该键,直接通过键访问会触发KeyError,导致报错。
修复方案
方案1:使用字典get方法安全获取属性
修改数据处理部分的代码,用get方法获取启动时间,指定默认值避免报错:
processed_data['boottime'] = vm_data.get('runtime.bootTime', 'N/A')
方案2:先判断虚拟机状态再处理
如果需要更精准的逻辑,可先判断虚拟机是否运行,再决定是否获取启动时间:
if vm_data['guest.guestState'] == 'running': processed_data['boottime'] = vm_data.get('runtime.bootTime', 'N/A') else: processed_data['boottime'] = 'VM not running'
方案3:调整属性获取方式(备选)
如果collect_properties获取嵌套属性仍有问题,可改用直接遍历VM对象的方式(参考社区示例逻辑),但效率略低:
# 替换collect_properties部分的代码 vm_list = view.view data = [] for vm in vm_list: processed_data = {} processed_data['name'] = vm.name # 其他属性处理逻辑保持不变 processed_data['cpu_cores'] = vm.config.hardware.numCPU processed_data['memory_MB'] = vm.config.hardware.memoryMB processed_data['os'] = vm.config.guestFullName processed_data['state'] = vm.guest.guestState # 直接访问VM对象的启动时间属性 processed_data['boottime'] = vm.runtime.bootTime if vm.runtime.bootTime else 'N/A' data.append(processed_data)
完整修改后的代码片段(方案1示例)
# Process and filter the fetched data data = [] for vm_data in vm_data_list: processed_data = {} processed_data['name'] = vm_data['name'] ip_addresses = [ip for net in vm_data['guest.net'] for ip in net.ipAddress if net.ipAddress and ':' not in ip and not ip.endswith(('.0', '.1'))] processed_data['ip'] = ", ".join(ip_addresses) processed_data['cpu_cores'] = vm_data['config.hardware.numCPU'] processed_data['memory_MB'] = vm_data['config.hardware.memoryMB'] processed_data['os'] = vm_data['config.guestFullName'] processed_data['state'] = vm_data['guest.guestState'] # 安全获取启动时间,避免KeyError processed_data['boottime'] = vm_data.get('runtime.bootTime', 'N/A') data.append(processed_data)
内容的提问来源于stack exchange,提问作者Hasan
相关产品推荐
相关产品推荐

