django存储光交业务管理系统-外篇-vmware虚拟化的采集及使用

虚拟化前端

通过采集器采集vmware的数据到mongodb数据库,在通过前端进行展示及显示。

虚拟机,存储,节点之间的关联

虚拟机实例Instance UUID,磁盘uuid,以及esxi节点的IP来确定。每个信息之间都会打一个tag标签。标签也是独一无二。标签的作用是为后期采集性能信息使用。

该脚本功能主要是采集vmwre的虚拟机,存储,及节点的信息。
# -*- coding: utf-8 -*-
from __future__ import absolute_import, unicode_literals
import atexit
import requests
from pyVmomi import vim
from pyVim import connect
import json
def sizeof_fmt(num):
    """

###### 通过写入mongodb数据库
    Returns the human readable version of a file size

    :param num:
    :return:
    """
    for item in ['bytes', 'KB', 'MB', 'GB']:
        if num < 1024.0:
            return "%3.1f%s" % (num, item)
        num /= 1024.0
    return "%3.1f%s" % (num, 'TB')
class vsphere:
    def __init__(self,host,user,password,port=443):
        """
        初始化实例,
        :param host:vc主机名
        :param user: vc用户
        :param password: vc密码
        :param port: vc端口,默认443
        """
        self.service_instance = connect.SmartConnectNoSSL(host=host,user = user,pwd = password,port = int(port))
        atexit.register(connect.Disconnect, self.service_instance)
        self.content = self.service_instance.RetrieveContent()
    #v1.0
    def getvm(self):
        """
        {'bootTime': None,
        'Bios UUID': '423f330a-a578-2c6e-3fb1-dc514a38184d',
        'Annotation': '',
        'Name': 'GZGL_10.239.37.57',
        'VMware-tools': 'toolsOld',
        'Template': False,
        'memorySizeMB': 16384,
        'numdisk': 2,
        'Path': '[X10_K01_HITACHI_Cluster03_LUN15] GZGL_10.239.37.57/GZGL_10.239.37.57.vmx',
        'IP': 'toolsOld',
        'Instance UUID':
        '503fd0c6-1379-f1d0-c2ce-2a6ca446b34c',
        'Guest': 'Red Hat Enterprise Linux 6 (64-bit)',
        'State': 'poweredOn',
        'numCpu': 4}
        :return: list[dict]
        """
        container = self.content.rootFolder  # starting point to look into
        viewType = [vim.VirtualMachine]  # object types to look for
        recursive = True  # whether we should look into it recursively
        containerView = self.content.viewManager.CreateContainerView(
            container, viewType, recursive)
        children = containerView.view
        data = []
        for child in children:
            summary = child.summary
            tempdata = {
                "Name":summary.config.name,
                "vm_tag":str(summary.vm),
                "Template":summary.config.template,
                "Path":summary.config.vmPathName,
                "Guest":summary.config.guestFullName,
                "Instance UUID":summary.config.instanceUuid,
                "Bios UUID": summary.config.uuid,
                "Annotation":summary.config.annotation,
                "State":summary.runtime.powerState,
                "VMware-tools":summary.guest.toolsStatus,
                "IP":summary.guest.ipAddress,
                "memorySizeMB":summary.config.memorySizeMB,
                "numCpu":summary.config.numCpu,
                "numdisk":summary.config.numVirtualDisks,
                "bootTime":summary.runtime.bootTime,
                "exsi_tag":str(summary.runtime.host),
                "exsi_ip":summary.runtime.host.name,
                "storage_committed":summary.storage.committed,
                "storage_uncommitted":summary.storage.uncommitted,
                "storage_unshared":summary.storage.unshared,
                "quickStats_status":summary.quickStats.guestHeartbeatStatus,
                "quickStats_uptimeSeconds":summary.quickStats.uptimeSeconds,
                "quickStats_hostMemoryUsage":summary.quickStats.hostMemoryUsage,
            }
            data.append(tempdata)
        return data

    def getvm_uuid(self):
        container = self.content.rootFolder  # starting point to look into
        viewType = [vim.VirtualMachine]  # object types to look for
        recursive = True  # whether we should look into it recursively
        containerView = self.content.viewManager.CreateContainerView(
            container, viewType, recursive)
        children = containerView.view
        data = []
        for child in children:
            summary = child.summary
            tempdata = {
                "Instance UUID":summary.config.instanceUuid,
            }
            data.append(tempdata)
        return data
    #废弃
    def getexsihost_storage(self):
        """
        {
            ip:
                磁盘名称。
                    {磁盘信息}

        }
        :return:dict
        """
        objview = self.content.viewManager.CreateContainerView(self.content.rootFolder,
                                                          [vim.HostSystem],
                                                          True)
        esxi_hosts = objview.view
        objview.Destroy()
        datastores = []
        for esxi_host in esxi_hosts:
            # All Filesystems on ESXi host
            # print(esxi_host)
            storage_system = esxi_host.configManager.storageSystem
            host_file_sys_vol_mount_info = storage_system.fileSystemVolumeInfo.mountInfo
            datastore_dict = {}
            # Map all filesystems

            for host_mount_info in host_file_sys_vol_mount_info:
                # Extract only VMFS volumes

                if host_mount_info.volume.type == "VMFS":
                    extents = host_mount_info.volume.extent
                    datastore_details = {
                        'uuid': host_mount_info.volume.uuid,
                        'capacity': host_mount_info.volume.capacity,
                        'vmfs_version': host_mount_info.volume.version,
                        'local': host_mount_info.volume.local,
                        'ssd': host_mount_info.volume.ssd,
                    }
                    extent_arr = []
                    extent_count = 0
                    for extent in extents:
                        # print("{}\t{}\t".format("Extent[" + str(extent_count) + "]:",extent.diskName))
                        extent_count += 1
                        # create an array of the devices backing the given
                        # datastore
                        extent_arr.append(extent.diskName)
                        # add the extent array to the datastore info
                        datastore_details['extents'] = extent_arr
                        # associate datastore details with datastore name
                        # datastore_dict[host_mount_info.volume.name] = datastore_details
                        datastore_details["storagename"] = host_mount_info.volume.name
                        datastore_details["exsi_host"] = esxi_host.name

            # associate ESXi host with the datastore it sees
            # datastores[esxi_host.name] = datastore_dict
                datastores.append(datastore_details)

        return datastores
    #v1.0
    # def getstorage01(self):
    #     """
    #     "Capacity(GB)": "1.1TB",
    #       "URL": "ds:///vmfs/volumes/5b126d7e-fbee7582-8d66-5c546d5798c3/",
    #       "VmNum": "0",
    #       "hostNum": "1",
    #       "free cap(GB)": "1.1TB",
    #       "Name": "datastore1 (25)"
    #       完成
    #     :return:[{}]
    #     """
    #     ds_obj_list = self.content.viewManager.CreateContainerView(self.content.rootFolder,
    #                                                       [vim.Datastore],
    #                                                       True)
    #     datastore = []
    #     for ds in ds_obj_list.view:
    #         summary = ds.summary
    #         ds_capacity = summary.capacity
    #         ds_freespace = summary.freeSpace
    #         ipdata = []
    #         vmdata = []
    #         for i in ds.host:
    #             ipdata.append({str(i.key):i.key.name})
    #         for i in ds.vm:
    #             vmdata.append({str(i):i.name})
    #         datadict  = {
    #             "Name":format(summary.name),
    #             "URL":format(summary.url),
    #             "Capacity":format(sizeof_fmt(ds_capacity)),
    #             "free cap":format(sizeof_fmt(ds_freespace)),
    #             "hostNum":format(len(ds.host)),
    #             "VmNum":format(len(ds.vm)),
    #             "host_tag":ipdata,
    #             "vm_tag":vmdata,
    #         }
    #         if datadict:
    #             datastore.append(datadict)
    #     return datastore
    def getstorage01(self):
        """
        "Capacity(GB)": "1.1TB",
          "URL": "ds:///vmfs/volumes/5b126d7e-fbee7582-8d66-5c546d5798c3/",
          "VmNum": "0",
          "hostNum": "1",
          "free cap(GB)": "1.1TB",
          "Name": "datastore1 (25)"
          完成
        :return:[{}]
        """
        ds_obj_list = self.content.viewManager.CreateContainerView(self.content.rootFolder,
                                                          [vim.Datastore],
                                                          True)
        datastore = []
        for ds in ds_obj_list.view:
            summary = ds.summary
            ds_capacity = summary.capacity
            ds_freespace = summary.freeSpace
            # ipdata = []
            # vmdata = []
            esxiip = []
            vmip = []
            for i in ds.host:
                # ipdata.append({str(i.key):i.key.name})
                esxiip.append({
                    "esxiip_tag":str(i.key),
                    "esxiip":i.key.name
                })
            for i in ds.vm:
                # vmdata.append({str(i):i.name})
                vmip.append(
                    {
                        "vmip_tag":str(i),
                        "vmipname":i.name,
                    }
                )
            datadict  = {
                "Name":format(summary.name),
                "URL":format(summary.url),
                "Capacity":format(sizeof_fmt(ds_capacity)),
                "free cap":format(sizeof_fmt(ds_freespace)),
                "hostNum":format(len(ds.host)),
                "VmNum":format(len(ds.vm)),
                "esxiip":esxiip,
                "vmip":vmip
            }
            if datadict:
                datastore.append(datadict)
        return datastore
    #v1.0
    def gethost(self):
        """
        :return:list
        """
        objview = self.content.viewManager.CreateContainerView(self.content.rootFolder,
                                                          [vim.HostSystem],
                                                          True)
        esxi_hosts = objview.view
        objview.Destroy()
        datastores = []
        for esxi_host in esxi_hosts:
            systemInfo = esxi_host.hardware.systemInfo
            cpuInfo = esxi_host.hardware.cpuInfo
            storage_system = esxi_host.configManager.storageSystem
            host_file_sys_vol_mount_info = storage_system.fileSystemVolumeInfo.mountInfo
            data = {
            "esxi_host":esxi_host.name
            ,"esxi_tag":str(esxi_host)
            ,"vendor":systemInfo.vendor
            ,"model":systemInfo.model
            ,"host_uuid":systemInfo.uuid
            ,"numCpuPackages":cpuInfo.numCpuPackages
            ,"numCpuCores":cpuInfo.numCpuCores
            ,"numCpuThreads":cpuInfo.numCpuThreads
            ,"hz":cpuInfo.hz
            ,"memorySize":esxi_host.hardware.memorySize
            }
            datastores.append(data)
        return datastores
    #v1.0
    def getcluster(self):
        """
        获取集群下的IP信息
        :return:
        """
        objview = self.content.viewManager.CreateContainerView(self.content.rootFolder,
                                                          [vim.ClusterComputeResource],
                                                          True)
        datavcenter = {}
        for i in objview.view:
            datahost = []
            for k in i.host:
                datahost.append({str(k):k.name})
            datavcenter[i.name] = datahost
        # print(json.dumps(datavcenter,indent=1))
        return datavcenter
目前这个采集主要是为我的备份数据整理而生,目前虚拟化有2000多台,有3套备份系统,需要根据虚拟机的特性,使用哪套备份系统。
通过选择及筛选

通过指定虚拟机的备份厂商,给每个厂商建立一个账号,可以查询自己需要备份哪些虚拟机,备份成功后打上成功的标签。之后有空我会对接3套备份系统的数据库,通过自动化来处理是否成功备份。

查看存储信息

由于虚拟化节点太多,通过该界面,可以快速查看存储相关信息,抽空会写一个告警管理,对剩余容量太少的进行告警。


存储相关信息
查看节点信息

有空写个详细的,这个比较简单。

节点查询
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,849评论 6 13
  • feisky云计算、虚拟化与Linux技术笔记posts - 1014, comments - 298, trac...
    不排版阅读 3,813评论 0 5
  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 31,893评论 2 89
  • 人生就是一画板,颜色、基调由自己把握;生活就是一首歌,高度、曲调由自己选择!
    天空_60f0阅读 131评论 0 0
  • 第三阶段的 DAY9 【作业打卡】 创业日:如果让你开一家店,不考虑盈利的情况下你最想开什么店呢?你会怎样经营这家...
    L没有如果阅读 75评论 0 0