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

news2024/9/23 5:33:04

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

代码:

from pyVim import connect
from pyVmomi import vim
import ssl


def 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 = None
    total_vm_count = 0

    try:
        # 连接 vCenter Server
        context = ssl.create_default_context()
        context.check_hostname = False
        context.verify_mode = ssl.CERT_NONE
        service_instance = connect.SmartConnect(host=vcenter_ip, user=username, pwd=password, sslContext=context)

        # 获取 ESXi 主机列表
        content = service_instance.RetrieveContent()
        container = content.rootFolder
        viewType = [vim.HostSystem]
        recursive = True

        hosts = content.viewManager.CreateContainerView(container, viewType, recursive)
        for host in hosts.view:
            print("Found ESXi host:", host.name)

            # 获取该主机上的虚拟机列表
            vm_container = host.vm
            for 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 ssl


def 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 main():
    vcenter_ip = '此处省略IP'
    username = '此处省略用户'
    password = '此处省略密码'

    service_instance = None
    total_vm_count = 0
    vm_info_list = []

    try:
        # 建立到 vCenter Server 的连接
        context = ssl.create_default_context()
        context.check_hostname = False
        context.verify_mode = ssl.CERT_NONE
        service_instance = connect.SmartConnect(host=vcenter_ip, user=username, pwd=password, sslContext=context)

        # 获取 vCenter Server 内容
        content = service_instance.RetrieveContent()
        container = content.rootFolder
        viewType = [vim.HostSystem]
        recursive = True

        # 创建主机视图并遍历每个主机
        hosts = content.viewManager.CreateContainerView(container, viewType, recursive)
        for host in hosts.view:
            host_name = host.name

            # 获取该主机上的虚拟机列表
            vm_container = host.vm
            for vm in vm_container:
                vm_name = vm.name
                vm_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.coloradmin.cn/o/1934156.html

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

相关文章

JavaWeb入门程序解析(Spring官方骨架、配置起步依赖、SpringBoot父工程、内嵌Tomcat)

3.3 入门程序解析 关于web开发的基础知识,我们可以告一段落了。下面呢,我们在基于今天的核心技术点SpringBoot快速入门案例进行分析。 3.3.1 Spring官方骨架 之前我们创建的SpringBoot入门案例,是基于Spring官方提供的骨架实现的。 Sprin…

gite+picgo+typora打造个人免费笔记软件

文章目录 1️⃣个人笔记软件2️⃣ 配置教程2.1 使用软件2.2 node 环境配置2.3 软件安装2.4 gite仓库设置2.5 配置picgo2.6 测试检验2.7 github教程 🎡 完结撒花 1️⃣个人笔记软件 最近换了环境,没有之前的生产环境舒适,写笔记也没有劲头&…

R语言实现对模型的参数优化与评价KS曲线、ROC曲线、深度学习模型训练、交叉验证、网格搜索

目录 一、模型性能评估 1、数据预测评估 2、概率预测评估 二、模型参数优化 1、训练集、验证集、测试集的引入 2、k折线交叉验证 2、网格搜索 一、模型性能评估 1、数据预测评估 ### 数据预测评估 #### 加载包,不存在就进行在线下载后加载if(!require(mlben…

VMware Vsphere创建虚拟机

作者:红米 一、上传系统镜像 1、打开数据中心 2、新建文件夹,存放镜像 3、点击上传文件按钮 4、找到本地镜像上传 二、安装虚拟机 1、创建虚拟机 2、选择创建类型 3、为虚拟机命名并选择虚拟机安装的所在位置 4、选择计算资源 5、选择存储 6、选择兼容…

微服务

微服务 SpringCloud的五大组件 eureka服务注册和发现 nacos的工作流程 nacos和eureka的区别 负载均衡 ribbon负载均衡策略 如何自定义负载策略 服务雪崩 服务熔断 为服务端监控 项目中的限流 seata xa模式 AT模式 tcc模式 分布式服务接口幂等 分布式任务调度

2024年CSP-J暑假冲刺训练营(1):分析往年真题

考纲大览 一、往年真题1. 2019-2023 真题2. 整体分析 二、类型分析三、押题 一、往年真题 1. 2019-2023 真题 2. 整体分析 首先大家一定要明确,CSP-J 是不会给大家占便宜的,所以大家可以看到,即使被标注了"入门"难度的题目&#…

【性能测试】第二节.loadrunner工具介绍(LR)

文章目录 前言一、VUG:虚拟用户发生器 1.1 实现作用 1.2 创建一个新的性能测试脚本 1.3 打开LR自带的web系统 1.4 编写性能测试脚本流程方法 1.5 性能测试脚本的增强二、Controller 2.1 基础功能介绍 2.2 Design 2.3 Run三…

<Qt> 信号和槽

目录 一、信号和槽概述 二、信号和槽的使用​​​​​​ (一)connect函数 (二)实现一个点击按钮关闭窗口的功能 (三)再谈connect 三、自定义槽函数 四、自定义信号 五、带参数的信号和槽 六、信号…

Clonezilla 备份还原过程推送日志到 syslog

Clonezilla 备份、还原过程中,系统的运行日志只能显示到客户端显示器上,如果出现错误,无法在服务端查询到对应的日志,一是故障判断不太方便;另一方面,实现日志推送,也可以将 Clonezilla 运行进度…

【前端】ikun-qrcode:极简的二维码生成组件,使用view而非canvas避免层级问题

文章目录 背景ikun-qrcode界面效果如何发布一款自己的插件到uniapp市场。(5分钟搞定) 背景 之前在uniapp上100行搞定二维码生成, 现在封装为vue组件分享出来: 下载地址: https://ext.dcloud.net.cn/plugin?id19351 …

吐血整理如何在Google Earth Engine上写循环 五个代码实例详细拆解

引言 这篇文章主要解答GEE中.map()和.iterate()函数的用法。 首先解答一个疑问,为什么需要自己写循环?确实,GEE 为各种数据类型提供了无数常用的内置函数,对这些方法做排列组合足以应对大多数使用场景,算法效率也颇佳。…

台风预警新选择:太阳能LED宣传信号杆

台风预警新选择:太阳能LED宣传信号杆 以下是对台风灾害的严重性、传统预警方式的不足以及太阳能台风预警宣传信号杆的出现和优势等方面进行分析和归纳: 一、台风灾害的严重性 台风作为一种强烈的自然灾害,给沿海地区带来了极大的威胁。台风…

【数学建模】——【线性规划】及其在资源优化中的应用

目录 线性规划问题的两类主要应用: 线性规划的数学模型的三要素: 线性规划的一般步骤: 例1: 人数选择 例2 :任务分配问题 例3: 饮食问题 线性规划模型 线性规划的模型一般可表示为 线性规划的模型标准型&…

论文学习——基于自适应选择的动态多目标进化优化有效响应策略

论文题目:Effective response strategies based on adaptive selection for dynamic multi-objective evolutionary optimization 基于自适应选择的动态多目标进化优化有效响应策略(Xiaoli Li a,b,c, Anran Cao a,∗, Kang Wang a)Applied S…

活动报名 | 智源研究院数据与行业应用Workshop

7月25日周四下午14点,智源人工智能研究院将联合中国互联网协会人工智能工委会、中国AIIA联盟数据委员会、共同举办数据与行业应用 Workshop~ 届时,智源的技术专家将介绍行业数据集和千万级指令微调数据集的构建思路和获取方法。更有来自北京…

【QGroundControl二次开发】二.使用QT编译QGC(Windows)

【QGroundControl二次开发】一.开发环境准备(Windows) 二. 使用QT编译QGC(Windows) 2.1 打开QT Creator,选择打开项目,打开之前下载的QGC项目源码。 编译器选择Desktop Qt 6.6.3 MSVC2019 64bit。 点击运…

Java项目打包成exe

文章目录 1.使用 exe4j 工具2.导出 jar 包3.转化 1.使用 exe4j 工具 安装激活: https://www.cnblogs.com/jepson6669/p/9211208.html 2.导出 jar 包 使用 mvn 的 package 导出默认没有依赖包,这里从 IDEA 的 Artifacts 导出。 // 导出路径为了方便…

鱼眼相机变普通相机,利用Transform进行球面变换

Abstract 高分辨率广角鱼眼图像在自动驾驶等机器人应用中变得越来越重要。然而,使用普通的卷积神经网络或视觉变换器处理这类数据时会遇到问题,因为在将其投影到平面上的矩形网格时会引入投影和失真损失。为了解决这个问题,我们引入了HEAL-S…

强化学习的数学原理(2)

Value iteration & Policy itreation Value iteration algorithm 之前我们已经讲过怎么去求解贝尔曼最优公式,是利用contraction mapping theorem 来进行求解,我们知道这个contraction mapping theorem是一个迭代算法,实际上这个算法他有…

在mybatis-plus中关于@insert注解自定义批处理sql导致其雪花算法失效而无法自动生成id的解决方法

受到这位作者的启发 > 原文在点这里 为了自己实现批量插入&#xff0c;我在mapper层使用insert注解写了一段自定义sql //自定义的批量插入方法 Insert("<script>" "insert into rpt_material_hour(id,sample_time,rounding_time,cur_month,machine_no…