1. 安装MegaCli及使用方法
a. 安装
- centos 7
yum install http://sarepos.cpanel.net/centos/7/noarch/MegaCli-8.07.14-1.el7.centos.noarch.rpm
- centos 6
yum install http://sarepos.cpanel.net/centos/6/noarch/MegaCli-8.07.14-1.noarch.rpm
- redhat 5
由于之前的omsa与MegaCli有冲突,所以需要先卸载omsa。
wget http://ftp.cs.stanford.edu/pub/rpms/centos/5.8/x86_64/Lib_Utils-1.00-08.noarch.rpm
wget http://ftp.cs.stanford.edu/pub/rpms/centos/5.8/x86_64/MegaCli-8.00.46-1.i386.rpm
yum remove srvadmin*
rpm -ivh Lib_Utils-1.00-08.noarch.rpm
rpm -ivh MegaCli-8.00.46-1.i386.rpm
b. 使用方法
/opt/MegaRAID/MegaCli/MegaCli64 -LDInfo -Lall -aALL # 查raid级别
/opt/MegaRAID/MegaCli/MegaCli64 -AdpAllInfo -aALL # 查raid卡信息
/opt/MegaRAID/MegaCli/MegaCli64 -PDList -aALL # 查看硬盘信息
/opt/MegaRAID/MegaCli/MegaCli64 -AdpBbuCmd -aAll # 查看电池信息
/opt/MegaRAID/MegaCli/MegaCli64 -FwTermLog -Dsply -aALL # 查看raid卡日志
/opt/MegaRAID/MegaCli/MegaCli64 -adpCount # 显示适配器个数
/opt/MegaRAID/MegaCli/MegaCli64 -AdpGetTime –aALL # 显示适配器时间
/opt/MegaRAID/MegaCli/MegaCli64 -AdpAllInfo -aAll # 显示所有适配器信息
/opt/MegaRAID/MegaCli/MegaCli64 -LDInfo -LALL -aAll # 显示所有逻辑磁盘组信息
/opt/MegaRAID/MegaCli/MegaCli64 -PDList -aAll # 显示所有的物理信息
/opt/MegaRAID/MegaCli/MegaCli64 -AdpBbuCmd -GetBbuStatus -aALL |grep ‘Charger Status’ # 查看充电状态
/opt/MegaRAID/MegaCli/MegaCli64 -AdpBbuCmd -GetBbuStatus -aALL # 显示BBU状态信息
/opt/MegaRAID/MegaCli/MegaCli64 -AdpBbuCmd -GetBbuCapacityInfo -aALL # 显示BBU容量信息
/opt/MegaRAID/MegaCli/MegaCli64 -AdpBbuCmd -GetBbuDesignInfo -aALL # 显示BBU设计参数
/opt/MegaRAID/MegaCli/MegaCli64 -AdpBbuCmd -GetBbuProperties -aALL # 显示当前BBU属性
/opt/MegaRAID/MegaCli/MegaCli64 -cfgdsply -aALL # 显示Raid卡型号,Raid设置,Disk相关信息
2. 修改zabbix-agent配置文件及测试脚本
a. 修改zabbix-agnet配置文件
将脚本放在 /etc/zabbix/scripts/ 下并修改权限为755。
编辑zabbix-agent配置文件。
vim /etc/zabbix/zabbix_agentd.conf
修改以下选项。
UnsafeUserParameters=1
UserParameter=pdjson,python /etc/zabbix/scripts/linuxMega.py -c pdjson
重启zabbix-agent。
systemctl restart zabbix-agent
配置zabbix用户sudo权限,并且允许无tty执行命令。
vim /etc/suders
在各自字段下,添加以下内容。
# Defaults specification
Defaults:zabbix !requiretty
## Allow root to run any commands anywhere
zabbix ALL=(ALL) NOPASSWD:ALL
b. 在zabbix-server服务器上测试脚本是否能正常运行。
zabbix_get -s xx.xx.xx.xx -k pdjson
如果正常会返回以下结果:
{"data": [{"{#PHYSICALDISK}": "SlotNumber6"}, {"{#PHYSICALDISK}": "SlotNumber7"}, {"{#PHYSICALDISK}": "SlotNumber4"}, {"{#PHYSICALDISK}": "SlotNumber5"}, {"{#PHYSICALDISK}": "SlotNumber2"}, {"{#PHYSICALDISK}": "SlotNumber3"}, {"{#PHYSICALDISK}": "SlotNumber0"}, {"{#PHYSICALDISK}": "SlotNumber1"}]}
3. 新建模版并应用到主机
新建模版 Template LinuxDisk Monitor v1
建立自动发现规则
20180111-015751.png监控项原型里建立采集器,其中Firmwarestate为字符类型,其他为数字。
20180111-015828.png在主机上添加模版并应用。
4. 在被监控主机上新建crontab任务,发送数据。
a. 新建用户并修改权限
由于脚本执行sudo需要tty,权限所以要修改/etc/sudoers的设置,但是给root账户不需要tty就可以执行sudo的权限比较不安全,所以新建用户opsmaster用来执行脚本,经测试nologin的用户crontab不能正常执行。
vim /etc/sudoers
添加以下内容:
# Defaults specification
Defaults:opsmaster !requiretty
## Allow root to run any commands anywhere
opsmaster ALL=(ALL) NOPASSWD:ALL
b. 添加crontab
给opsmaster用户添加一条crontab任务。
crontab -u opsmaster -e
添加以下内容:
59 */2 * * * python /etc/zabbix/scripts/linuxMega.py -c sendpddata
python如果是3.5的话则不能运行;python是2.7的话可以向/etc/zabbix/scripts/disksmonitor.log 文件里记日志;python是2.6.6的话可以运行,但是不会向/etc/zabbix/scripts/disksmonitor.log里写日志
查看crontab里的任务是否执行,可以查看/var/log/cron 是否有对应记录。
如果crontab执行了,却没有数据,在/var/spool/mail/ 查看对应用户的文件,可看到详细报错信息。
附:目前服务器上使用的脚本
#!/bin/bash
#!/usr/bin/python2.6
# -*- coding: utf-8 -*-
import subprocess, re, logging, tempfile, os, json, optparse
logfile = "/etc/zabbix/scripts/disksmonitor.log"
logger = logging.getLogger()
logging.basicConfig(filename=logfile,level="DEBUG",format='%(asctime)s %(levelname)s: %(message)s')
conf = '/etc/zabbix/zabbix_agentd.conf'
out_bytes = subprocess.Popen(['sudo','/opt/MegaRAID/MegaCli/MegaCli64','-PDList','-aALL'], stdout=subprocess.PIPE).communicate()[0]
fjson = re.split('[:,\n]',out_bytes)
logger.debug(fjson)
noblank = []
for i in fjson:
i = re.sub('\s','',i)
noblank.append(i)
list2 = {}
t = [i for i, x in enumerate(noblank) if x == 'SlotNumber']
q = [i for i, x in enumerate(noblank) if x == 'Firmwarestate']
m = [i for i, x in enumerate(noblank) if x == 'MediaErrorCount']
...skipping...
if return_code == 1:
logger.error(out)
logger.error(err)
else:
logger.debug(err)
logger.debug(out)
return return_code
def main():
choices = ['pdjson','sendpddata']
parser = optparse.OptionParser()
parser.add_option('--check','-c', type='choice', choices=choices, help='Type of check')
(options, args) = parser.parse_args()
if not options.check:
parser.error('input option please')
elif options.check == 'pdjson':
print pdjson()
elif options.check == 'sendpddata':
diskdictmake()
else:
print 'parameter error!'
if __name__ == '__main__':
main()
网友评论