Zabbix 监控硬盘状态
- ## 通过 zabbix 监控机房硬盘状态, 减少跑机房次数, 提前进行硬盘故障预警
- # 亲测可以使用的脚本
准备包
megacli-8.02.21-1-mdv2012.0.x86_64.rpm
通过 salt 直接安装到每台服务器
修改 zabbix_agentd 配置
增加配置文件
- raid_check.conf
- UserParameter=raid.phy.discovery,sudo /usr/local/zabbix/scripts/RaidCheck.py pd_discovery
- UserParameter=raid.phy.mec[*],sudo /usr/local/zabbix/scripts/RaidCheck.py mec $1
- UserParameter=raid.phy.oec[*],sudo /usr/local/zabbix/scripts/RaidCheck.py oec $1
- UserParameter=raid.phy.pfc[*],sudo /usr/local/zabbix/scripts/RaidCheck.py pfc $1
- UserParameter=raid.phy.fw_state[*],sudo /usr/local/zabbix/scripts/RaidCheck.py fw_state $1
Zabbix_agentd 端增加检测脚本
- RaidCheck.py
- #!/usr/bin/python
- # -*- coding: utf-8 -*-
- #
- # Description:
- # This application is used to discovery the pyhsical disk by using the MegaCLI tool.
- #
- #
- import commands
- import os
- import sys
- import json
- from optparse import OptionParser
- MEGACLI_EXEC = '/sbin/megacli'
- LIST_DISK_OPT = '-PDList -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'
- class Disk(object):
- def __init__(self, dev_id, slot_number, wwn, 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 %s' % (
- self.dev_id, self.slot_number, self.wwn, self.mec, self.oec,
- self.pfc, self.pd_type, self.raw_size, self.firmware_state,
- self.inquiry_data
- )
- 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(WWN):
- wwn = 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, wwn, mec, oec, pfc, pd_type,
- raw_size, fw_state, inquiry_data)
- disk_array.append(disk)
- return disk_array
- 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
- def get_disk_array():
- check_megacli(MEGACLI_EXEC)
- (status, output) = commands.getstatusoutput('%s %s' % (MEGACLI_EXEC, LIST_DISK_OPT))
- if status != 0:
- print 'Exec MegaCLI failed, please check the log.'
- os.exit(1)
- disk_array = make_disk_array(output)
- 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()
- 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 == 'fw_state':
- print firmware_state(disk_array, args.pop())
配置权限
- #tail /etc/sudoers
- zabbix ALL=(root) NOPASSWD:/usr/local/zabbix/scripts/RaidCheck.py
重启 zabbix_agentd
zabbix_server 端, 通过 zabbix_get -s *** -k raid.phy.discovery
可以获取到对应机器的硬盘信息
- ### 资料来源:
- https://www.cnblogs.com/alexyang8/p/4270865.html
来源: http://www.bubuko.com/infodetail-2526412.html