如何为Raid告警捕获Python脚本添加Nagios兼容监控逻辑
脚本优化调整
现有脚本存在逻辑错误和不符合Nagios插件规范的问题,先做如下修改:
- 修正
check_MegaRaid函数的判断逻辑,原代码仅判断critical_status是否为0,failed_status只要非空就为真,会导致正常场景误判 - 统一输出格式为
状态标识: 详情,方便Nagios直接展示 - 对齐Nagios标准退出码规则:0=OK、1=WARNING、2=CRITICAL、3=UNKNOWN,无RAID场景返回3,可根据业务需求补充返回1的告警场景
#!/usr/bin/python import subprocess import os, sys #Check python present or not # dnf install python3.6-stack # export PATH=/opt/python-3.6/bin:$PATH def check_MegaRaid(): # Next script failed=subprocess.run(["sudo /opt/MegaRAID/MegaCli/MegaCli64 -AdpAllInfo -aALL | grep -i 'Failed Disks' | awk -F':' '{print $2}'"], shell=True, stdout=subprocess.PIPE, universal_newlines=True) failed_status = failed.stdout.strip() critical=subprocess.run(["sudo /opt/MegaRAID/MegaCli/MegaCli64 -AdpAllInfo -aALL | grep -i 'Critical Disks' | awk -F':' '{print $2}'"], shell=True, stdout=subprocess.PIPE, universal_newlines=True) critical_status = critical.stdout.strip() if failed_status == "0" and critical_status == "0": print("OK: Raid check all OK" ) sys.exit(0) else: print(f"CRITICAL: Failed Disks: {failed_status}, Critical Disks: {critical_status}") sys.exit(2) def check_raid(): process=subprocess.run(["sudo /sbin/mdadm --detail /dev/md127 | grep -i state | grep -w clean, | awk -F',' '{print $2}' |sed -e 's/^[ \t]*//' "], shell=True, stdout=subprocess.PIPE, universal_newlines=True) output = process.stdout.strip() check_process=subprocess.run(["sudo /sbin/mdadm --detail /dev/md127 | grep -i state | awk -F':' '{print $2}' |sed -e 's/^[ \t]*//' "], shell=True, stdout=subprocess.PIPE, universal_newlines=True) check = check_process.stdout.strip() if output == 'degraded': print(f"CRITICAL: Raid disk state is {output}") sys.exit(2) elif check == 'clean': print("OK: Raid check all OK") sys.exit(0) else: check_MegaRaid() #Check whether system configure raid process=subprocess.run(["sudo cat /GEO_VERSION | grep -i raid | awk -F'Layout:' '{print $2}' | sed 's/[0-9]*//g' | sed -e 's/^[ \t]*//'"], shell=True, stdout=subprocess.PIPE, universal_newlines=True) raid_value = process.stdout.strip() if raid_value == 'raid': check_raid() else: print("UNKNOWN: There is no raid configured in this system") sys.exit(3)
Nagios配置步骤
- 部署脚本到被监控端:将修改后的脚本放到被监控端的Nagios插件目录,通常为
/usr/local/nagios/libexec/,赋予执行权限:chmod +x /usr/local/nagios/libexec/check_raid.py - 配置sudo免密:编辑被监控端
/etc/sudoers文件,添加如下配置,避免nagios用户执行命令时需要输入密码:
nagios ALL=(ALL) NOPASSWD: /opt/MegaRAID/MegaCli/MegaCli64, /sbin/mdadm, /bin/cat /GEO_VERSION
- 配置NRPE(如果使用NRPE模式监控):编辑被监控端NRPE配置文件
/usr/local/nagios/etc/nrpe.cfg,添加命令定义:
command[check_raid]=/usr/local/nagios/libexec/check_raid.py
修改完成后重启NRPE服务生效。
- 服务端添加监控项:编辑Nagios服务端对应主机的服务配置文件,添加如下服务定义:
define service { use generic-service host_name 替换为实际主机名 service_description RAID状态检查 check_command check_nrpe!check_raid notifications_enabled 1 check_interval 5 retry_interval 1 max_check_attempts 3 notification_interval 30 notification_period 24x7 notification_options w,u,c,r contact_groups admins }
- 验证配置并重启:执行
/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg验证配置无错误后,重启Nagios服务即可。
Nagios本身原生支持捕获插件退出码并映射对应状态:退出码0对应OK(绿色)、1对应WARNING(黄色)、2对应CRITICAL(红色)、3对应UNKNOWN(橙色),脚本的标准输出内容会直接展示在服务状态详情页,无需额外配置。
内容的提问来源于stack exchange,提问作者Suresh Ravi
相关产品推荐
相关产品推荐

