首页 > 代码库 > 【zabbix】监控ESXi上虚拟机硬盘的增长量及占用量

【zabbix】监控ESXi上虚拟机硬盘的增长量及占用量

因为公司之前是拿硬件堆出来的环境现在想要上虚拟化所以我们现在的环境大多都是通过P2V把原来的机器腾出来之后安装ESXi然后就在本地硬盘上跑虚拟机我也知道很不安全所以我们就需要面临几个问题以前的节点配置的硬盘空间和内存都不大所以我们跑虚拟机的话硬盘和内存就会特别吃力。当然内存跑满了顶多是性能上面有点问题但是硬盘跑满了整个节点上面的虚拟机就会陆续的停掉比较尴尬的问题。那么为了预防这个问题的发生在开始的时候我已经写了一篇怎么监控节点硬盘空间的量的文章面包ESXi 硬盘监控脚本使用方法详解http://mianbao.cn.com/forum.php?mod=viewthread&tid=173&fromuid=1并且对脚本的使用方法做了说明。

但是后来我们发现只有这监控是不够的节点硬盘达到了报警伐值之后我们该怎样采取措施成了我们最大的问题因为不能快速的定位哪个虚拟机占用的硬盘空间比较大那么我们就无法做到敏捷的反映。因为还要牵涉到虚拟机迁移这个是需要和业务沟通的如果你没有强有力的证据说明是某台虚拟机的问题那么沟通工作就会很难做。所以面包就又写了监控每个节点上虚拟机的脚本实现效果如下

技术分享




重点不在图而在下面的值通过值我们可以快速的定位出来此节点上的虚拟机在一定的时候范围内新增了多少空间因为我们都是用的瘦分配并且在资源紧张的情况下很难控制超分的比率。另外需要注意的是此值是监控出来整个虚拟机的大小就是包含内存文件、镜像快照、VMDK、log等在节点上占用的空间。另外需要注意VMware是没有硬盘回收机制的比如我瘦分配一个硬盘为300G我真实用了150G突然有一天我清理日志清理了20G你在系统里看到你只是占用了130G但是在底层你所占用的仍然还是150G这里显示的就是这个值。

说完了原因和我的需求以及实现的效果我们一起来看一下实现的过程吧我们先来看一下脚本是肿么写的
#-*- coding:utf-8 -*-
‘‘‘
@Created on 2016
 
@author: MianBao

@author_web: Mianbao.cn.com

‘‘‘
import copy
import ssl
from pysphere import VIServer,VIProperty
from zabbix_send import zabbix_sender



def GetNodeInfo(Server):
    managed_object_types = ‘VirtualMachine‘
    properties = [
    ‘summary.runtime.host‘,
    ‘summary.storage.committed‘,
    ‘name‘,
    ]
    props = Server._retrieve_properties_traversal(property_names=properties,obj_type=managed_object_types)
    vms = dict()
    for item in props:
        vm = {}
        host_id = None
        for p in item.PropSet:
            if p.Name == ‘summary.runtime.host‘:
                if vms.get(p.Val,None):
                    host_id = p.Val
            vm[p.Name] = p.Val
        if host_id:
            vms[host_id].append(vm)
        else:
            vms[vm[‘summary.runtime.host‘]] = [vm,]
    return vms
            
def GetHosts(s):
    hosts = s.get_hosts()
    return hosts

def main(s,zabbix_info):
    hosts = GetHosts(s)
    vms = GetNodeInfo(s)
    for x,y in vms.items():
        for m in y:
            response = SendData(x,m,hosts,zabbix_info)
            print response
    return response

def SendData(x,m,hosts,zabbix_info):
    zabbix_vm = zabbix_sender(**zabbix_info)
    
    value = dict()
    value[‘host‘] = hosts.get(x,None)
    value[‘key‘] = ‘vmware.vm‘
    vm_name = m.get(‘name‘)
    value[‘value‘] = ‘{"data":[{"{#DATA}":"%s"}]}‘ % str(vm_name)
    zabbix_vm.adddata(**copy.deepcopy(value))
    print hosts.get(x,None),‘--------‘,vm_name
    for key,val in m.items():
        if key not in [‘summary.runtime.host‘,‘name‘,]:
            value[‘key‘] = ‘%s[%s]‘ % (key, vm_name)
            value[‘value‘] = val
            zabbix_vm.adddata(**copy.deepcopy(value))
    
    response=zabbix_vm.send()
    return response

以上为实现的主要代码还需要向"get_disk_info.py"下面调用一下这个函数。接下来我们来看一下模板中该怎么设置新增一个“discovery rules”然后key设置如下图所示
技术分享 
设置“discovery rules”并设置其item如下

技术分享 
基本设置方法如上所述

本文出自 “面包” 博客,请务必保留此出处http://mianbao.blog.51cto.com/12784768/1913197

【zabbix】监控ESXi上虚拟机硬盘的增长量及占用量