python脚本监控Linux磁盘空间使用率

575阅读 0评论2012-11-16 物连天涯
分类:



脚本内容如下:

#cat check_snmp_storage.py

点击(此处)折叠或打开

  1. #!/usr/bin/python2.4
  2. #_*_ coding: utf-8 _*_

  3. '''
  4. Last Modify: 2014/05/09
  5. Version: 1.2
  6. Description: Monitor Disk usage
  7. Author: Victor
  8. QQ:1409175531
  9. '''

  10. from sys import argv,exit
  11. from decimal import Decimal
  12. from optparse import OptionParser
  13. from netsnmp import snmpwalk

  14. parser = OptionParser('%prog -C -H -d -w -c ')

  15. parser.add_option('-H', '--HostAddr', action='store', dest='hostaddress', help='Specify HostAddress')
  16. parser.add_option('-C', '--community', action='store', dest='community', help='Specify host community')
  17. parser.add_option('-d', '--device', action='store', dest='device', help='Specify a device')
  18. parser.add_option('-w', '--warning', action='store', dest='warning', help='set the warning value')
  19. parser.add_option('-c', '--critical', action='store', dest='critical', help='set the critical value')

  20. (options, argvs) = parser.parse_args(argv)

  21. desc_list = ['hrStorageDescr', 'hrStorageSize', 'hrStorageUsed', 'hrStorageAllocationUnits']

  22. #依次获取desc_list对应的返回值,并分别存入列表
  23. try:
  24.     for mibdsc in desc_list:
  25.         r1 = list(snmpwalk(mibdsc,Version=2,Community=options.community,DestHost=options.hostaddress))
  26.         if mibdsc == 'hrStorageDescr':
  27.             dev = r1
  28.         elif mibdsc == 'hrStorageSize':
  29.             size = r1
  30.         elif mibdsc == 'hrStorageUsed':
  31.             used = r1
  32.         elif mibdsc == 'hrStorageAllocationUnits':
  33.             units = r1
  34. except TypeError:
  35.     parser.print_help()
  36.     exit(3)
  37.     
  38. size_list = {}
  39. used_list = {}
  40. per_list = {}
  41. for devname in dev:
  42.     l = dev.index(devname) #依次获取该元素在列表的位置
  43.     dev_size = int(size[l]) * int(units[l]) / 1024 / 1024 #将磁盘容量单位转为M
  44.     dev_used = int(used[l]) * int(units[l]) / 1024 / 1024
  45.     used_percent = round(float(dev_used) / float(dev_size),2) * 100

  46.     size_list[devname] = dev_size
  47.     used_list[devname] = dev_used
  48.     per_list[devname] = used_percent

  49. if float(options.warning) > float(options.critical):
  50.     print "-w <阀值> 必须等于或小于 -c <阀值>"
  51.     exit(3)
  52. try:
  53.     if float(per_list[options.device]) < float(options.warning):
  54.         print 'OK - "%s" 使用了:%s%% | 总容量:%s MB,已使用:%s MB (w:%s%%, c:%s%%)' % (options.device, per_list[options.device], size_list[options.device], used_list[options.device], options.warning, options.critical)
  55.         exit(0)
  56.     elif float(options.critical) > float(per_list[options.device]) >= float(options.warning):
  57.         print 'Warning - "%s" 使用了:%s%% | 总容量:%s MB , 已使用:%s MB (w:%s%%, c:%s%%)' % (options.device, per_list[options.device], size_list[options.device], used_list[options.device], options.warning, options.critical)
  58.         exit(1)
  59.     elif float(per_list[options.device]) >= float(options.critical):
  60.         print 'Critical - "%s" 使用了:%s%% | 总容量:%s MB , 已使用:%s MB (w:%s%%, c:%s%%)' % (options.device, per_list[options.device], size_list[options.device], used_list[options.device], options.warning, options.critical)
  61.         exit(2)
  62. except KeyError:
  63.     print '无响应或指定的文件系统不存在'
  64.     exit(3)

将脚本check_snmp_storage.py放到/usr/local/nagios/libexec目录下,给执行权限。直接执行脚本可以看到脚本的用法:

#python check_snmp_storage.py -h
usage: check_snmp_storage.py -C -H -d -w -c

options:
  -h, --help            show this help message and exit
  -H HOSTADDRESS, --HostAddr=HOSTADDRESS
                        Specify HostAddress
  -C COMMUNITY, --community=COMMUNITY
                        Specify host community
  -d DEVICE, --device=DEVICE
                        Specify a device
  -w WARNING, --warning=WARNING
                        set the warning value
  -c CRITICAL, --critical=CRITICAL
                        set the critical value

     设备名,如“Physical memory”、“Swap space”、 “/usr/local”等,如果不确定设备名,可先使用snmpdf查看,如:
 需要与上图Description列的名字吻合,大小写必须一致,否则脚本通过snmp去取数据时会找不到设备。

    是报警阀值,如80表示80%,90表示90%。

举例:

commands.cfg配置如下:
define command{
  command_name check_snmp_storage
  command_line $USER1$/check_snmp_storage.py $ARG1$ -H $HOSTADDRESS$ $ARG2$ $ARG3$ $ARG4$
 
}

services.cfg配置如下:
define service{
        use                             service02
        host_name                       test
        service_description             /data       
        check_command                   check_snmp_storage!-C public!-d /data!-w 85!-c 90
       }

以上完成后重启nagios服务,效果图如下:



本文乃何秋平原创文章,请勿转载。如须转载请详细标明转载出处。
上一篇:十年工程师生涯之七:管理好你的嘴巴
下一篇:GPS要多少颗星才能定位导航?