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智能就是未来大趋势

半吊子都可以适当开发

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/45517.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

postgresql简单导出数据与手动本地恢复(小型数据库)

问题 需要每天手动备份postgresql。 步骤 导出数据 /opt/homebrew/opt/postgresql16/bin/pg_dump --file/Users/zhangyalin/backup_sql/<IP地址>_pg-2024_07_15_17_30_15-dump.sql --dbname<数据库名> --username<用户名> --host<IP地址> --port54…

Day53:图论 岛屿数量 岛屿的最大面积

99. 岛屿数量 时间限制&#xff1a;1.000S 空间限制&#xff1a;256MB 题目描述 给定一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的矩阵&#xff0c;你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而成&#xff0c;并且四周…

低空经济持续发热,无人机培训考证就业市场及前景剖析

随着科技的不断进步和社会需求的日益增长&#xff0c;低空经济已成为全球及我国经济增长的新引擎。作为低空经济的重要组成部分&#xff0c;无人机技术因其广泛的应用领域和显著的经济效益&#xff0c;受到了社会各界的广泛关注。为满足市场对无人机人才的需求&#xff0c;无人…

深入剖析 Android 开源库 EventBus 的源码详解

文章目录 前言一、EventBus 简介EventBus 三要素EventBus 线程模型 二、EventBus 使用1.添加依赖2.EventBus 基本使用2.1 定义事件类2.2 注册 EventBus2.3 EventBus 发起通知 三、EventBus 源码详解1.Subscribe 注解2.注册事件订阅方法2.1 EventBus 实例2.2 EventBus 注册2.2.1…

ipynb转换为pdf、Markdown(.md)

Jupyter Notebook 文件&#xff08;.ipynb&#xff09;可以转换成多种数据格式&#xff0c;以适应不同的使用场景和需求。以下是几种常见的转换格式及其简洁描述&#xff1a; HTML: Jupyter Notebook可以直接导出为静态的网页&#xff08;HTML&#xff09;格式&#xff0c;这样…

记一次IP数据处理过程,文本(CSV文件)处理,IP解析

个人博客&#xff1a;无奈何杨&#xff08;wnhyang&#xff09; 个人语雀&#xff1a;wnhyang 共享语雀&#xff1a;在线知识共享 Github&#xff1a;wnhyang - Overview 起因 突然接收到XX给的任务&#xff0c;要将一批IP数据处理一下&#xff0c;将IP对应的省市区解析出来…

PHP智云物业管理平台微信小程序系统源码

​&#x1f3e0;智云物业管理新纪元&#xff01;微信小程序&#xff0c;让家园管理更智慧&#x1f4f1; &#x1f3e1;【开篇&#xff1a;智慧生活&#xff0c;从物业开始】&#x1f3e1; 在快节奏的现代生活中&#xff0c;我们追求的不仅仅是家的温馨&#xff0c;更是生活的…

基于hive数据库的泰坦尼克号幸存者数据分析

进入 ./beeline -u jdbc:hive2://node2:10000 -n root -p 查询 SHOW TABLES; 删除 DROP TABLE IF EXISTS tidanic; 上传数据 hdfs dfs -put train.csv /user/hive/warehouse/mytrain.db/tidanic 《泰坦尼克号幸存者数据分析》 1、原始数据介绍 泰坦尼克号是当时世界上…

达梦数据库系列—28. 主备集群高可用测试

目录 监视器关闭 监视器启动&#xff0c;Detach备库 主备正常&#xff0c;手动switchover 主库故障&#xff0c;自动switchover 主库故障&#xff0c;手动Takeover 主库故障&#xff0c;备库强制takeover 主库重启 备库故障 公网连接异常 主库私网异常 备库私网异常…

实现给Nginx的指定网站开启basic认证——http基本认证

一、问题描述 目前我们配置的网站内容都是没有限制&#xff0c;可以让任何人打开浏览器都能够访问&#xff0c;这样就会存在一个问题&#xff08;可能会存在一些恶意访问的用户进行恶意操作&#xff0c;直接访问到我们的敏感后台路径进行操作&#xff0c;风险就会很大&#xff…

Why can‘t I access GPT-4 models via API, although GPT-3.5 models work?

题意&#xff1a;为什么我无法通过API访问GPT-4模型&#xff0c;尽管GPT-3.5模型可以工作&#xff1f; 问题背景&#xff1a; Im able to use the gpt-3.5-turbo-0301 model to access the ChatGPT API, but not any of the gpt-4 models. Here is the code I am using to tes…

【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【22】【RabbitMQ】

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【22】【RabbitMQ】 Message Queue 消息队列异步处理应用解耦流量控制 消息中间件概念RabbitMQ概念MessagePublisherExchangeQueueBindingConnectionChannelConsumerVirtual HostBroker图…

Django prefetch_related()方法

prefetch_related的作用 prefetch_related()是 Django ORM 中用于优化查询性能的另一个重要方法&#xff0c;尤其在处理多对多&#xff08;ManyToMany&#xff09;关系和反向关系时非常有用。它允许你预加载相关对象&#xff0c;从而减少数据库查询次数。 1&#xff0c;创建应…

【香橙派】Orange pi AIpro开发板使用之一键部署springboot项目

前言 最近有幸收到一份新款 OrangePi AIpro 开发板&#xff0c;之前手里也捣鼓过一些板子&#xff0c;这次尝试从零开始部署一个简单的后端服务。OrangePi AIpro 采用昇腾AI技术路线&#xff0c;具体为4核64位处理器AI处理器&#xff0c;可配16GB内存容量&#xff0c;各种复杂应…

数字化赋能,加油小程序让出行更便捷高效

在快节奏的现代生活中&#xff0c;每一次加油不仅是车辆续航的必要步骤&#xff0c;也成为了人们日常生活中不可或缺的一环。随着科技的飞速发展&#xff0c;传统加油模式正逐步向智能化、便捷化转型&#xff0c;其中&#xff0c;加油小程序作为这股浪潮中的佼佼者&#xff0c;…

el-date-picker手动输入日期,通过设置开始时间和阶段自动填写结束时间

需求&#xff1a;根据开始时间&#xff0c;通过填写阶段时长&#xff0c;自动填写结束时间&#xff0c;同时开始时间和节数时间可以手动输入 代码如下&#xff1a; <el-form ref"ruleForm2" :rules"rules2" :model"formData" inline label-po…

yolov5 上手

0 介绍 YOLO(You Only Look Once)是一种流行的物体检测和图像分割模型&#xff0c;由华盛顿大学的约瑟夫-雷德蒙&#xff08;Joseph Redmon&#xff09;和阿里-法哈迪&#xff08;Ali Farhadi&#xff09;开发。YOLO 于 2015 年推出&#xff0c;因其高速度和高精确度而迅速受到…

人工智能算法工程师(中级)课程13-神经网络的优化与设计之梯度问题及优化与代码详解

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能算法工程师(中级)课程13-神经网络的优化与设计之梯度问题及优化与代码详解。 文章目录 一、引言二、梯度问题1. 梯度爆炸梯度爆炸的概念梯度爆炸的原因梯度爆炸的解决方案 2. 梯度消失梯度消失的概念梯度…

powerdesigner导出表数据库设计文档excel

1、连接数据库&#xff0c;导出表结构的sql脚本 2、打开powerdesigner&#xff0c;生成项目空间表 sql脚本用第一步的脚本 3、用script脚本生成excel 脚本信息 Option Explicit Dim rowsNum rowsNum 0 -------------------------------------------------------------…

CV12_ONNX转RKNN模型(谛听盒子)

暂时简单整理一下&#xff1a; 1.在边缘设备上配置相关环境。 2.配置完成后&#xff0c;获取模型中间的输入输出结果&#xff0c;保存为npy格式。 3.将onnx格式的模型&#xff0c;以及中间输入输出文件传送到边缘设备上。 4.编写一个python文件用于转换模型格式&#xff0c…