当前位置: 首页 > news >正文

Python 读取esxi上所有主机的设备信息

(主要是为了统计所有虚拟机的设备名称和所属主机)

代码:

from pyVim import connect
from pyVmomi import vim
import ssldef get_vm_devices(vm):devices = []try:if vm.config is not None and hasattr(vm.config, 'hardware') and hasattr(vm.config.hardware, 'device'):for device in vm.config.hardware.device:if hasattr(device, 'deviceInfo') and hasattr(device.deviceInfo, 'label'):devices.append(device.deviceInfo.label)else:devices.append("Unknown Device")else:print(f"虚拟机 {vm.name} 的配置信息不完整或者设备信息不可用。")except Exception as e:print(f"获取虚拟机 {vm.name} 的设备信息时出现异常: {str(e)}")return devices# def get_vm_host(vm):
#     try:
#         if vm.runtime.host:
#             return vm.runtime.host.name
#         else:
#             return "Unknown Host"
#     except Exception as e:
#         print(f"获取虚拟机 {vm.name} 的所属主机时出现异常: {str(e)}")
#         return "Unknown Host"def main():# 定义 ESXi 主机的连接参数vcenter_ip = ''username = ''password = ''service_instance = Nonetotal_vm_count = 0try:# 连接 vCenter Servercontext = ssl.create_default_context()context.check_hostname = Falsecontext.verify_mode = ssl.CERT_NONEservice_instance = connect.SmartConnect(host=vcenter_ip, user=username, pwd=password, sslContext=context)# 获取 ESXi 主机列表content = service_instance.RetrieveContent()container = content.rootFolderviewType = [vim.HostSystem]recursive = Truehosts = content.viewManager.CreateContainerView(container, viewType, recursive)for host in hosts.view:print("Found ESXi host:", host.name)# 获取该主机上的虚拟机列表vm_container = host.vmfor vm in vm_container:print("  Virtual Machine:", vm.name)total_vm_count += 1# vm_host = get_vm_host(vm)# print("    Host:", vm_host)# 获取虚拟机的设备名称devices = get_vm_devices(vm)print("    Devices:", devices)print()print(f"总数是:{total_vm_count}")except vim.fault.InvalidLogin as e:print("登录失败:", e.msg)except vim.fault.NotFound as e:print("未找到对象:", e.msg)except vim.fault.HostCommunication as e:print("主机通信错误:", e.msg)except ssl.SSLError as e:print("SSL 错误:", e)except Exception as e:print("发生错误:", e)finally:if service_instance:connect.Disconnect(service_instance)if __name__ == "__main__":main()

效果:

代码解释:

gpt是真好用,以下是gpt的解释

包介绍:

  • pyVim 和 pyVmomi 是 VMware 提供的 Python SDK,用于与 vSphere API 进行交互。
  • ssl 用于处理 SSL 连接的配置,这在连接到 vCenter Server 时是必要的。

get_vm_devices(vm)函数:

  • get_vm_devices(vm) 函数用于获取虚拟机 vm 的设备信息列表。
  • 首先检查虚拟机配置的完整性和设备信息的可用性,然后遍历虚拟机的硬件设备列表,并尝试获取每个设备的标签信息 (deviceInfo.label)。
  • 如果设备信息不完整或者出现异常,会打印相应的错误信息,并返回一个包含 "Unknown Device" 的列表。

main()函数:

  • main() 函数是整个程序的入口。
  • 首先定义了连接 vCenter Server 的参数(IP、用户名、密码)。
  • 使用 ssl.create_default_context() 创建一个 SSL 连接的默认上下文,并禁用证书验证,以便连接到 vCenter Server。
  • connect.SmartConnect() 方法建立到 vCenter Server 的连接,并获取一个 service_instance 对象。
  • 使用 service_instance.RetrieveContent() 获取 vCenter Server 内容。
  • 创建一个包含 vim.HostSystem 视图类型的容器视图 hosts,并逐个遍历每个 ESXi 主机。
  • 对于每个主机,获取其上运行的虚拟机列表 (host.vm),并遍历每个虚拟机。
  • 打印每个虚拟机的名称,并调用 get_vm_devices(vm) 函数获取并打印其设备信息。
  • 最后统计并打印总的虚拟机数量 (total_vm_count)。

异常处理:

  • 在 try 块中,对可能发生的异常进行了捕获和处理,包括登录失败、对象未找到、主机通信错误、SSL 错误以及其他异常情况。
  • 在 finally 块中,确保最终关闭 service_instance 的连接,释放资源。

优化

我只需要获取到设备名称和所属主机,硬件信息对于管控来说没什么大用,所以针对此需求进行优化,将所需要的信息保存到json文件中

import json
from pyVim import connect
from pyVmomi import vim
import ssldef get_vm_devices(vm):devices = []try:if vm.config is not None and hasattr(vm.config, 'hardware') and hasattr(vm.config.hardware, 'device'):for device in vm.config.hardware.device:if hasattr(device, 'deviceInfo') and hasattr(device.deviceInfo, 'label'):devices.append(device.deviceInfo.label)else:devices.append("Unknown Device")else:print(f"虚拟机 {vm.name} 的配置信息不完整或者设备信息不可用。")except Exception as e:print(f"获取虚拟机 {vm.name} 的设备信息时出现异常: {str(e)}")return devicesdef main():vcenter_ip = '此处省略IP'username = '此处省略用户'password = '此处省略密码'service_instance = Nonetotal_vm_count = 0vm_info_list = []try:# 建立到 vCenter Server 的连接context = ssl.create_default_context()context.check_hostname = Falsecontext.verify_mode = ssl.CERT_NONEservice_instance = connect.SmartConnect(host=vcenter_ip, user=username, pwd=password, sslContext=context)# 获取 vCenter Server 内容content = service_instance.RetrieveContent()container = content.rootFolderviewType = [vim.HostSystem]recursive = True# 创建主机视图并遍历每个主机hosts = content.viewManager.CreateContainerView(container, viewType, recursive)for host in hosts.view:host_name = host.name# 获取该主机上的虚拟机列表vm_container = host.vmfor vm in vm_container:vm_name = vm.namevm_info = {"虚拟机名称": vm_name,"所属主机": host_name}vm_info_list.append(vm_info)total_vm_count += 1# 获取虚拟机的设备信息devices = get_vm_devices(vm)print(f"    Devices for {vm_name}: {devices}")print(f"所属主机下的虚拟机是: {total_vm_count}")print()print(f"总数是: {total_vm_count}")# 将信息写入 JSON 文件with open('vm_info.json', 'w') as json_file:json.dump(vm_info_list, json_file, indent=4, ensure_ascii=False)print(f"已写入到json文件,数量是 {len(vm_info_list)}")except vim.fault.InvalidLogin as e:print("登录失败:", e.msg)except vim.fault.NotFound as e:print("未找到对象:", e.msg)except vim.fault.HostCommunication as e:print("主机通信错误:", e.msg)except ssl.SSLError as e:print("SSL 错误:", e)except Exception as e:print("发生错误:", e)finally:if service_instance:connect.Disconnect(service_instance)if __name__ == "__main__":main()

优化后得到的json文件部分截图显示如下:

总结

一定要多用gpt,AI智能就是未来大趋势

半吊子都可以适当开发

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Keka for Mac v1.4.3 中文下载 解压/压缩工具
  • 【Arduino IDE】安装及开发环境、ESP32库
  • PF4J+SpringBoot
  • Vscode中Github copilot插件无法使用(出现感叹号)解决方案
  • Vite的WebSocket
  • python的tkinter、socket库开发tcp的客户端和服务端
  • 智慧博物馆的“眼睛”:视频智能监控技术守护文物安全与智能化管理
  • 详细解析Kafaka Streams中各个DSL操作符的用法
  • Hive第三天
  • 单例模式 饿汉式和懒汉式的区别
  • 推荐一款处理TCP数据的架构--EasyTcp4Net
  • JavaScript:移除元素
  • 基于STM32设计的智能门锁(微信小程序+手机APP等多种方式开锁)(188)
  • yarn的安装和配置以及更新总结,npm的对照使用差异
  • 2024最新Cloudways主机使用教程(含最新Cloudways折扣码)
  • SegmentFault for Android 3.0 发布
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • git 常用命令
  • HTTP中的ETag在移动客户端的应用
  • IDEA 插件开发入门教程
  • java8-模拟hadoop
  • laravel with 查询列表限制条数
  • Linux gpio口使用方法
  • magento2项目上线注意事项
  • Material Design
  • Redis的resp协议
  • springMvc学习笔记(2)
  • windows下mongoDB的环境配置
  • 构造函数(constructor)与原型链(prototype)关系
  • 关于Java中分层中遇到的一些问题
  • 聚类分析——Kmeans
  • 前端面试之CSS3新特性
  • 如何用vue打造一个移动端音乐播放器
  • 跳前端坑前,先看看这个!!
  • 学习笔记:对象,原型和继承(1)
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • # linux 中使用 visudo 命令,怎么保存退出?
  • #{} 和 ${}区别
  • #162 (Div. 2)
  • #Datawhale AI夏令营第4期#多模态大模型复盘
  • (1)Hilt的基本概念和使用
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (70min)字节暑假实习二面(已挂)
  • (a /b)*c的值
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (C语言)球球大作战
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (一)Linux+Windows下安装ffmpeg
  • (转)Sql Server 保留几位小数的两种做法
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • **python多态