python-获取EXSI宿主机上虚拟机资源信息

1. python-获取EXSI宿主机上虚拟机资源信息

  • 安装包准备

    # 所需安装包版本
    python==3.8.4
    pyVim==0.0.21 
    pyvmomi==6.7.1
    
    
    # 安装命令:
    pip install pyVim==0.0.21  pyvmomi==6.7.1
    
  • 编写获取

    #!/usr/bin/python3
    #coding:utf-8
    
    """
    获取所有的vcenter相关信息
    包括exsi的硬件资源信息和vmware客户端的硬件分配信息
    """
    from pyVmomi import vim
    from pyVim.connect import SmartConnect, Disconnect, SmartConnectNoSSL
    import atexit
    import argparse
    
    
    def get_args():
        parser = argparse.ArgumentParser(
            description='Arguments for talking to vCenter')
    
        parser.add_argument('-s', '--host',
                            required=True,
                            action='store',
                            help='vSpehre service to connect to')
    
        parser.add_argument('-o', '--port',
                            type=int,
                            default=443,
                            action='store',
                            help='Port to connect on')
    
        parser.add_argument('-u', '--user',
                            required=True,
                            action='store',
                            help='User name to use')
    
        parser.add_argument('-p', '--password',
                            required=True,
                            action='store',
                            help='Password to use')
    
        args = parser.parse_args()
        return args
    
    
    def get_obj(content, vimtype, name=None):
        '''
        列表返回,name 可以指定匹配的对象
        '''
        container = content.viewManager.CreateContainerView(content.rootFolder, vimtype, True)
        obj = [ view for view in container.view]
        return obj
    
    
    def main():
        esxi_host = {}
        args = get_args()
        # connect this thing
        si = SmartConnectNoSSL(
                host=args.host,
                user=args.user,
                pwd=args.password,
                port=args.port)
        # disconnect this thing
        atexit.register(Disconnect, si)
        content = si.RetrieveContent()
        esxi_obj = get_obj(content, [vim.HostSystem])
        for esxi in esxi_obj:
            esxi_host[esxi.name] = {'esxi_info':{},'datastore':{}, 'network': {}, 'vm': {}}
    
            esxi_host[esxi.name]['esxi_info']['厂商'] = esxi.summary.hardware.vendor
            esxi_host[esxi.name]['esxi_info']['型号'] = esxi.summary.hardware.model
            for i in esxi.summary.hardware.otherIdentifyingInfo:
                if isinstance(i, vim.host.SystemIdentificationInfo):
                    esxi_host[esxi.name]['esxi_info']['SN'] = i.identifierValue
            esxi_host[esxi.name]['esxi_info']['处理器'] = '数量:%s 核数:%s 线程数:%s 频率:%s(%s) ' % (esxi.summary.hardware.numCpuPkgs,
                                                                                          esxi.summary.hardware.numCpuCores,
                                                                                          esxi.summary.hardware.numCpuThreads,
                                                                                          esxi.summary.hardware.cpuMhz,
                                                                                          esxi.summary.hardware.cpuModel)
            esxi_host[esxi.name]['esxi_info']['处理器使用率'] = '%.1f%%' % (esxi.summary.quickStats.overallCpuUsage /
                                                           (esxi.summary.hardware.numCpuPkgs * esxi.summary.hardware.numCpuCores * esxi.summary.hardware.cpuMhz) * 100)
            esxi_host[esxi.name]['esxi_info']['内存(MB)'] = esxi.summary.hardware.memorySize/1024/1024
            esxi_host[esxi.name]['esxi_info']['可用内存(MB)'] = '%.1f MB' % ((esxi.summary.hardware.memorySize/1024/1024) - esxi.summary.quickStats.overallMemoryUsage)
            esxi_host[esxi.name]['esxi_info']['内存使用率'] = '%.1f%%' % ((esxi.summary.quickStats.overallMemoryUsage / (esxi.summary.hardware.memorySize/1024/1024)) * 100)
            esxi_host[esxi.name]['esxi_info']['系统'] = esxi.summary.config.product.fullName
    
            for ds in esxi.datastore:
                esxi_host[esxi.name]['datastore'][ds.name] = {}
                esxi_host[esxi.name]['datastore'][ds.name]['总容量(G)'] = int((ds.summary.capacity)/1024/1024/1024)
                esxi_host[esxi.name]['datastore'][ds.name]['空闲容量(G)'] = int((ds.summary.freeSpace)/1024/1024/1024)
                esxi_host[esxi.name]['datastore'][ds.name]['类型'] = (ds.summary.type)
            for nt in esxi.network:
                esxi_host[esxi.name]['network'][nt.name] = {}
                esxi_host[esxi.name]['network'][nt.name]['标签ID'] = nt.name
            for vm in esxi.vm:
                esxi_host[esxi.name]['vm'][vm.name] = {}
                esxi_host[esxi.name]['vm'][vm.name]['电源状态'] = vm.runtime.powerState
                esxi_host[esxi.name]['vm'][vm.name]['CPU(内核总数)'] = vm.config.hardware.numCPU
                esxi_host[esxi.name]['vm'][vm.name]['内存(总数MB)'] = vm.config.hardware.memoryMB
                esxi_host[esxi.name]['vm'][vm.name]['系统信息'] = vm.config.guestFullName
                if vm.guest.ipAddress:
                    esxi_host[esxi.name]['vm'][vm.name]['IP'] = vm.guest.ipAddress
                else:
                    esxi_host[esxi.name]['vm'][vm.name]['IP'] = '服务器需要开机后才可以获取'
    
                for d in vm.config.hardware.device:
                    if isinstance(d, vim.vm.device.VirtualDisk):
                        esxi_host[esxi.name]['vm'][vm.name][d.deviceInfo.label] = str((d.capacityInKB)/1024/1024) + ' GB'
    
        f = open(args.host + '.txt', 'w')
        for host in esxi_host:
            print('ESXI IP:', host)
            f.write('ESXI IP: %s \n' % host)
            for hd in esxi_host[host]['esxi_info']:
                print('  %s:    %s' % (hd, esxi_host[host]['esxi_info'][hd]))
                f.write('  %s:    %s' % (hd, esxi_host[host]['esxi_info'][hd]))
            for ds in esxi_host[host]['datastore']:
                print('  存储名称:', ds)
                f.write('  存储名称: %s \n' % ds)
                for k in esxi_host[host]['datastore'][ds]:
                    print('       %s:  %s' % (k, esxi_host[host]['datastore'][ds][k]))
                    f.write('       %s:  %s \n' % (k, esxi_host[host]['datastore'][ds][k]))
            for nt in esxi_host[host]['network']:
                print('  网络名称:', nt)
                f.write('  网络名称:%s \n' % nt)
                for k in esxi_host[host]['network'][nt]:
                    print('        %s:  %s' % (k, esxi_host[host]['network'][nt][k]))
                    f.write('        %s:  %s \n' % (k, esxi_host[host]['network'][nt][k]))
            for vmachine in esxi_host[host]['vm']:
                print('  虚拟机名称:', vmachine)
                f.write('  虚拟机名称:%s \n' % vmachine)
                for k in esxi_host[host]['vm'][vmachine]:
                    print('        %s:  %s' % (k, esxi_host[host]['vm'][vmachine][k]))
                    f.write('        %s:  %s \n' % (k, esxi_host[host]['vm'][vmachine][k]))
        f.close()
    
    
    if __name__ == '__main__':
        main()
    
    
  • 获取结果查看
    image

    标注是

    ​ -s IP地址

    -o 指定是http还是https协议

    -u 指定是访问用户名

    -p 指定密码

2. 改造原有脚本式,通过传参控制封装

  • 编写脚本

    #!/usr/bin/python3
    # coding:utf-8
    
    """
    获取所有的vcenter相关信息
    包括exsi的硬件资源信息和vmware客户端的硬件分配信息
    """
    from pyVmomi import vim
    from pyVim.connect import SmartConnect, Disconnect, SmartConnectNoSSL
    import atexit
    import argparse
    
    
    # 面向对象操作
    class EsxiTest():
        def __init__(self, ip, port, username, password):
            self.ip = ip
            self.port = port
            self.username = username
            self.password = password
    
        def Esxi_command(self):
            esxi_host = {}
            # 连接esxi
            Esxi_Connect = SmartConnectNoSSL(host=self.ip, port=self.port, user=self.username, pwd=self.password)
            atexit.register(Disconnect, Esxi_Connect)
            content = Esxi_Connect.RetrieveContent()
            esxi_content = content.viewManager.CreateContainerView(content.rootFolder, [vim.HostSystem], True)
            esxi_obj = [ view for view in esxi_content.view ]
            for esxi in esxi_obj:
                esxi_host[esxi.name] = {'esxi_info': {}, 'datastore': {}, 'network': {}, 'vm': {}}
    
                esxi_host[esxi.name]['esxi_info']['厂商'] = esxi.summary.hardware.vendor
                esxi_host[esxi.name]['esxi_info']['型号'] = esxi.summary.hardware.model
                for i in esxi.summary.hardware.otherIdentifyingInfo:
                    if isinstance(i, vim.host.SystemIdentificationInfo):
                        esxi_host[esxi.name]['esxi_info']['SN'] = i.identifierValue
                esxi_host[esxi.name]['esxi_info']['处理器'] = '数量:%s 核数:%s 线程数:%s 频率:%s(%s) ' % (
                esxi.summary.hardware.numCpuPkgs,
                esxi.summary.hardware.numCpuCores,
                esxi.summary.hardware.numCpuThreads,
                esxi.summary.hardware.cpuMhz,
                esxi.summary.hardware.cpuModel)
                esxi_host[esxi.name]['esxi_info']['处理器使用率'] = '%.1f%%' % (esxi.summary.quickStats.overallCpuUsage /
                                                                          (
                                                                                  esxi.summary.hardware.numCpuPkgs * esxi.summary.hardware.numCpuCores * esxi.summary.hardware.cpuMhz) * 100)
                esxi_host[esxi.name]['esxi_info']['内存(MB)'] = esxi.summary.hardware.memorySize / 1024 / 1024
                esxi_host[esxi.name]['esxi_info']['可用内存(MB)'] = '%.1f MB' % (
                        (esxi.summary.hardware.memorySize / 1024 / 1024) - esxi.summary.quickStats.overallMemoryUsage)
                esxi_host[esxi.name]['esxi_info']['内存使用率'] = '%.1f%%' % ((esxi.summary.quickStats.overallMemoryUsage / (
                        esxi.summary.hardware.memorySize / 1024 / 1024)) * 100)
                esxi_host[esxi.name]['esxi_info']['系统'] = esxi.summary.config.product.fullName
    
                for ds in esxi.datastore:
                    esxi_host[esxi.name]['datastore'][ds.name] = {}
                    esxi_host[esxi.name]['datastore'][ds.name]['总容量(G)'] = int((ds.summary.capacity) / 1024 / 1024 / 1024)
                    esxi_host[esxi.name]['datastore'][ds.name]['空闲容量(G)'] = int((ds.summary.freeSpace) / 1024 / 1024 / 1024)
                    esxi_host[esxi.name]['datastore'][ds.name]['类型'] = (ds.summary.type)
                for nt in esxi.network:
                    esxi_host[esxi.name]['network'][nt.name] = {}
                    esxi_host[esxi.name]['network'][nt.name]['标签ID'] = nt.name
                for vm in esxi.vm:
                    esxi_host[esxi.name]['vm'][vm.name] = {}
                    esxi_host[esxi.name]['vm'][vm.name]['电源状态'] = vm.runtime.powerState
                    esxi_host[esxi.name]['vm'][vm.name]['CPU(内核总数)'] = vm.config.hardware.numCPU
                    esxi_host[esxi.name]['vm'][vm.name]['内存(总数MB)'] = vm.config.hardware.memoryMB
                    esxi_host[esxi.name]['vm'][vm.name]['系统信息'] = vm.config.guestFullName
                    if vm.guest.ipAddress:
                        esxi_host[esxi.name]['vm'][vm.name]['IP'] = vm.guest.ipAddress
                    else:
                        esxi_host[esxi.name]['vm'][vm.name]['IP'] = '服务器需要开机后才可以获取'
    
                    for d in vm.config.hardware.device:
                        if isinstance(d, vim.vm.device.VirtualDisk):
                            esxi_host[esxi.name]['vm'][vm.name][d.deviceInfo.label] = str(
                                (d.capacityInKB) / 1024 / 1024) + ' GB'
    
    
            for host in esxi_host:
                print('ESXI IP:', host)
                for hd in esxi_host[host]['esxi_info']:
                    print('  %s:    %s' % (hd, esxi_host[host]['esxi_info'][hd]))
                for ds in esxi_host[host]['datastore']:
                    print('  存储名称:', ds)
                    for k in esxi_host[host]['datastore'][ds]:
                        print('       %s:  %s' % (k, esxi_host[host]['datastore'][ds][k]))
                for nt in esxi_host[host]['network']:
                    print('  网络名称:', nt)
                    for k in esxi_host[host]['network'][nt]:
                        print('        %s:  %s' % (k, esxi_host[host]['network'][nt][k]))
                for vmachine in esxi_host[host]['vm']:
                    print('  虚拟机名称:', vmachine)
                    for k in esxi_host[host]['vm'][vmachine]:
                        print('        %s:  %s' % (k, esxi_host[host]['vm'][vmachine][k]))
    
    
    if __name__ == '__main__':
        ssh = EsxiTest("172.16.128.89", "443", "root", "123456")
        result = ssh.Esxi_command()
        print(result)