您的位置:首页 > 运维架构

运维监控平台NRPE插件功能详解

2017-03-22 00:00 661 查看
摘要: 技术分享

本文内容有参考部分网络资料

一 介绍nrpe架构

NRPE总共由两部分组成:

– check_nrpe 插件,位于在监控主机上

– NRPE daemon,运行在远程的linux主机上(通常就是被监控机)

按照上图,整个的监控过程如下:

当nagios需要监控某个远程linux主机的服务或者资源情况时

1.nagios会运行check_nrpe这个插件,告诉它要检查什么.

2.check_nrpe插件会连接到远程的NRPE daemon,所用的方式是SSL

3.NRPE daemon会运行相应的nagios插件来执行检查

4.NRPE daemon将检查的结果返回给check_nrpe插件,插件将其递交给nagios做处理.

注意:NRPE daemon需要nagios插件安装在远程的linux主机上,否则,daemon不能做任何的监控.

二 Nagios监控平台监控内容划分

1) 登录用户数量监控

2) 系统负载情况监控

3) 磁盘根分区使用情况监控

4) 系统总进程数监控

5) 系统僵尸进程数监控

6) Hswx服务进程监控

7) 系统内存使用情况监控

8) 网卡流量情况监控

9) http请求civil响应状态监控

三 监控主机对check_nrpe定义的内容说明

在commands.cfg中需声明监控插件的使用方法,举例:check_nrpe

vi /usr/local/nagios/etc/commands.cfg

# 'check_nrpe ' command definition

define command{

command_name check_nrpe

command_line /usr/local/nagios/libexec/check_nrpe -H $HOSTADDRESS$ -c $ARG1$ -t 60

}

配置描述:

command_name check_nrpe

定义命令名称为check_nrpe,在services.cfg或host.cfg定义服务内容时要使用这个名称.

command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$

这是定义实际运行的插件程序.这个命令行的书写要完全按照check_nrpe这个命令的用法.不知道用法的就用check_nrpe –h查看

-c后面带的$ARG1$参数是传给nrpe daemon执行的检测命令,之前说过了它必须是被监控机nrpe.cfg中所定义的那5条命令中的其中一条.在command.cfg中使用check_nrpe的时候要用!带上这个参数

-t 作用是运行脚本超时时间设定,默认是10s,但有些监控命令执行时间超过10s会返回CHECK_NRPE: Socket timeout after 10 seconds错误,解决方法,手工指定超时时间,暂时设置为一分钟。该参数是针对自定义插件脚本所设,后面内容会提到。

监控主机报警相关配置

编辑command.cfg

1. 通过邮件方式

# 'notify-host-by-email' command definition

define command{

command_name notify-host-by-email

command_line /usr/bin/printf "%b" "***** Nagios *****\n\nProject Name :$HOSTGROUPALIAS$\nNotification Type: $NOTIFICATIONTYPE$\nHostgroup: $HOSTGROUPALIAS$\nHost: $HOSTNAME$\nState: $HOSTSTATE$\nAddress: $HOSTADDRESS$\nInfo: $HOSTOUTPUT$\n\nDate/Time: $LONGDATETIME$\n" | /bin/mail -s "** $NOTIFICATIONTYPE$ Host Alert: $HOSTNAME$ is $HOSTSTATE$ **" $CONTACTEMAIL$ > /home/nagios/host.out

}

# 'notify-service-by-email' command definition

define command{

command_name notify-service-by-email

command_line /usr/bin/printf "%b" "***** Nagios *****\n\nProject Name :$HOSTGROUPALIAS$\nNotification Type: $NOTIFICATIONTYPE$\n\nService: $SERVICEDESC$\nHostgroup: $HOSTGROUPALIAS$\nHost: $HOSTALIAS$\nAddress: $HOSTADDRESS$\nState: $SERVICESTATE$\n\nDate/Time: $LONGDATETIME$\n\nAdditional Info:\n\n$SERVICEOUTPUT$\n" | /bin/mail -s "** $NOTIFICATIONTYPE$ Service Alert: $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$ **" $CONTACTEMAIL$ > /home/nagios/service.out

}

2. 通过短信方式

# 'notify-host-by-smsgw' command definition

define command{

command_name notify-host-by-sms

command_line /usr/bin/python /usr/local/nagios/libexec/sendmail_hhy.py $CONTACTPAGER$ "尊敬的用户,运维监控平台告警通知, 类别:$NOTIFICATIONTYPE$ 组:$HOSTGROUPALIAS$ 主机:$HOSTNAME$ 当前状态:$HOSTSTATE$ IP地址:$HOSTADDRESS$【>中国移动和慧眼】"

# command_line /usr/bin/python /usr/local/nagios/libexec/sendmail.py $CONTACTPAGER$ "{"template":"HostMonit","通报类型":$NOTIFICATIONTYPE$,"项目名称":$HOSTGROUPALIAS$,"主机名":$HOSTNAME$,"当前状态":$HOSTSTATE$,“IP地址":$HOSTADDRESS$}"

}

# 'notify-service-by-smsgw' command definition

define command{

command_name notify-service-by-sms

command_line /usr/bin/python /usr/local/nagios/libexec/sendmail_hhy.py $CONTACTPAGER$ "尊敬的用户,运维监控平台告警通知, 类别:$NOTIFICATIONTYPE$ 组:$HOSTGROUPALIAS$ 主机:$HOSTALIAS$ IP地址:$HOSTADDRESS$ 当前状态:$SERVICESTATE$ 监控项:$SERVICEDESC$ 描述: $SERVICEOUTPUT$ 【中国移动和慧眼】"

# command_line /usr/bin/python /usr/local/nagios/libexec/sendmail.py $CONTACTPAGER$ "{"template":"ServiceMonit","通报类型":$NOTIFICATIONTYPE$,"项目名称":$HOSTGROUPALIAS$,"主机名":$HOSTNAME$,"IP地址":$HOSTADDRESS$,"监控项":$SERVICEDESC$,"描述":$SERVICEOUTPUT$}"

}

四、被监控机配置监控插件内容

vi /usr/local/nagios/etc/nrpe.cfg

command[check_users]=/usr/local/nagios/libexec/check_users -w 5 -c 10

command[check_load]=/usr/local/nagios/libexec/check_load -w 15,10,5 -c 30,25,20

command[check_main_partition]=/usr/local/nagios/libexec/check_disk -w 20% -c 10% -p /

command[check_zombie_procs]=/usr/local/nagios/libexec/check_procs -w 5 -c 10 -s Z

command[check_total_procs]=/usr/local/nagios/libexec/check_procs -w 150 -c 200

配置描述:

command[此处的功能名称需要与监控主机中host.cfg的一致]

五、Nrpe插件详解

先用表格列举一下我的监控对象和阀值:

登录用户: check_users -w 5 -c 10 (w为警告,c为危急)
系统负载: check_load -w 15,10,5 -c 30,25,20 (1分钟,5分钟,15分钟大于对应的等待进程数则警告或危急)
磁盘占用率: check_disk -w 20% -c 10% -p / (根分区剩余空间为总大小的20%警告, 10%危急,-p后是根分区)
检测僵尸进程: check_zombie _procs -w 5 -c 10 -s Z (有5个僵尸进程报警告,10个报危急)
检测总进程数: check_total_procs -w 150 -c 200 (总进程到150个警告,200个报危急)

标红5项为默认监控。

除此之外列举几个额外插件使用方法:

主机存活: check_ping -w 3000.0,80% -c 5000.0,100% -p 5 (3000毫秒响应时间内, 丢包率超过80%报警告,5000毫秒响应时间内,丢包率超过 100%报危急,一共发送5个包)

脚本检测磁盘I/O: check_iostat -w 5 –c 10 (磁盘I/O的iowait超过5%报警告,超过10%报危急)

脚本检测内存剩余: check_mem -w 90% -c 95% (内存空闲率90%以上报警告,95%以上报危急)
检测交换分区使用率: check_swap -w 20% -c 10% (交换分区剩余空间为总大小的20%警告,10%危急)
应 用 服 务 监 控 监控服务端口: check_tcp -H localhost -p 80 (主机与对应的端口号)
监控页面响应时间: check_http -H localhost -u http:\/\/localhost/test.jsp –w 5 –c 10 (检查页面,超过5s报警告,超过10s报危急)
脚本检测IP连接数: check_ips -w 200 –c 250 (IP连接数超过200报警告,超过250报危急)
流量 监控 监控server流量: Check_traffic -V 2c -C public -H localhost -I 2 -w 12,30 -c 15,35 -M –b (snmp版本,用户,主机,对应网卡,警告阀值,危急阀值)

补充mysql监控插件:

command[check_mysql_status]=/usr/local/nagios/libexec/check_mysql –H 127.0.0.1 -u dh -p 123456 -d hswx

附件1:自定义插件

1) 鉴于nagios自带的监控插件大都针对操作系统或通用服务运行情况,故编写一个针对本公司hswx产品服务进程检查的自定义插件脚本check_pid.sh。

备注:等待59秒检测进程是否存在,不超过NRPE设定的超时时间

代码如下:

#!/bin/bash

#########################

# Author: zhousy

# Date: 2015.07.22

#########################

LANG=zh_CN.UTF-8

LANGUAGE=zh_CN.GB18030:zh_CN.GB2312:zh_CN

. /root/.bash_profile

#返回0表示正常,返回1表示报警,返回2表示严重,返回3表示未定义

STATE_OK=0

STATE_WARNING=1

STATE_CRITICAL=2

#STATE_UNKNOWN=3

usage(){

echo "正确用法: 脚本名 -m 模块名"

echo "支持模块:front,back,nginx,dms,mts,ads,sgs,grs,hsdgw,mes,mrs,jsgs"

}

#检查是否带有参数

if [ $# -lt 2 ]

then

usage;

exit 0

fi

# read input

while [ $# -gt 0 ]

do

case $1 in

-m)

shift

module=$1

;;

*)

echo "输入参数不正确"

usage;

exit 0

esac

shift

done

#模块分类

Categray(){

if [ "$module" == "mrs" ];then

PID=$(/bin/ps aux |grep $module".jar" |grep -v grep |awk '{print $2}')

elif [ "$module" == "jsgs" ];then

PID=$(/bin/ps aux |grep ${module:1:3}".jar" |grep -v grep |awk '{print $2}')

elif [ "$module" == "front" -o "$module" == "back" ];then

PID=$(/bin/ps aux |grep $module"-tomcat" |grep -v grep |awk '{print $2}')

elif [ "$module" == "nginx" ];then

PID=$(/bin/ps aux |grep 'nginx:\ master' |grep -v grep |awk '{print $2}')

else

PID=$(/sbin/pidof $module)

fi

}

#定时器

Set_Timer(){

while true

do

sleep $1

break

done

}

#检测进程状态

Check_Status(){

Categray;

if [ -z "$PID" ]

then

Set_Timer 59

Categray

if [ -z "$PID" ]

then

echo "CRITICAL - The $module process is dead!"

exit $STATE_CRITICAL

else

echo "WARNING - The $module process is restart"

exit $STATE_WARNING

fi

else

echo "OK - The $module process is running"

exit $STATE_OK

fi

}

#入参指定模块名

case $module in

front)

Check_Status;

;;

back)

Check_Status;

;;

nginx)

Check_Status;

;;

dms)

Check_Status;

;;

hsmts)

Check_Status;

;;

ads)

Check_Status;

;;

sgs)

Check_Status;

;;

grs)

Check_Status;

;;

hsdgw)

Check_Status;

;;

mes)

Check_Status;

;;

mrs)

Check_Status;

;;

jsgs)

Check_Status;

;;

*)

echo "请输入模块列表中指定的选项,列表外的产品暂不支持"

exit 0

;;

esac

监控主机增加配置内容:

command.cfg中声明插件的使用方法

# 'check pid' command definition

define command{

command_name check_pid

command_line $USER1$/check_pid.sh -m $ARG1$

}

说明: $ARG1$,即第一个入参,需要指明服务模块的名称。

host.cfg中声明check_nrpe调用方法

#******************************************************************

#Monitor pid of the service

#******************************************************************

define service{

use generic-service

host_name ZJHZ-HHY-RS1

service_description Rs Service Pid

check_command check_nrpe!check_rs_pid

}

注意:标红字体要与被监控机中nrpe.cfg中定义的监控名称保持一致。

模块列表:

{ rs, front , back , dms, mts, ads, sgs, grs, hsdgw, mrs, jsgs, mes, hls}

被监控机增加配置项

nrpe.cfg中声明插件具体执行参数

command[check_rs_pid]=/usr/local/nagios/libexec/check_pid.sh -m nginx

command[check_front_pid]=/usr/local/nagios/libexec/check_pid.sh -m front

command[check_back_pid]=/usr/local/nagios/libexec/check_pid.sh -m back

command[check_dms_pid]=/usr/local/nagios/libexec/check_pid.sh -m dms

command[check_hsmts_pid]=/usr/local/nagios/libexec/check_pid.sh -m hsmts

command[check_ads_pid]=/usr/local/nagios/libexec/check_pid.sh -m ads

command[check_sgs_pid]=/usr/local/nagios/libexec/check_pid.sh -m sgs

command[check_grs_pid]=/usr/local/nagios/libexec/check_pid.sh -m grs

command[check_hsdgw_pid]=/usr/local/nagios/libexec/check_pid.sh -m hsdgw

command[check_mrs_pid]=/usr/local/nagios/libexec/check_pid.sh -m mrs

command[check_jsgs_pid]=/usr/local/nagios/libexec/check_pid.sh -m jsgs

command[check_mes_pid]=/usr/local/nagios/libexec/check_pid.sh -m mes

command[check_hls_pid]=/usr/local/nagios/libexec/check_pid.sh -m nginx

command[check_fts_pid]=/usr/local/nagios/libexec/check_pid.sh -m fts

command[check_mq_pid]=/usr/local/nagios/libexec/check_pid.sh -m mq

command[check_rtsp_pid]=/usr/local/nagios/libexec/check_pid.sh -m rtsp

2) civil响应状态插件

配置修改:

Nrpe:

command[check_civil_status]=/usr/bin/python /usr/local/nagios/libexec/check_civil.py civil

Nagios-Server:

host.cfg中声明check_nrpe调用方法

#************************************************************************************

#Monitor the service of civil status

#************************************************************************************

define service{

use generic-service

host_name ZJHZ-HHY-WEB1

service_description Civil响应状态

check_command check_nrpe!check_civil_status

}

command.cfg中声明插件的使用方法

# 'check_civil_status' command definition

define command{

command_name check_civil_status

command_line /usr/bin/python $USER1$/check_civil.py civil

}

附件2:第三方插件脚本

监控内存:check_mem.sh

chmod +x check_mem.sh

chown nagios.nagios check_mem.sh

监控网卡流量:check_net_traffic.sh

chmod +x check_net_traffic.sh

chown nagios.nagios check_net_traffic.sh

网卡阀值计算:

千兆网卡:1000Mb/s = 125MB/s

双网卡绑定:能力值2倍 2000Mb/s = 250MB/s

command.cfg中声明插件的使用方法

# 'check_mem' command definition

define command{

command_name check_mem

command_line $USER1$/check_mem.sh -w $ARG1$ -c $ARG2$

}

# 'check_net_traffic' command definition

define command{

command_name check_net_traffic

command_line $USER1$/check_net_traffic.sh -d $ARG1$ -w $ARG2$ -c $ARG3$

}

监控主机host.cfg配置新增

#************************************************************************************

#Monitor the memory

#************************************************************************************

define service{

use generic-service

host_name ZJDH-JSCNVIEW-WEB-01

service_description 内存占用率

check_command check_nrpe!check_mem

}

#************************************************************************************

#Monitor the net traffic

#************************************************************************************

define service{

use generic-service

host_name ZJDH-JSCNVIEW-WEB-01

service_description 网卡流量

check_command check_nrpe!check_net_traffic

}

被监控机nrpe.conf配置新增

command[check_mem]=/usr/local/nagios/libexec/check_mem.sh -w 10 -c 5

command[check_net_traffic]=/usr/local/nagios/libexec/check_net_traffic.sh -d bond0 -w 80M -c 100M

# 2016-06-06新增

监控磁盘IO: check_diskio.sh

chmod +x check_diskio.sh

chown nagios.nagios check_diskio.sh

监控MYSQL死锁: check_deadlock.py

chmod +x check_deadlock.py

chown nagios.nagios check_deadlock.py

command.cfg中声明插件的使用方法

# 'check_diskio' command definition

define command{

command_name check_diskio

command_line $USER1$/check_diskio.sh –d $ARG1$ -w $ARG2$ -c $ARG3$

}

# 'check_mysql_errlog' command definition

define command{

command_name check_log_except

command_line $USER1$/check_deadlock.py -f $ARG1$

}

监控主机host.cfg配置新增

#************************************************************************************

#Monitor the diskio

#************************************************************************************

define service{

use generic-service

host_name ZJHZ-HHY-MYSQL-01

service_description 磁盘IO

check_command check_nrpe!check_diskio

}

#************************************************************************************

#Monitor the mysql except

#************************************************************************************

define service{

use generic-service

host_name ZJHZ-HHY-MYSQL-01

service_description MYSQL死锁

check_command check_nrpe!check_log_except

}

被监控机nrpe.conf配置新增

command[check_diskio]=/usr/local/nagios/libexec/check_diskio.sh -d sda2 -w 80 -c 90

command[check_log_except]=sudo python /usr/local/nagios/libexec/check_deadlock.py -f /home/nagios/mycheck.log

FAQ:

如果提示:NRPE: Unable to read output

原因:监控插件执行权限问题

解决:为脚本赋予执行权限,如果需要sudo执行的,要检查一下nagios用户是否加入sudo的免密切换参数配置。

echo "nagios ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: