系统环境:
操作系统:CentOS7.2
ZABBIX Server:2.4.8
Zabbix Agentd客户端系统:Windows Server 2012 + Python2.7x
模板、脚本下载地址:http://pan.baidu.com/s/1gfpX3Kf
1、在zabbix.conf中添加以下字段信息 Include=c:\Program Files\zabbix_agents\conf.d\*.conf 2、以下目录中新增一个目录和一个disk.conf文件 c:\Program Files\zabbix_agents\conf.d\disk.conf 3、文件中添加以下内容 UserParameter=raid.py.discovery,python D:\Zabbix_Monitor\Scripts\DiskMonitoring\raid.py pd_discovery UserParameter=raid.py.mec[*],python D:\Zabbix_Monitor\Scripts\DiskMonitoring\raid.py mec $1 UserParameter=raid.py.oec[*],python D:\Zabbix_Monitor\Scripts\DiskMonitoring\raid.py oec $1 UserParameter=raid.py.pfc[*],python D:\Zabbix_Monitor\Scripts\DiskMonitoring\raid.py pfc $1 UserParameter=raid.py.status[*],python D:\Zabbix_Monitor\Scripts\DiskMonitoring\raid.py status $1 UserParameter=raid.py.level,python D:\Zabbix_Monitor\Scripts\DiskMonitoring\raid.py level 4、将网盘中的Zabbix_Monitor文件夹至D盘的根目录,附raid.py脚本信息 Description: # This application is used to discovery the pyhsical disk by using the MegaCLI tool. # # Author: Alex Yang <[email protected]> # import commands import os import sys import json from optparse import OptionParser MEGACLI_EXEC = "D:\Zabbix_Monitor\Tools\MegaCli\MegaCli64.exe" LIST_DISK_OPT = '-PDList -aALL' LIST_RAID_OPT = '-LDInfo -LALL -aAll' SLOT_NUMBER = 'Slot Number' DEVICE_ID = 'Device Id' WWN = 'WWN' MEC = 'Media Error Count' OEC = 'Other Error Count' PFC = 'Predictive Failure Count' PD_TYPE = 'PD Type' RAW_SIZE = 'Raw Size' FIRMWARE_STATE = 'Firmware state' INQUIRY_DATA = 'Inquiry Data' RAID_LEVEL = "RAID Level" class Disk(object): def __init__(self, dev_id, slot_number, mec, oec, pfc, pd_type, raw_size, firmware_state, inquiry_data): self.dev_id = dev_id self.slot_number = slot_number #self.wwn = wwn # Media Error Count self.mec = mec # Other Error Count self.oec = oec # Predictive Failure Count self.pfc = pfc # PD Type self.pd_type = pd_type # Size self.raw_size = raw_size # Firmware State ('Failed', 'Online, Spun Up', 'Online, Spun Down', 'Unconfigured(bad)', 'Unconfigured(good), Spun down', 'Hotspare, Spun down', 'Hotspare, Spun up' or 'not Online') self.firmware_state = firmware_state # Inquiry data self.inquiry_data = inquiry_data def jsonfiy(self): pass def __str__(self): return '%s %s %s %s %s %s %s %s %s' % ( self.dev_id, self.slot_number, self.mec, self.oec, self.pfc, self.pd_type, self.raw_size, self.firmware_state, self.inquiry_data ) #def check_megacli(cli_path): def check_megacli(cli_path): if not os.path.exists(cli_path) or not os.access(cli_path,os.X_OK): print 'MegaCLI is needed in %s with executable priviledge.' % (cli_path) os._exit(1) def line_generator(string): line = [] for c in string: if c != '\n': line.append(c) else: yield ''.join(line) line = [] def get_value(line): return line.split(':')[1].strip() def make_disk_array(mega_output): disk_array = [] for line in line_generator(mega_output): if line.startswith(SLOT_NUMBER): slot_number = get_value(line) elif line.startswith(DEVICE_ID): dev_id = get_value(line) elif line.startswith(MEC): mec = get_value(line) elif line.startswith(OEC): oec = get_value(line) elif line.startswith(PFC): pfc = get_value(line) elif line.startswith(PD_TYPE): pd_type = get_value(line) elif line.startswith(RAW_SIZE): raw_size = get_value(line) elif line.startswith(FIRMWARE_STATE): fw_state = get_value(line) elif line.startswith(INQUIRY_DATA): inquiry_data = get_value(line) disk = Disk(dev_id, slot_number, mec, oec, pfc, pd_type, raw_size, fw_state, inquiry_data) disk_array.append(disk) return disk_array def make_disk_level(mega_output): disk_array = [] for line in line_generator(mega_output): #print line if line.startswith(RAID_LEVEL): raid_level = get_value(line) return raid_level def discovery_physical_disk(disk_array): array = [] for d in disk_array: disk = {} disk['{#DISK_ID}'] = d.dev_id #disk['{#WWN}'] = d.wwn array.append(disk) return json.dumps({'data': array}, indent=4, separators=(',',':')) def count_media_error(disk_array, disk_id): for disk in disk_array: if int(disk.dev_id) == int(disk_id): return disk.mec return '-1' def count_other_error(disk_array, disk_id): for disk in disk_array: if int(disk.dev_id) == int(disk_id): return disk.oec return '-1' def count_predictive_error(disk_array, disk_id): for disk in disk_array: if int(disk.dev_id) == int(disk_id): return disk.pfc return '-1' def firmware_state(disk_array, disk_id): for disk in disk_array: if int(disk.dev_id) == int(disk_id): return disk.firmware_state return '-1' def get_disk_array(): check_megacli(MEGACLI_EXEC) r = os.popen('%s %s' % (MEGACLI_EXEC,LIST_DISK_OPT)) info = r.readlines() values = [] for line in info: line = line.strip('\r') values.append(line) news = ''.join(values) disk_array = make_disk_array(news) return disk_array def get_raid_level(): check_megacli(MEGACLI_EXEC) r = os.popen('%s %s' % (MEGACLI_EXEC,LIST_RAID_OPT)) info = r.readlines() values = [] for line in info: line = line.strip('\r') values.append(line) news = ''.join(values) disk_array = make_disk_level(news) return disk_array def init_option(): usage = ''' ''' parser = OptionParser(usage=usage, version='0.1') return parser parser = init_option() if __name__ == '__main__': (options, args) = parser.parse_args() if len(args) < 1: print parser.print_help() sys.exit(1) disk_array = get_disk_array() disk_level = get_raid_level() command = args.pop(0) if command == 'pd_discovery': print discovery_physical_disk(disk_array) elif command == 'mec': print count_media_error(disk_array, args.pop()) elif command == 'oec': print count_other_error(disk_array, args.pop()) elif command == 'pfc': print count_predictive_error(disk_array, args.pop()) elif command == 'status': print firmware_state(disk_array, args.pop()) elif command == 'level': print get_raid_level() 5、重启ZABBIX Agentd服务、服务端使用zabbix_get测试是是否能抓取到结果。 [root@localhost ~]# zabbix_get -s 192.168.19.20 -k raid.py.level Primary-5, Secondary-0, RAID Level Qualifier-3 6、添加模板,关联主机。