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. 【转】ios输入框被键盘挡住的解决办法

    做IOS开发时,难免会遇到输入框被键盘遮掩的问题.上网上搜索了很多相关的解决方案,看了很多,但是由衷的觉得太麻烦了. 有的解决方案是将视图上的所有的东西都添加到一个滚动视图对象( UIScrollVi ...

  2. 使用VSCode搭建TypeScript开发环境 (重点)

    下载TypeScript 在CMD(Windows系统)或者终端(macOS系统)中输入一下命令: npm install -g typescript 下载VSCode VSCode是我使用过最棒的编 ...

  3. Spring学习记录(三)

    一.AOP的整理总结 aop面向切面编程 横向重复代码,纵向抽取 动态代理 1.通过动态代理可以体现aop思想 2.为什么要哦用动态代理:对目标对象中的方法进行增强 spring aop开发 spri ...

  4. R+hadoop

    这里面的配置 http://www.rdatamining.com/big-data/r-hadoop-setup-guide root@kali:~/hadoop_home/hadoop-1.2.1 ...

  5. C#箴言之用属性来访问类的私有成员

    在程序中,难免要访问某个对象的私有成员.那么以前实现这类功能的方法有两种,第一种方法最简单,就是把成员访问符从“private”改为“public”即可:而另一个就是提供公有的成员访问函数来进行访问. ...

  6. Uva 组装电脑 12124 - Assemble

    主要运用二分法查找最优解 #include<iostream> #include<string> #include<vector> #include<map& ...

  7. CentOS Linux 安装IPSec+L2TP

    第二层隧道协议L2TP(Layer 2 Tunneling Protocol)是一种工业标准的Internet隧道协议,它使用UDP的1701端口进行通信.L2TP本身并没有任何加密,但是我们可以使用 ...

  8. 22.VUE学习之-replice删除当前评论条数

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. python学习——StringIO和BytesIO

    StringIO 很多时候,数据读写不一定是文件,也可以在内存中读写. StringIO顾名思义就是在内存中读写str. 要把str写入StringIO,我们需要先创建一个StringIO,然后,像文 ...

  10. CRM第一篇:权限组件之权限控制

    一.权限组件(1):一级菜单 二.权限组件(2):二级菜单 三.权限组件(3):默认选中非菜单(二级菜单) 四.权限组件(4):给动态菜单增加面包屑导航 五.权限组件(5):权限粒度控制到按钮 六.权 ...