MegaCLI是LSI提供的用户空间管理RAID卡(LSI芯片)工具,适用于大多数的Dell服务器。

MegaCLI介绍:

http://zh.community.dell.com/techcenter/b/weblog/archive/2013/03/07/megacli-command-share

http://blog.chinaunix.net/uid-25135004-id-3139293.html

Zabbix提供low_level_discovery的机制去实现自动发现监控目标,自动添加监项的功能。Zabbix默认就基于low_level_discovery提供了文件系统挂载点和网卡的自动发现和监控。

所以,物理硬盘的自动发现和监控也是基于zabbix的low_level_discovery机制,我所需要做的就是写一个Python脚本来衔接Zabbix和MegaCLI。后面就不再阐述原理和细节了,过程如下:

1. 安装MegaCLI

去LSI官网上下载一个最新版本的MegaCLI,注意操作系统32位还是64位。

安装包默认是rpm的,CentOS等系统能轻松安装。

Ubuntu活debian可参考下面步骤安装:

mkdir /opt/MegaCLI
cd /opt/MegaCLI
wget -c http://xxx/8.07.14_MegaCLI.zip . unzip 8.07.14_MegaCLI.zip
cd /opt/MegaCLI/Linux
apt-get install rpm2cpio
rpm2cpio MegaCli-8.07.-.noarch.rpm | cpio -idmv
mv opt/MegaRAID /opt/ root@controller:~# ls -lh /opt/MegaRAID/MegaCli
total 5.7M
-rw-r--r-- 1 root root 296 Sep 24 19:10 CmdTool.log
-rwx------ 1 root root 528K Dec 16 2013 libstorelibir-2.so.14.07-0
-rwxr-xr-x 1 root root 2.4M Dec 16 2013 MegaCli
-rwsr-sr-x 1 root root 2.6M Dec 16 2013 MegaCli64
-rw-r--r-- 1 root root 139K Oct 10 17:43 MegaSAS.log

后面都默认MegaCli安装在/opt/MegaRAID/MegaCli

2. 编辑raid.py

https://gist.github.com/AlexYangYu/14161ce866417f817508

/opt/DiskMonitoring/raid.py (chmod +x /opt/DiskMonitoring/raid.py)

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Description:
# This application is used to discovery the pyhsical disk by using the MegaCLI tool.
#
# Author: Alex Yang <alex890714@gmail.com>
# import commands
import os
import sys
import json
from optparse import OptionParser MEGACLI_EXEC = '/opt/MegaRAID/MegaCli/MegaCli64'
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 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())

3. 配置Zabbix Agent

编辑zabbix_agentd.conf,确保如下两个配置正确。

Include=/etc/zabbix/zabbix_agentd.conf.d/
UnsafeUserParameters=

将zabbix用户添加到sudoers中

echo "zabbix ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/zabbix

编辑/etc/zabbix/zabbix_agentd.conf.d/disk.conf, 添加自定义用户参数

UserParameter=raid.phy.discovery,sudo /opt/DiskMonitoring/raid.py pd_discovery
UserParameter=raid.phy.mec[*],sudo /opt/DiskMonitoring/raid.py mec $
UserParameter=raid.phy.oec[*],sudo /opt/DiskMonitoring/raid.py oec $
UserParameter=raid.phy.pfc[*],sudo /opt/DiskMonitoring/raid.py pfc $

4. 配置Zabbix Server

创建一个template,然后创建一个discovery rule,然后创建3个ITEM原型

Media Error Count的配置参考

后面只需要将模板关联到相关机器,并在相关机器上部署监控脚本即可。报警什么的就可以按自己的需求去设置。

Zabbix整合MegaCLI实现物理硬盘的自动发现和监控的更多相关文章

  1. Zabbix自动发现并监控磁盘IO、报警

    本文转载自: https://www.93bok.com 引言 Zabbix并没有提供模板来监控磁盘的IO性能,所以我们需要自己来创建一个,由于一台服务器中磁盘众多,如果只有一两台可以手动添加,但服务 ...

  2. 添加zabbix自动发现(监控多tomcat实例)

    说明 何为自动发现?首先我们监控多tomcat实例,如果一个个实例地添加或许可以完成当前需求.但是日后随着实例的增多,再手动一个个去添加就十分不方便了.这时候需要自动发现这个功能,来帮助我们自动添加监 ...

  3. zabbix主机自动发现和监控

    在主机较多的时候,配置主机自动发现并加入监控可以代替手动的添加主机,减轻工作量,自动发现由服务端主动发起,Zabbix Server开启发现进程,定时扫描局域网中IP服务器.设备.可以根据需要,在对主 ...

  4. Zabbix 自动发现并监控磁盘IO、报警 引言

    引言 Zabbix并没有提供模板来监控磁盘的IO性能,所以我们需要自己来创建一个,由于一台服务器中磁盘众多,如果只有一两台可以手动添加,但服务集群达到几十那就非常麻烦,因此需要利用自动发现这个功能,自 ...

  5. zabbix自动发现与监控内存和CPU使用率最高的进程,监测路由器

    https://cloud.tencent.com/info/488cfc410f29d110c03bcf0faaac55b2.html         (未测试) https://www.cnblo ...

  6. Zabbix - LINUX下CPU,硬盘,流量,内存监控

    转载自:https://blog.csdn.net/jxzhfei/article/details/47191431 1.LINUX下zabbix客户端安装 [root@mongodb114 ~]# ...

  7. zabbix3.2自动发现批量监控redis端口状态

    使用nmap提示被防火墙阻挡,实际没有启用防火墙 [root@eus_chinasoft_haproxy:/usr/local/aegis]# nmap 172.20.103.202 -p 7000 ...

  8. Prometheus + Consul 自动发现服务监控

    一.Prometheus支持的多种服务发现机制(常用如下) static_configs: 静态服务发现 file_sd_configs: 文件服务发现 dns_sd_configs: DNS 服务发 ...

  9. 【Zabbix】Zabbix Server自动发现

    Zabbix自动发现 由于有上百台的虚拟机需要监控,如果一个个去添加配置,费时费力.Zabbix的自动发现,可以自动发现需要监控的机器,监控相应指标. 前置条件 安装部署好Zabbix Server. ...

随机推荐

  1. python_22_enumerate

    a=['a','d','f','g'] for i in enumerate(a): print(i) #enumerate 把列表的下表以元组的形式取出来 #结果 # (0, 'a') # (1, ...

  2. python基础一 day17 作业

    # 3.用map来处理字符串列表,把列表中所有人都变成sb,比方alex_sbname=['alex','wupeiqi','yuanhao','nezha']# def func(item):# r ...

  3. CUDA中记录执行时间-GPU端

    事件eventcudaEvent_t start,stop;cudaEventCreate(&start);cudaEventCreate(&stop);cudaEventRecord ...

  4. SQL小知识_长期总结

    1. 左联接右联接区别 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录inner ...

  5. 01_15_Struts2_带参数的结果集

    01_15_Struts2_带参数的结果集 1. 背景说明 服务器端页面跳转的时候,通过struts提供的标签的valuestack可以直接取.服务器端的转发,valuestack的对象属性可以共享. ...

  6. GreenPlum查看表和数据库大小

    表大小 zwcdb=# select pg_size_pretty(pg_relation_size('gp_test')); pg_size_pretty ---------------- 1761 ...

  7. hello spring boot neo4j

    新建springboot 项目: https://www.cnblogs.com/lcplcpjava/p/7406253.html bug fixs: 1. Maven Configuration ...

  8. Linux 下上传下载命令,SCP,SFTP,FTP

    scp 帮助命令: man scp scp功能: 下载远程文件或者目录到本地, 如果想上传或者想下载目录,最好的办法是采用tar压缩一下,是最明智的选择. 从远程主机 下载东西到 本地电脑 拷贝文件命 ...

  9. 【树状数组】CF961E Tufurama

    挺巧妙的数据结构题(不过据说这是一种套路? E. Tufurama One day Polycarp decided to rewatch his absolute favourite episode ...

  10. A1035 Password (20)(20 分)

    A1035 Password (20)(20 分) To prepare for PAT, the judge sometimes has to generate random passwords f ...