ZABBIX 监控Windows Server LSI RAID卡状态

系统环境:

      操作系统:CentOS7.2

      ZABBIX Server:2.4.8

      Zabbix Agentd客户端系统:Windows Server 2012 + Python2.7x

      模板、脚本下载地址:http://pan.baidu.com/s/1gfpX3Kf

ZABBIX客户端操作

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、添加模板,关联主机。


监控效果图

ZABBIX 监控Windows Server LSI RAID卡状态_第1张图片

你可能感兴趣的:(ZABBIX 监控Windows Server LSI RAID卡状态)