You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Raid告警捕获Python脚本添加Nagios兼容监控逻辑

脚本优化调整

现有脚本存在逻辑错误和不符合Nagios插件规范的问题,先做如下修改:

  1. 修正check_MegaRaid函数的判断逻辑,原代码仅判断critical_status是否为0,failed_status只要非空就为真,会导致正常场景误判
  2. 统一输出格式为状态标识: 详情,方便Nagios直接展示
  3. 对齐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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 04:45:04