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. 2018.2.8 php实现qq登陆接口

    PHP实现QQ登录的原理和实现过程 2018-02-08 学习与分享 PHP自学中心 第三方登录,就是使用大家比较熟悉的比如QQ.微信.微博等第三方软件登录自己的网站,这可以免去注册账号.快速留住用户 ...

  2. python 线程的调用方式

    python 线程的调用方式 #!/usr/bin/env python #-*- coding:utf-8 -*- # author:leo # datetime:2019/5/24 9:44 # ...

  3. 浏览器 DNS缓存与DNS prefetch (DNS预解析)

    浏览器 DNS缓存 浏览器DNS缓存的时间跟DNS服务器返回的TTL值无关. 注:TTL(Time-To-Live),就是一条域名解析记录在DNS服务器中的存留时间. 浏览器在获取网站域名的实际IP地 ...

  4. Oracle 自动生成hive建表语句

    从 oracle 数据库导数到到 hive 大数据平台,需要按照大数据平台的数据规范,重新生成建表的 SQL 语句,方便其间,写了一个自动生成SQL的存储过程. ① 创建一张表,用来存储源表的结构,以 ...

  5. java POI往word文档中指定位置插入表格

    1.Service  demo import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.a ...

  6. centos7安装phpstudy

    操作系统:CentOS 7 x86_64 SSH登录工具:FinalSHell 2.9.7 一.安装phpstudy 1.下载完整版: wget -c http://lamp.phpstudy.net ...

  7. 科学计算库Numpy——文件读写

    读文件 要读取的文件 有分隔符的文件 备注:delimiter分隔符. 有多余行的文件 备注:skiprows去掉几行. 指定列 备注:usecols指定使用哪几列. 写文件 保存后的文件 备注:fm ...

  8. ubuntu 压缩 解压 命令大全

    ubuntu下文件压缩/解压缩命令总结 http://blog.csdn.net/luo86106/article/details/6946255 .gz 解压1:gunzip FileName.gz ...

  9. Python的while else

    python中有一个其独有的功能,while else. 它的作用是判断是循环是否被终止,如果没有被终止,那么就会执行else,反之则不会执行.还是用一段代码来解释吧 else被执行: count = ...

  10. 动态规划:HDU1003-Max Sum(最大子序列和)

    Max Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Su ...