VMware-虚拟机信息获取

  • 获取VC中虚拟机的清单信息
# -*- coding:utf-8 -*-

import os
import atexit
import datetime
from pyVmomi import vim, vmodl
from pyVim.connect import SmartConnectNoSSL, Disconnect
from configparser import ConfigParser
import datetime
import xlwt


def setStyle(name):
    style = xlwt.XFStyle()
    font = xlwt.Font()
    pattern = xlwt.Pattern()
    alignment = xlwt.Alignment()
    font.colour_index = 1  # 字体颜色
    font.name = name  # 字体
    font.bold = True    # 加粗
    alignment.horz = 2   # 对齐方式,居中
    pattern.pattern = xlwt.Pattern.SOLID_PATTERN
    pattern.pattern_fore_colour = 23  # 背景颜色
    style.alignment = alignment
    style.pattern = pattern
    style.font = font
    return style


def data_write(filepath, datas):
    f = xlwt.Workbook()
    sheet1 = f.add_sheet(u'虚拟机清单', cell_overwrite_ok=True)
    line_01 = ['数据中心', 'Vcenter', '集群', '主机', '名称', 'IP地址', '状况', '客户机操作系统', '内存大小', 'Cpu计数',
               '置备空间', '已用空间', '所在路径', '备注', 'IPS']
    for x in range(len(line_01)):
        sheet1.write(0, x, line_01[x], setStyle("宋体"))
    i = 1  # i 值为excel从第几行开始写
    for data in datas:
        for j in range(len(data)):
            sheet1.write(i, j, data[j])
        i = i + 1
    f.save(filepath)


def getNics(guest):
    ips = []
    for nic in guest.net:
        if nic.ipConfig is not None and nic.ipConfig.ipAddress is not None:
            ipconf = nic.ipConfig.ipAddress
            for ip in ipconf:
                ips.append(ip.ipAddress)
    if len(ips) == 0:
        return []
    else:
        return ips


def getStorage(storage):
    storage_userd = round((storage.committed / 1024 ** 3), 2)
    storage_left = round((storage.uncommitted / 1024 ** 3), 2)
    storage_total = int(storage_left) + int(storage_userd)
    return storage_userd, storage_total


def vmsummary(dc, vc_ip, cluster, summary, guest):
    vm_list = []
    storage_userd, storage_total = getStorage(summary.storage)
    ips = getNics(guest)
    vm_list.append(dc)
    vm_list.append(vc_ip)
    vm_list.append(cluster)
    vm_list.append(summary.runtime.host.name)
    vm_list.append(summary.config.name)
    vm_list.append(summary.guest.ipAddress)
    vm_list.append(summary.runtime.powerState)
    vm_list.append(summary.guest.guestFullName)
    vm_list.append(summary.config.memorySizeMB)
    vm_list.append(summary.config.numCpu)
    vm_list.append(storage_total)
    vm_list.append(storage_userd)
    vm_list.append(summary.config.vmPathName)
    vm_list.append(summary.config.annotation)
    vm_list.extend(ips)
    return vm_list


def run(si, vc_address, config:dict): 
    global vm_lists
    try:
        time_start = si.CurrentTime()
        content = si.RetrieveContent()
        #dc_name = cfg["info"]
        children = content.rootFolder.childEntity
        for child in children:
            dc = child
            dc_name = child.name
            clusters = dc.hostFolder.childEntity
            for cluster in clusters:
                hosts = cluster.host
                for host in hosts:
                    vms = host.vm
                    for vm in vms:
                        vm_list = vmsummary(dc_name, vc_address, cluster.name, vm.summary, vm.guest)
                        vm_lists.append(vm_list)
        time_end = si.CurrentTime()
        #print("结束时间:", time_end.strftime("%Y-%m-%d:%H:%M"))
        time_spend = time_end - time_start
        print("耗时:", time_spend)
    except vmodl.MethodFault as error:
        print("Caught vmodl fault:" + error.msg)
        return False, error.msg
    else: 
        atexit.register(Disconnect, si)
        return True, "Ok"
	
if __name__ == "__main__":
    try:
        base_dir = os.path.dirname(os.path.abspath(__file__))
        html_dir = "/var/www/html/prod/"
        virtual_file = os.path.join(html_dir, os.path.join("VMS", "%s.xlsx" % (datetime.datetime.now().strftime("%Y-%m-%d"))))
        config_file = os.path.join(base_dir, os.path.join("etc", "vSphere.ini"))
        config = ConfigParser()
        config.read(config_file, encoding="utf-8")
        vm_lists = []
        for section in config.sections():
            cfg = dict(config.items(section))
            try:
                si = SmartConnectNoSSL(host=section, port=cfg["port"], user=cfg["user"], pwd=cfg["passwd"])
            except Exception as e:
                print("Login Error:" + cfg["info"])
                continue
            else:
                print("Login Success:" + cfg["info"])
                run(si, section, cfg)
        data_write(virtual_file, vm_lists)
        print("虚拟机数量:", len(vm_lists))
    except Exception as err:
        print(err)
    finally:
        exit()

  • 配置文件vSphere.ini
[10.250.x.x]
info = Transsion-TEST
user = administrator@vsphere.local
passwd = x
port = 443
[10.250.x.x]
info = Transsion-Pre-Prod
user = administrator@vsphere.local
passwd = x
port = 443
  • 清单内容
数据中心 Vcenter 集群 主机 名称 IP地址 状况 客户机操作系统 内存大小 Cpu计数 置备空间 已用空间 所在路径 备注 IPS
Transsion-Pre-Prod-DC 10.250.x.x 10.250.x.x 10.250.x.x Nac-3-14(101.201) 10.250.101.201 poweredOn Linux (64-bit) 65536 48 607 552.02 [100.18_local_data] Nac-3-14(101.201)/Nac-3-14(101.201).vmx 系统:未知, 主机名:Nac-3-14(101.201), IP地址:10.250.101.201, 负责人:xx, 创建时间:2021-01-05 10.250.101.201
posted @ 2021-03-24 12:02  独孤云翔  阅读(1014)  评论(0)    收藏  举报