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

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

代码:

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

半吊子都可以适当开发

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI安全系列——[第五空间 2022]AI(持续更新)

最近很长时间没有更新,其实一直在学习AI安全,我原以为学完深度学习之后再学AI安全会更加简单些,但是事实证明理论转实践还是挺困难的,但是请你一定要坚持下去,因为“不是所有的坚持都有结果,但总有一些坚持…

Mac电脑清理软件有哪些 MacBooster和CleanMyMac哪个好用 苹果电脑清理垃圾软件推荐 cleanmymac和柠檬清理

对于苹果电脑用户来说,‌选择合适的清理软件可以帮助优化电脑性能,‌释放存储空间,‌并确保系统安全。一款好用的苹果电脑清理软件,能让Mac系统保持良好的运行状态,避免系统和应用程序卡顿的产生。有关Mac电脑清理软件…

CSS-1_0 CSS和文档流

文章目录 CSS和文档流如何证明这个流的存在呢?流和display番外:inline-block 碎碎念 CSS和文档流 首先什么叫流呢? 通常来说,我们最终看到的网页是HTML文档中定义的各个元素挨个输出的结果,这种一个接一个输出的方式…

14_Shell重定向输入输出

14_Shell重定向输入输出 输出重定向:一般情况,输出是在终端直接显示,改变输出位置,改变到文件中,这就是输出重定向 输入重定向:一般情况,输入是读取用户终端输入,改变输入位置&#…

Java二十三种设计模式-建造者模式(4/23)

建造者模式:构建复杂对象的专家 引言 建造者模式(Builder Pattern)是一种创建型设计模式,用于创建一个复杂的对象,同时允许用户只通过指定复杂对象的类型和内容就能构建它们,它将对象的构建和表示分离&am…

Spring Boot 集成 RabbitMQ

依赖与配置 在 pom.xml 中引入 RabbitMQ 相关依赖 <!-- AMQP 依赖, RabbitMq --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId><version>3.2.7</version> &…

详解注意力机制上篇【RNN,Seq2Seq(Encoder-Decoder,编码器-解码器)等基础知识】

NLP-大语言模型学习系列目录 一、注意力机制基础——RNN,Seq2Seq等基础知识 二、注意力机制【Self-Attention,自注意力模型】 &#x1f525; 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;理解和生成自然语言的能力对于构建智能系统至关重要。从文本分类、机器翻…

昇思25天学习打卡营第22天|基于MindSpore的红酒分类实验

基于MindSpore的红酒分类实验 K近邻算法实现红酒聚类 1、实验目的 了解KNN的基本概念&#xff1b;了解如何使用MindSpore进行KNN实验。 2、K近邻算法原理介绍 K近邻算法&#xff08;K-Nearest-Neighbor, KNN&#xff09;是一种用于分类和回归的非参数统计方法&#xff0c;…

WSL-Ubuntu20.04环境使用YOLOv8 TensorRT推理加速

在阅读本章内容之前&#xff0c;需要把部署环境以及训练环境都安装好。 1.TensorRTX下载 这里使用Wang-xinyu大佬维护的TensorRTX库来对YOLOv8进行推理加速的演示&#xff0c;顺便也验证一下前面环境配置的成果。 github地址&#xff1a;GitHub - wang-xinyu/tensorrtx&#x…

SourceTree rebase(变基)的使用

参考资料 【Sourcetree】コミットを一つにまとめる【Sourcetree】リベースする 目录 前提0.1 merge与rebase0.2 merge合并分支0.3 rebase合并分支0.4 &#x1f4a5;超级注意事项&#x1f4a5; 一. 代码已提交&#xff0c;未推送&#xff0c;交互式变基1.1 通过SourceTree操作1…

Richtek立锜科技可用于智能门铃的电源管理解决方案

新型的智能门铃不仅能满足呼叫、提醒的需要&#xff0c;还能在线监控、远程操作、闯入通知、记录过程&#xff0c;系统构成相对复杂&#xff0c;与传统门铃相比有了很大的改变。 从电源管理的角度来观察&#xff0c;满足这样需求的系统构成也相对复杂&#xff1a; 处于外置状态…

ElementUIV12相关使用方法

今日内容 零、 复习昨日 零、 复习昨日 一、Element UI Element&#xff0c;一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库 官网&#xff1a; https://element.eleme.cn/#/zh-CN Element Plus,基于 Vue 3&#xff0c;面向设计师和开发者的组件库 官网: htt…

多样化数据可视化方法的全面示例:基于Python的多样化数据可视化

文章目录 前言代码效果展示 前言 本文演示了使用Python进行温度数据的多样化可视化方法。通过导入、处理和分析气象数据&#xff0c;我们生成了多种图表&#xff0c;包括直方图、核密度估计图、箱型图、小提琴图、条形图、山脊图、经验累积分布函数图和折线图。这些图表帮助我…

从产品手册用户心理学分析到程序可用性与易用性的重要区别

注&#xff1a;机翻&#xff0c;未校对。 Designing for People Who Have Better Things To Do With Their Lives 为那些生活中有更重要事情要做的人设计 When you design user interfaces, it’s a good idea to keep two principles in mind: 在设计用户界面时&#xff0c;…

微软Office PLUS办公插件下载安装指南

微软OfficePLUS插件下载安装指南 简介&#xff1a; OfficePLUS微软官方出品的Office插件 &#xff0c;OfficePLUS拥有30万高质量模板素材&#xff0c;能帮助Word、Excel、Powerpoint、PDF等多种办公软件提升效率&#xff0c;具有智能化、模板质量高、运行快、稳定性强等优点。…

探索Facebook:数字社交的魔力源泉

在当今信息爆炸和全球互联的时代&#xff0c;社交媒体平台成为了人们生活中不可或缺的一部分。而在这些平台中&#xff0c;Facebook无疑是最具影响力和创新性的代表之一。自2004年成立以来&#xff0c;Facebook不仅改变了人们的沟通方式&#xff0c;更通过不断的技术创新和用户…

Pycharm与Gitlab交互

环境准备 1、下载配置好本地Git 2、配置Pycharm上的Git 3、gitlab账号 Gitlab配置 Gitlab配置中文 账号》设置》偏好设置》简体中文 创建项目 命令行操作 打开项目会展示以下步骤 在pycharm克隆gitlab的项目 通过菜单栏 1、在PyCharm的顶部菜单栏中&#xff0c;选择“V…

探索智能合约在金融科技中的前沿应用与挑战

随着区块链技术的发展和普及&#xff0c;智能合约作为其核心应用之一&#xff0c;在金融科技&#xff08;FinTech&#xff09;领域中展现出了巨大的潜力和挑战。本文将深入探讨智能合约的基本概念、前沿应用案例&#xff0c;以及面临的技术挑战和发展趋势&#xff0c;旨在帮助读…

R语言进行集成学习算法:随机森林

# 10.4 集成学习及随机森林 # 导入car数据集 car <- read.table("data/car.data",sep ",") # 对变量重命名 colnames(car) <- c("buy","main","doors","capacity","lug_boot","safety"…

昇思25天学习打卡营第11天|RNN实现情感分类

概述 情感分类是自然语言处理中的经典任务&#xff0c;是典型的分类问题。本节使用MindSpore实现一个基于RNN网络的情感分类模型&#xff0c;实现如下的效果&#xff1a; 输入: This film is terrible 正确标签: Negative 预测标签: Negative输入: This film is great 正确标…