×

微信扫一扫,快捷登录!

监控平台——Nagios

标签: 监控
来自:网络



安装完成后的一些情况准备工作开始安装Nagios创建帐号下载Nagios和插件编译安装Nagios定制配置配置web接口编译安装Nagios插件启动Nagios登录Nagios1、安装硬件传感器监控软件sensors2、运行sensors-detect进行传感器检测3、运行sensors看是否能读取数据,如下像下面这样表示正常:4、#vi/usr/local/nagios/libexec/check_cputemp5、赋予上述脚本执行权限:6、配置nrpe.cfg,添加如下一行:7、在Nagios服务器配置服务:1.DBI的安装2.DBD的安装3.编译安装NDOUtils4.为NDOUtils创建数据库5.编辑配置文件6.启动ndo2db7.重启动nagios8、遇到问题:1、准备NRPEforHP-UX软件和用户:1.1准备软件1.2建立NRPE用户:2、在HP-UX上安装NRPE:3、配置nrpe:3.1配置nrpe主配置文件/opt/nrpe/etc/nrpe.conf:3.2将NRPE配置为inetd管理的进程:4、编写内存监控脚本:5、启动NRPE:5.1方法一:5.2方法二:6、测试NRPE:6.1在被监控服务器上查看服务是否正常启动:6.2在Nagios服务器上测试联系NRPE:监控效果(点击图片放大查看):一、调优:1.1调整监控的灵敏度:1.2服务和主机依赖:服务依赖定义语法:主机间依赖定义:二、使用pnpnagios实现对性能数据绘图:三、Nagios的权限和通知功能加强:3.1使用LDAP认证:3.1.1在域控制器上特定OU下建立具有Nagios权限的用户组:3.1.2配置Nagios通过LDAP认证:3.2定义联系人:3.2.1定义联系人:3.2.2定义联系人组:3.2.3使用服务模板和主机模板的方式实现权限管理:编辑主机模板文件:hosttemplates.cfg编辑服务模板文件:servicetemplates.cfg3.3使用Mail和短信双重报警:
安装完成后的一些情况

  • Nagios以及插件将安装在/usr/local/nagios目录
  • Nagios会配置监控本地机器几个方面(CPU负载,磁盘使用率等)nagios安装
  • Nagios可以通过http://nagios_ip/nagios/访问
准备工作
需要以root身份安装Nagios。
确保在CentOS安装了下面几个软件包:

  • Apache
  • PHP
  • GCCcompiler
  • GDdevelopmentlibraries
你可以通过yum完成这些安装工作:

  • #yuminstallhttpdhttpd-develphpopenssl-devel
    #yuminstallgccglibcglibc-common
    #yuminstallgdgd-devel

开始安装Nagios创建帐号
创建nagios用户并创建nagcmd用户组以执行来自web接口的命令,并添加nagios和apache用户到此用户组。

  • #groupaddnagcmd/*建立组nagcmd*/
    #usermod–Gnagcmdapache/*添加用户apache到组nagcmd*/
    #useradd-Gnagcmdnagios/*新建用户nagios并添加到组nagcmd*/
    #passwdnagios/*修改nagios密码*/

下载Nagios和插件
创建下载存储目录:

  • #mkdir~/downloads
  • #cd~/downloads
从网站http://www./download/下载Nagios(英语不好的同学初次安装建议安装中文版)以及插件。
编译安装Nagios

  • #tar-jxvfnagios-cn-3.2.3.tar.bz2
    #cdnagios-cn-3.2.3

运行Nagios配置脚本,并把nagcmd更改为之前所创建的组。

  • #./configure--prefix=/usr/local/nagios--with-nagios-user=nagios--with-nagios-group=nagios--with-command-group=nagcmd

编译源码:

  • #makeall
安装二进制,init脚本,sample配置文件和设置外部命令目录权限。

  • #makeinstall
    #makeinstall-init
    #makeinstall-config
    #makeinstall-commandmode

不要现在执行nagios,下面还有一些需要配置。
定制配置
样式配置文件已经安装在/usr/local/nagios/etc目录,修改联系人为下一步中的管理员并更改email地址。

  • #vi/usr/local/nagios/etc/objects/contacts.cfg

配置web接口
安装NagiosWeb配置文件在Apache的conf.d目录:

  • #makeinstall-webconf

为登录NagiosWeb接口创建nagiosadmin帐号。记住下面你设置的密码,之后登录用到。

  • #htpasswd-c/usr/local/nagios/etc/htpasswd.usersbarlow
    ##我这里使用我的英文名barlow为默认管理员

重启Apache使新配置生效。

  • #servicehttpdrestart

编译安装Nagios插件

  • #cd~/downloads
    #tarxzfnagios-plugins-1.4.16.tar.gz
    #cdnagios-plugins-1.4.16
    #./configure--with-nagios-user=nagios--with-nagios-group=nagios
    #make
    #makeinstall


启动Nagios
设置开机启动:

  • #chkconfig--addnagios
    #chkconfignagioson
    #chkconfighttpdon
    #servicehttpdrestart
    #servicenagiosrestart

测试配置文件是否有错误:

  • #/usr/local/nagios/bin/nagios-v/usr/local/nagios/etc/nagios.cfg

这个命令后面经常会用到,但这么长的命令很难输入也难记,因此我将其添加为别名,方法如下:
#vi/etc/bashrc
最最后添加如下一行:
aliasnagc='/usr/local/nagios/bin/nagios-v/usr/local/nagios/etc/nagios.cfg'##具体如下图
则以后所有用户输入nagc命令就表示执行/usr/local/nagios/bin/nagios-v/usr/local/nagios/etc/nagios.cfg
执行上述命令后如果没有报错(如下图):
立即启动Nagios

  • #servicenagiosstart

登录Nagios
安装已经完成,你可以使用barlow用户以及之前设置的密码通过http://Nagios_IP/nagios/地址登录Nagios后台。
登录后界面如下:
左边菜单栏的顶部有中英文的说明书,根据说明,能完成绝大部分监控配置。
可能存在的问题点:

  • 现象:无法访问
    解决办法:查看防火墙配置是否开放了80端口,
  • 现象:只能打开主页,其他菜单点击后显示“InternalServerError”错误提示
    解决办法:关闭SELinux
    监控监控linux本地主机时,我们可以直接更改配置文件进行监控,如果需要监控的主机与nagios不在同一机器上,即监控远程linux主机时,我们需要借助NRPE插件实现。
    nrpe工作原理图:
    远程主机的操作
    安装支持:
    #yum-yinstallopensslopenssl-devel
    下载NagiosPlugins和NRPE
    创建nagios帐号
    #useraddnagios
    #passwdnagios
    安装nagios-plugin
    #cd/tmp
    #tarxvfznagios-plugins-1.4.16.tar.gz
    #cdnagios-plugins-1.4.16
    #exportLDFLAGS=-ldl
    #./configure--with-nagios-user=nagios--with-nagios-group=nagios--enable-redhat-pthread-workaround
    #make
    #makeinstall
    #chownnagios.nagios/usr/local/nagios
    #chown-Rnagios.nagios/usr/local/nagios/libexec/
    安装NRPE
    #cd/tmp
    #tarxvfznrpe-2.13.tar.gz
    #cdnrpe-2.13
    #./configure
    #makeall
    #makeinstall-plugin
    #makeinstall-daemon
    #makeinstall-daemon-config
    #yuminstallxinetd
    #makeinstall-xinetd
    配置NRPE以守护进程运行
    1、更改/etc/xinetd.d/nrpe文件,设置允许nagios服务器连接,如nagios服务器的ip为192.168.1.2:
    only_from=127.0.0.1192.168.1.2
    2、在/etc/services结尾增加:
    nrpe5666/tcp#NRPE
    3、启动xinetd
    #servicexinetdrestart
    4、验证nrpe是否监听
    #netstat-at|grepnrpe
    5、测试nrpe是否正常运行
    #/usr/local/nagios/libexec/check_nrpe-Hlocalhost
    NRPEv2.13
    6、更改/usr/local/nagios/etc/nrpe.cfg
    nrpe.cfg文件里包含需要监控远程主机的命令,如下面是我的配置:
    #用户登录数
    command[check_users]=/usr/local/nagios/libexec/check_users-w5-c10
    #CPU负载
    command[check_load]=/usr/local/nagios/libexec/check_load-w15,10,5-c30,25,20
    #磁盘空间
    command[check_disk]=/usr/local/nagios/libexec/check_disk-w20-c10-p/dev/sda
    #僵尸进程数
    command[check_zombie_procs]=/usr/local/nagios/libexec/check_procs-w5-c10-sZ
    #进程总数
    command[check_total_procs]=/usr/local/nagios/libexec/check_procs-w150-c200
    #物理内存
    command[check_mem]=/usr/local/nagios/libexec/check_mem-H$HOSTADDRESS$
    #脚本内容见下文
    物理内存检查脚本/usr/local/nagios/libexec/check_mem:
    #!/bin/bash
    #checkmemoryscript
    #Totalmemory
    #byBarlow
    #2014-06-13
    help(){
    echo"Usage:`basename$0`-w<%>-c<%>"
    echo"-wisWARNING%ofusedmem;-cisCRITICAL%ofusedmem!"
    exit3
    }
    TOTAL=`free-m|head-2|tail-1|gawk'{print$2}'`
    #checkmemory
    FREE=`free-m|head-3|tail-1|gawk'{print$4}'`
    USED=`free-m|head-3|tail-1|gawk'{print$3}'`
    #tocalculatefreepercent
    #usetheexpressionfree*100/total
    FREETMP=`expr$FREE\*100`
    USEDTMP=`expr$USED\*100`
    FREE_PERCENT=`expr$FREETMP/$TOTAL`
    USED_PERCENT=`expr$USEDTMP/$TOTAL`
    if[$#-le3];then
    help
    elif![$1=="-w"]&>/dev/null;then
    help
    elif![$3=="-c"]&>/dev/null;then
    help
    fi
    WARNIFNUM(){
    if!["$WARN"=="$OPTARG"];then
    help
    fi
    }
    CRITIFNUM(){
    if!["$CRIT"=="$OPTARG"];then
    help
    fi
    }
    whilegetopts"w:c:h"OPT;do
    case$OPTin
    "w")
    WARNTMP=$OPTARG
    WARN=$(echo$WARNTMP|bc2>/dev/null)
    if!["$WARN"=="$WARNTMP"];then
    help
    fi
    ;;
    "c")
    CRITTMP=$OPTARG
    CRIT=$(echo$CRITTMP|bc2>/dev/null)
    if!["$CRIT"=="$CRITTMP"];then
    help
    fi
    ;;
    "h")
    help;;
    esac
    done
    CRIT_LEVEL=`expr$TOTAL\*$CRIT\/100`
    WARN_LEVEL=`expr$TOTAL\*$WARN\/100`
    if[$USED_PERCENT-gt$CRIT];then
    echo"CRITICAL!UsedMemory$USEDMB($USED_PERCENT%,Total=$TOTALMB)|'USEDMEM'=${USED}MB;$WARN_LEVEL;$CRIT_LEVEL;0;$TOTAL"
    exit2
    fi
    if[$USED_PERCENT-gt$WARN];then
    echo"WARNING!UsedMemory$USEDMB($USED_PERCENT%,Total=$TOTALMB)|'USEDMEM'=${USED}MB;$WARN_LEVEL;$CRIT_LEVEL;0;$TOTAL"
    exit1
    else
    echo"OK!UsedMemory$USEDMB($USED_PERCENT%,Total=$TOTALMB)|'USEDMEM'=${USED}MB;$WARN_LEVEL;$CRIT_LEVEL;0;$TOTAL"
    exit0
    fi
    nagios服务器的操作
    首先安装nagios,参考:server/management/186.html
    下载安装NRPE
    #cd/tmp
    #wgetp...13/nrpe-2.13.tar.gz
    #tarxvfznrpe-2.13.tar.gz
    #cdnrpe-2.13
    #./configure
    #makeall
    #makeinstall-plugin
    测试是否正常:
    #/usr/local/nagios/libexec/check_nrpe-H192.168.1.3
    NRPEv2.13
    为监控远程主机定义host和service
    1、定义check_nrpe命令
    在文件/usr/local/nagios/etc/objects/commands.cfg后面增加:
    #'check_nrpe'commanddefinition
    definecommand{
    command_namecheck_nrpe
    command_line$USER1$/check_nrpe-H$HOSTADDRESS$-t30-c$ARG1$
    }
    2、创建/usr/local/nagios/etc/objects/host.cfg(需提前在nagios.cfg中定义)
    host定义示例:
    definehost{
    uselinux-server
    host_nameremotehost
    address192.168.1.3
    }
    3、创建服务:vi/usr/local/nagios/etc/objects/services.cfg(需提前在nagios.cfg中定义)
    如定义监控远程主机磁盘空间示例(其他服务语法相同):
    defineservice{
    usegeneric-service
    host_nameremotehost
    service_descriptionsda磁盘空间
    check_commandcheck_nrpe!check_disk
    }
    之后重载nagios配置文件使其生效
    #servicenagiosreload


一、交换机snmp配置,下面是H3C5500系列的配置命令:
snmp-agentenable
snmp-agentcommunityreadpublic
snmp-agentsys-infoversionall
snmp-agentgroupv1public
snmp-agentgroupv2cpublic
snmp-agentgroupv3public
snmp-agenttarget-hosttrapaddressudp-domain<nagios服务器IP>paramssecuritynamepublic
二、安装和配置mrtg
1、安装MRTG,使用yum默认安装即可:
[root@nagios~]#yum-yinstallmrtg
2、创建配置文件,因为我只需要监控一台核心交换机,因此只创建一个,如果有多个交换机需要监控,则用下面同样的方法创建多个即可:
[root@nagios~]#mkdir/usr/local/nagios/mrtg##创建配置文件存放文件夹
[root@nagios~]#cfgmaker-output=/usr/local/nagios/mrtg/mainswitch.cfgpublic@交换机IP
3、创建和配置存放流量图及html页面的文件夹,我就放到了nagios的网页文件下,如:
[root@nagios~]#mkdir/usr/local/nagios/share/mrtg
[root@nagios~]#vi/usr/local/nagios/mrtg/mainswitch.cfg
找到“WorkDir:”将后面路径替换为上一步创建的路径,注意,如果前面被#注释掉,则需要取消#,及完成后如下:
WorkDir:/usr/local/nagios/share/mrtg
4、生成流量图:
[root@nagios~]#envLANG=C/usr/bin/mrtg/usr/local/nagios/mrtg/mainswitch.cfg
此步可能会有警告提示,不管他,多执行几次,直到没有警告为止。
使用任务计划配置每5分钟生成一次:
[root@nagios~]#vi/etc/crontab
添加如下一行:
*/5****root/usr/bin/envLANG=C/usr/bin/mrtg/usr/local/nagios/mrtg/mainswitch.cfg
使用servicecrondrestart重新启动计划任务。
生成汇总首页:
[root@nagios~]#indexmaker-output=/usr/local/nagios/share/mrtg/index.html-title="MainSwitchTrafficMonitoring"/usr/local/nagios/mrtg/mainswitch.cfg
此时,就可以使用浏览器进行访问MRTG生产的流量图了,路径为:http://服务器IP/nagios/mrtg/开源监控软件
四、配置Nagios读取mrtg监控的流量信息:
在nagios最新版中,已经有了check_mrtg和check_mrtgtraf插件,并且相关命令也已经配置好,可以直接使用,具体方法如下:
1、定义交换机和监控服务:
编辑vi/usr/local/nagios/etc/objects/switch.cfg,可以讲原有交换机的定义注释,也可以在原有配置上修改,主要内容如下:
定义host:
definehost{
usegeneric-switch
host_nameMainSwitch
aliasMainSwitch
address替换为交换机IP地址
hostgroupsswitches
}
定义server:
defineservice{
usegeneric-service
host_nameMainSwitch
service_description端口1流量
check_commandcheck_local_mrtgtraf!/usr/local/nagios/share/mrtg/替换为交换机IP_1.log!AVG!1000000,1000000!5000000,5000000!10
}
注意:上面交换机IP后面的数字1表示交换机端口1。
要监控更多的端口同同样的方法定义更多的服务即可。
重启nagios服务,刷新nagios监控页面,等两分钟后即可看到流量信息了。[url=uploads/img/201505/31124406_SH8N.png][/url]如果要查看更信息的端口流量图,则可以访问MRTG页面进行查看,路径为:http://nagiso服务器IP/nagios/mrtg/
我的机房没有温度报警装置,我用此方法实现对机房温度的掌控,如果只有一台报警,则可认为单机故障,如果几台同时报警,则可认为机房空调出现了问题。具体实现方法如下:
环境:被监控机:CentOS6.x
1、安装硬件传感器监控软件sensors
#yuminstalllm_sensors*
2、运行sensors-detect进行传感器检测
#sensors-detect##一路回车即可,此步我在虚拟机下报错,但在物理机上没有问题
3、运行sensors看是否能读取数据,如下像下面这样表示正常:
[root@rd02~]#sensors
coretemp-isa-0000
Adapter:ISAadapter
Core0:+35.0°C(high=+85.0°C,crit=+95.0°C)
Core1:+34.0°C(high=+85.0°C,crit=+95.0°C)
Core9:+36.0°C(high=+85.0°C,crit=+95.0°C)
Core10:+31.0°C(high=+85.0°C,crit=+95.0°C)
4、#vi/usr/local/nagios/libexec/check_cputemp
#!/bin/sh
#########check_cputemp###########
#date:May2013
#LicenceGPLv2
#byBarlow
#/usr/local/nagios/libexec/check_cputemp
#youcanuseNRPEtodefineserviceinnagios
#check_nrpe!check_cputemp
#Pluginreturnstatements
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3
print_help_msg(){
$Echo"Usage:$0-htogethelp."
}
print_full_help_msg(){
$Echo"Usage:"
$Echo"$0[-v]-msensors-wcpuT-ccpuT"
$Echo"Sepicifythemethodtousethetemperaturedatasensors."
$Echo"AndthecorrespondingCriticalvaluemustgreaterthanWarningvalue."
$Echo"Example:"
$Echo"${0}-msensors-w40-c50"
}
print_err_msg(){
$Echo"Error."
print_full_help_msg
}
to_debug(){
if["$Debug"="true"];then
$Echo"$*">>/var/log/check_sys_temperature.log.$$2>&1
fi
}
unsetLANG
Echo="echo-e"
if[$#-lt1];then
print_help_msg
exit3
else
whilegetopts:vhm:w:c:OPTION
do
case$OPTION
in
v)
#$Echo"Verbosemode."
Debug=true
;;
m)
method=$OPTARG
;;
w)
WARNING=$OPTARG
;;
c)
CRITICAL=$OPTARG;;
h)
print_full_help_msg
exit3
;;
?)
$Echo"Error:IllegalOption."
print_help_msg
exit3
;;
esac
done
if["$method"="sensors"];then
use_sensors="true"
to_debuguse_sensors
else
$Echo"Error.Musttosepcifythemethodtousesensors."
print_full_help_msg
exit3
fi
to_debugAllValuesare\"Warning:"$WARNING"andCritical:"$CRITICAL"\".
fi
#########lm_sensors##################
if["$use_sensors"="true"];then
sensorsCheckOut=`whichsensors2>&1`
if[$?-ne0];then
echo$sensorsCheckOut
echoMaybeyouneedtocheckyoursensors.
exit3
fi
to_debugUse$sensorsCheckOuttochecksystemtemperature
TEMP1=`sensors|head-3|tail-1|gawk'{print$3}'|grep-o[0-9][0-9]`
TEMP2=`sensors|head-4|tail-1|gawk'{print$3}'|grep-o[0-9][0-9]`
TEMP3=`sensors|head-5|tail-1|gawk'{print$3}'|grep-o[0-9][0-9]`
TEMP4=`sensors|head-6|tail-1|gawk'{print$3}'|grep-o[0-9][0-9]`
##温度的取数根据你cpu的核数确定,我的是四核,所以取TEMP1-4个CPU温度数并计算平均值
SUM=$(($TEMP1+$TEMP2+$TEMP3+$TEMP4))
TEMP=$(($SUM/4))
if[-z"$TEMP"];then
$Echo"NoDatabeengethere.PleaseconfirmyourARGSandre-checkitwithVerbosemode,thentocheckthelog."
exit3
fi
to_debugtemperaturedatais$TEMP
else
$Echo"Error.Musttosepcifythemethodtousesensors"
print_full_help_msg
exit3
fi
#########Comparaisonwiththewarningsandcriticalsthresholdsgivenbyuser############
CPU_TEMP=$TEMP
#if["$WARNING"!="0"]||["$CRITICAL"!="0"];then
if["$CPU_TEMP"-gt"$CRITICAL"]&&["$CRITICAL"!="0"];then
nagios配置
STATE="$STATE_CRITICAL"
STATE_MESSAGE="CRITICAL"
to_debug$STATE,Messageis$STATE_MESSAGE
elif["$CPU_TEMP"-gt"$WARNING"]&&["$WARNING"!="0"];then
STATE="$STATE_WARNING"
STATE_MESSAGE="WARNING"
to_debug$STATE,Messageis$STATE_MESSAGE
else
STATE="$STATE_OK"
STATE_MESSAGE="OK"
to_debug$STATE,Messageis$STATE_MESSAGE
fi
##返回值中注意要包含性能数据,即采用|分隔的后半部数据,且数据单位不能包含中文,否则使用PNP等绘图软件无法正常绘图。
echo"TheTEMPERATURE"$STATE_MESSAGE""-"TheCPU'sTemperatureis"$CPU_TEMP"℃!|温度=`echo$CPU_TEMP`Celsius;$WARNING;$CRITICAL"
exit$STATE
5、赋予上述脚本执行权限:
#chmod+x/usr/local/nagios/libexec/check_cputemp
6、配置nrpe.cfg,添加如下一行:
command[check_cputemp]=/usr/local/nagios/libexec/check_cputemp-msensors-w38-c45
-w表示警告值,-c表示关键(紧急)值,自行根据实际情况调整
注意:以上六步均在被监控机上完成。
7、在Nagios服务器配置服务:
defineservice{
usegeneric-service,svr-pnp
host_name
service_descriptionCPUTemperature
check_commandcheck_nrpe!check_cputemp
}
保存后重启nagios服务即可
一、Nagios监控配置的常规说明:
1.1.监控步骤:
被监控端安装代理(linux为nrpe,windows为NSClient)à配置被监控端监控脚本à主机定义(服务器端)à定义命令(服务器端,普通监控默认已定义好,可跳过此步)à定义服务(服务器端)à其他定义(此步可省略,包含:联系人、主机组、服务器组、服务组等)
1.2.Nagios监控的四种状态:
Nagios的状态有四种,根据返回值区分:
返回0,正常
返回1,警告
返回2,紧急
返回3,未知
因此,不管是linux还是windows,在自定义脚本是,只要设置好exit后跟的返回值即可实现Nagios的通知提醒。
二、Windows代理NSClient++的安装
下载最新的NSClient++0.40安装,填入Nagios服务器IP,密保保存为空,并勾选支持的前三项插件,如下图:
三、利用默认配置实现监控硬盘空间、CPU负载、内存等信息:
3.1被监控端(Windows服务器)配置自带防火墙例外或者关闭自带防火墙,开放TCP5666和TCP12489端口。
3.2Nagios服务器端:
3.2.1.配置/usr/local/nagios/etc/nagios.cfg,将如下一行前面的注释取消:
cfg_file=/usr/local/nagios/etc/objects/windows.cfg
3.2.2.定义主机,编辑/usr/local/nagios/etc/objects/windows.cfg,添加主机定义:
definehost{
usewindows-server;使用主机模板
host_name主机名;主机名
alias主机别名;主机别名
address192.168.0.8;IP地址
}
3.2.3.定义服务,编辑/usr/local/nagios/etc/objects/windows.cfg,添加服务定义:

  • 定义监控CPU负责的服务:
defineservice{
usegeneric-service;服务模板
host_name主机名;上面定义的主机名
check_interval18
service_descriptionCPU负载;服务名称
check_commandcheck_nt!CPULOAD!-l5,80,90
}
说明:检查5分钟平均值,报警值80%,警告值90%。

  • 定义监控内存的服务:
defineservice{
usegeneric-service,srv-pnp
host_name主机名
check_interval18
service_descriptionMemory含虚拟内存
check_commandcheck_nt!MEMUSE!-w78-c82
}
说明:内存报警值78%,警告值82%(该数据包含虚拟内存)监控软件

  • 定义监控磁盘空间的服务:
defineservice{
usegeneric-service,srv-pnp
host_name主机名
check_interval30
service_descriptionDriveSpaceD盘
check_commandcheck_nt!USEDDISKSPACE!-ld-w80-c90
}
说明:-l后接盘符,报警值80%,警告值90%。

  • 定义监控windows服务运行状态:
defineservice{
usegeneric-service
host_name主机名
service_description服务名
check_commandcheck_nt!SERVICESTATE!-dSHOWALL-l服务名
}
说明:-l后接要检查的服务名称;contacts为定义的通知联系人。

  • 其他更多的用法可以根据windows.cfg文件的预定义服务进行举一反三。
3.2.4.使用命令:servicenagiosrestart重启查看状态,正常的话如下图:
四、自定义脚本监控(NRPE):
4.1客户端脚本编写:
脚本的编写可以使用批处理、powershell脚本或vbs等,只要能返回状态信息和返回值(见文章开头第一段说明)。
例如如使用批处理,可以使用echo命令返回状态信息;使用exit跟数字0、1、2、3返回状态值。如下面的一段批处理脚本可以实现对进程状态进行监控:
::监控进程是否运行
::%1表示使用中的第一个参数,即进程名称
tasklist|find"%1">NUL
IFERRORLEVEL1GOTOerr
IFERRORLEVEL0GOTOok
:err
echoCRITICAL!Process%1isnotexist!
exit2
::返回值为2,表示警告
:ok
echoOK!Process%1isexist!
exit0
::返回值为0,表示正常
将上述命令作为批处理保存在C:\ProgramFiles\NSClient++\scripts路径下如check_run.bat,注意,在返回的状态信息中尽量不要用中文。
4.2客户端脚本命令配置:
编辑C:\ProgramFiles\NSClient++sclient.ini,找到[/settings/externalscripts/scripts]一行,在下面加入如下内容:
Command_alias=scripts\check_run.batProcess_Name.exe
注意:等号前面的别名为服务器端调用的命令,等号后面接具体的脚本,脚本后面跟参数进程名称,该参数会被脚本使用%1变量进行调用。如我要监控【视频监控主机】的视频录像程序是否启动,可替换为check_manager=scripts\check_run.batVideoManager.exe
4.3服务器端服务配置():
定义服务后:
defineservice{
usegeneric-service
host_nameMonitor
service_description管理平台
check_commandcheck_nrpe!check_manager
}
4.4重启Nagios服务:servicenagiosrestart
通过上述默认支持的监控项目和自定义脚本,基本能实现Windows所有需要的监控(对部分服务的详细监控需要很复杂的脚本才能实现)。
1.DBI的安装
#wgetmodules/by-module/DBI/DBI-1.625.tar.gz
#tarzxvfDBI-1.625.tar.gz
#cdDBI-1.625
#perlMakefile.PL
#make
#maketest
#makeinstall
2.DBD的安装
#wgetmodules/by-module/DBD/DBD-mysql-4.023.tar.gz
#tar-zxvfDBD-mysql-4.023.tar.gz
#cdDBD-mysql-4.023
#perlMakefile.PL--mysql_config=/usr/local/mysql/bin/mysql_config--libs=-L/usr/local/mysql/lib-static-lmysqlclient
#make
#makeinstall
3.编译安装NDOUtils
#tarzxfndoutils-1.5.2.tar.gz
#cdndoutils-1.5.2
#./configure--prefix=/usr/local/nagios--enable-mysql--disable-pgsql
#cp./src/ndomod-3x.o/usr/local/nagios/bin
#cp./src/ndo2db-3x/usr/local/nagios/bin
#cp./src/log2ndo/usr/local/nagios/bin
#cp./src/file2sock/usr/local/nagios/bin
#chownnagios:nagios/usr/local/nagios/bin/*
#cp./config/ndo*/usr/local/nagios/etc/
#chownnagios:nagios/usr/local/nagios/etc/*
4.为NDOUtils创建数据库
#mysql-uroot-p
mysql>createdatabasenagios;
mysql>GRANTSELECT,INSERT,UPDATE,DELETEONnagios.*TOnagios@localhostIDENTIFIEDBY'123456';
mysql>flushprivileges;
mysql>\q
生成ndoutils所需要的数据库
#cddb
#./installdb-unroot-p123456-hlocalhost-dnagios
也可这样:#/opt/mysql/bin/mysql-uroot-p-Dnagios-hlocalhost<./db/mysql.sql
5.编辑配置文件
#vi/usr/local/nagios/etc/ndo2db.cfg
db_user=nagios
db_pass=123456
#vi/usr/local/nagios/etc/nagios.cfg
#复制下面内容粘贴到#broker_module=...下面。
broker_module=/usr/local/nagios/bin/ndomod-3x.oconfig_file=/usr/local/nagios/etc/ndomod.cfg
此外,请确保您的/usr/local/nagios/etc/nagios.cfg中有如下行出现,否则,请自行添加:
event_broker_options=-1//为Nagios开启eventbroker
6.启动ndo2db
#/usr/local/nagios/bin/ndo2db-3x-c/usr/local/nagios/etc/ndo2db.cfg
#echo'/usr/local/nagios/bin/ndo2db-3x-c/usr/local/nagios/etc/ndo2db.cfg'>>/etc/rc.local
7.重启动nagios
#/usr/local/nagios/bin/nagios-v/usr/local/nagios/etc/nagios.cfg
#servicenagiosrestart
检查安装
#tail-20/usr/local/nagios/var/nagios.log
8、遇到问题:
1.执行#/usr/local/nagios/bin/ndo2db-3x-c/usr/local/nagios/etc/ndo2db.cfg
提示错误:Couldnotbindsocket:Addressalreadyinuse
解决:psaux|grepndo2db#没有
查看套接字文件是否存在,删除之
ll/usr/local/nagios/var/ndo.sock
rm/usr/local/nagios/var/ndo.sock
2.#ndo2db数据不能导入到数据库
原因:编译时没有LDFLAGS=-L/opt/mysql/lib
解决:重新编译ndoutils并加上LDFLAGS=-L/opt/mysql/lib
#./configure--prefix=/usr/local/nagios--enable-mysql--disable-pgsqlLDFLAGS=-L/usr/local/mysql/lib--with-mysql-inc=/usr/local/mysql/include/mysql--with-mysql-lib=/usr/local/mysql/lib/mysql
#make
#再执行一下安装过程后,通过
1、准备NRPEforHP-UX软件和用户:1.1准备软件
可以到naghpux/下载
我实际使用中由于存在多台HP-UX,因此都是统一从Nagios服务器拷贝至被监控端的,命令如下:
#scp/var/ftp/nagios/NRPE-2.12.depotHP-UX_IP:/tmp
如果服务器很多,可以将上述命令写成脚本,实现批量推送。
1.2建立NRPE用户:
groupadd-g312nrpe
useradd-gnrpe-u312nrpe
##指定GID和UID为312是因为后面的配置脚本中默认是这样指定的,我这里就不做修改nagios实施
2、在HP-UX上安装NRPE:
2.1HP-UX的软件包格式为depot,使用swinstall命令安装:
#swinstall-s/tmp/NRPE-2.12.depot
2.2默认会弹出swinstall命令的使用提示,按任意键继续:
2.3使用空格键选中NRPE包,并使用tab键切换至菜单“Actions”,然后选择“MarkForInstall”
按回车后,NRPE包前方会有Yes标记:
2.4再次按tab键,切换到菜单“Actions”,然后选择“Install”进行安装:
首先会对安装程序进行分析,通过后选中“OK”,进入正式安装:
安装完成后,选中“done”,后按回车键,然后使用tab键选择“File”菜单的"exit"退出:
检查安装情况,默认nrpe会被安装到/opt/nrpe:
root@rzcs:/#ls/opt/nrpe
binetclibexec
3、配置nrpe:3.1配置nrpe主配置文件/opt/nrpe/etc/nrpe.conf:
vi/opt/nrpe/etc/nrpe.cfg##修改如下两行
server_address=127.0.0.1Nagios_Server_IP
allowed_hosts=127.0.0.1Nagios_Server_IP
##其他可以暂时保持默认,注意底部有监控命令的配置,如果是自写脚本,则需要配置:
……中间省略……
command[check_users]=/opt/nrpe/libexec/check_users-w5-c10
command[check_load]=/opt/nrpe/libexec/check_load-w15,10,5-c30,25,20
command[check_zombie_procs]=/opt/nrpe/libexec/check_procs-w5-c10-sZ
command[check_total_procs]=/opt/nrpe/libexec/check_procs-w1500-c2000
command[check_hpux_disk]=/opt/nrpe/libexec/check_disk-w20-c10
command[check_free_mem]=/opt/nrpe/libexec/check_mem.pl-f-w10-c5##自写脚本,后面会贴出脚本内容
3.2将NRPE配置为inetd管理的进程:
NRPE自带有配置脚本,只需执行下该脚本即可
/opt/nrpe/bin/configure.sh
##该脚本会将nrpe相关配置写入/etc/inetd.conf和/etc/services,与Linux下nrpe启动配置一样
4、编写内存监控脚本:
NRPE自带有大量监控插件的,此处于linux下需要单独安装插件不同。但自带的插件不能监控内存,因此我借鉴网上别人脚本,再根据实际情况做了些调整:
#!/usr/bin/perl-w
#bybarlow修改
#usestrict;
useGetopt::Std;
usevarsqw($opt_c$opt_f$opt_u$opt_w
$free_memory$used_memory$total_memory
$crit_level$warn_level
%exit_codes@memlist
$percent$fmt_pct
$verb_err$command_line);
#PredefinedexitcodesforNagios
%exit_codes=('UNKNOWN',-1,
'OK',0,
'WARNING',1,
'CRITICAL',2,);
#
$verb_err=0;
#注意命令需要全路径,且该命令需要root权限
$command_line=`/usr/sbin/swapinfo|tail-1|awk'{print\$3,\$4}'`;
chomp$command_line;
@memlist=split(//,$command_line);
#Definethecalculatingscalars
$used_memory=$memlist[0];
$free_memory=$memlist[1];
$total_memory=$used_memory+$free_memory;
#Gettheoptions
if($#ARGVle0)
{
&usage;
}
else
{
getopts('c:fuw:');
}
#Shortcircuittheswitches
if(!$opt_wor$opt_w==0or!$opt_cor$opt_c==0)
{
print"***YoumustdefineWARNandCRITICALlevels!"if($verb_err);
&usage;
}
elsif(!$opt_fand!$opt_u)
{
print"***YoumustselecttomonitoreitherUSEDorFREEmemory!"if($verb_err);
&usage;
}
#Checkiflevelsaresane
if($opt_w<=$opt_cand$opt_f)
{
print"***WARNlevelmustnotbelessthanCRITICALwhencheckingFREEmemory!"if($verb_err);
&usage;
}
elsif($opt_w>=$opt_cand$opt_u)
{
print"***WARNlevelmustnotbegreaterthanCRITICALwhencheckingUSEDmemory!"if($verb_err);
&usage;
}
$warn_level=$opt_w;
$crit_level=$opt_c;
if($opt_f)
{
$percent=$free_memory/$total_memory*100;
$fmt_pct=sprintf"%.1f",$percent;
if($percent<=$crit_level)
{
print"MemoryCRITICAL-FREE$fmt_pct%(FREE:$free_memorykBTOTAL:$total_memorykB)";
exit$exit_codes{'CRITICAL'};
}
elsif($percent<=$warn_level)
{
print"MemoryWARNING-FREE$fmt_pct%(FREE:$free_memorykBTOTAL:$total_memorykB)";
exit$exit_codes{'WARNING'};
}
else
{
print"MemoryOK-FREE$fmt_pct%(FREE:$free_memorykBTOTAL:$total_memorykB)";
exit$exit_codes{'OK'};
}
}
elsif($opt_u)
{
$percent=$used_memory/$total_memory*100;
$fmt_pct=sprintf"%.1f",$percent;
if($percent>=$crit_level)
{
print"MemoryCRITICAL-USED$fmt_pct%(USED:$used_memorykBTOTAL:$total_memorykB)";
exit$exit_codes{'CRITICAL'};
}
elsif($percent>=$warn_level)
{
print"MemoryWARNING-USED$fmt_pct%(USED:$used_memorykBTOTAL:$total_memorykB)";
exit$exit_codes{'WARNING'};
}
else
{
print"MemoryOK-USED$fmt_pct%(USED:$used_memorykBTOTAL:$total_memorykB)";
exit$exit_codes{'OK'};
}
}
#打印帮助
subusage()
{
print"check_mem.pl-NagiosPlugin";
print"usage:";
print"check_mem.pl-<f|u>-w<warnlevel>-c<critlevel>";
print"options:";
print"-fCheckFREEmemory";
print"-uCheckUSEDmemory";
print"-wPERCENTPercentfree/usedwhentowarn";
print"-cPERCENTPercentfree/usedwhencritical";
exit$exit_codes{'UNKNOWN'};
}
脚本说明:/usr/sbin/swapinfo取出的信息并不是真实的物理内存使用情况,也不是swap信息,而是HP-UX系统下的页面调度信息,与服务器真实的内存使用情况有一定出入,但基本一致。
另外由于swapinfo命令需要管理员身份执行,因此我直接赋予脚本u+s权限:
chmod4755/opt/nrpe/libexec/check_mem.pl##相当于chmodu+x
5、启动NRPE:5.1方法一:
#inetd-k&&inetd##重启inetd守护进程以实现nrpe的启动
5.2方法二:
#su-nrpe
/opt/nrpe/bin/nrpe-c/opt/nrpe/etc/nrpe.cfg-i&##以inetd服务方式启动
/opt/nrpe/bin/nrpe-c/opt/nrpe/etc/nrpe.cfg-d&##独立守护进程

6、测试NRPE:6.1在被监控服务器上查看服务是否正常启动:
#netstat-an|grep-itcp|grep5666##查看监控端口是否开启
6.2在Nagios服务器上测试联系NRPE:
/usr/local/nagios/libexec/check_nrpe-HHP-UX_IP
NRPEv2.12
##返回如上信息则正常
##反之则需要检查hp-ux服务器日志:
tail-20/var/adm/syslog/syslog.log
至于Nagios服务器端的监控配置,前面的文章已经说过很多,这里就不再重复。nagios培训
监控效果(点击图片放大查看):[url=uploads/img/201505/31124541_F2wL.jpg][/url]
一、调优:1.1调整监控的灵敏度:
在Nagios的配置文件中,有个interval_length参数,定义了以后其他地方需要用到的间隔时间单位长度,该值默认为60s:
#INTERVALLENGTH
#Thisisthesecondsperunitintervalasusedinthe
#host/contact/serviceconfigurationfiles.Settingthisto60means
#thateachintervalisoneminutelong(60seconds).Othersettings
#havenotbeentestedmuch,soyourmileageislikelytovary...
interval_length=60
在定义主机和服务时,都是以该值为基础的,如服务中定义如下:
check_interval6
retry_interval2
则表示检查间隔为6*60s,即每6分钟才检查一次,而重试时间为2分钟。对于一些敏感度要求高的服务,这明显不能满足我们的要求,因此可以将其调小,如调整为10秒:
interval_length=10
这样就提高了检查的灵敏度,但有些服务又不需要如此高的灵敏度,如磁盘空间(不会一下就增加很多),则可以在定义check_interval是增大其数值。
还可以调整如下时间,定义主机和服务检测超时时长的,如下为默认值,单位为s:
service_check_timeout=120
host_check_timeout=60
event_handler_timeout=60
notification_timeout=60
ocsp_timeout=10
perfdata_timeout=10
注意:灵敏度和误报率是成正比的,检查间隔越小,月可能出现误报。需根据实际情况调整到合适的值。
1.2服务和主机依赖:
定义服务依赖,有助于降低务必要的报警,如某服务器连接的交换机坏了,则服务器及其服务肯定无法再检测,此时就完全不再去检测服务器和其服务。
服务依赖定义语法:
标记了(*)的域是必备的而蓝色是可选的。然而你最少要在定义中给定出一种使用类型标准。
defineservicedependency{
dependent_host_namehost_name(*)
dependent_hostgroup_namehostgroup_name
dependent_service_descriptionservice_description(*)
host_namehost_name(*)
hostgroup_namehostgroup_name
service_descriptionservice_description(*)
inherits_parent[0/1]
execution_failure_criteria[o,w,u,c,p,n]
notification_failure_criteria[o,w,u,c,p,n]
dependency_periodtimeperiod_name
...
}
主机间依赖定义:
在上图例子中,针对主机C的依赖关系定义将会是这样的:
definehostdependency{
host_nameHostA
dependent_host_nameHostC
notification_failure_criteriad
}
definehostdependency{
host_nameHostB
dependent_host_nameHostC
notification_failure_criteriad,u
}
二、使用pnpnagios实现对性能数据绘图:
只要检测返回数据包含性能数据(即返回结果以管道符|分开的,且有特定格式的部分),就可以使用rrdtool实现绘图,而rrdtool实现较为复杂,因此一般需要借组与第三方工具去操作rrdtool,如pnp4nagios、cacti实现绘图。还有一种方式是使用mrtg实现绘图,但mrtg功能较简单,且绘图开销较大。
Nagios默认提供了Nagiosgraph绘图功能,也提供了mrtg示例文件,要绘制各种Nagios的性能统计图的MRTG配置文件片段可查看Nagios发行包里sample-config/子目录下的mrtg.cfg文件。如果需要可以创建性能信息的其他图表文件-样例只是提供了一个好的起点。一旦你复制这些样例文件到你的MRTG配置文件(/etc/mrtg/mrtg.cfg)里,你将在MRTG的下次运行时得到这些新图表。mrtg和graph绘图功能官方说明文档中都有详细说明。
而我实际使用中,使用了pnp4nagios实现,实现办法网上有很多教程,这里不再详述,绘图效果如下:
三、Nagios的权限和通知功能加强:
在我所监控的环境中,监控服务器超过200台,网络设备几十台,服务上千,这些服务器和网络设备是有几个人进行管理的。而监控的服务就有更多的人关心,如开发测试部门,他们需要知道自己负责的系统的服务状态。因此要求Nagios的通知功能和查看权限要进行细化配置,而这又正是Nagios的比较弱的地方,我采用了如下的方式实现:
3.1使用LDAP认证:
我实际的环境中,需要Nagios权限的人有近20个,如果使用传统的密码文件方式认证,很不利于管理(比如用户不能自己修改密码,用户要记多个系统不同的密码),而我们所有系统的认证都是通过WindowsActiveDirectory进行认证的,因此使用LDAP认证可以实现统一认证。在apachehttpd中,提供了一个mod_authnz_ldap模块,可以实现基于ldap的认证,mod_authnz_ldap认证分两个阶段完成,第一阶段会去ldap查找用户是否存在,第二阶段:如果查找到该用户,则验证该用户是否具有相应权限。关于该模块的详细说明可参考官方文档,详细实现过程如下:
3.1.1在域控制器上特定OU下建立具有Nagios权限的用户组:
在AD域上,创建一个组,将需要访问Nagios的用户都加入到该组即可。我这里所有用于管理的都建立的admin这个OU下,组名为nagiosusers。
3.1.2配置Nagios通过LDAP认证:
编辑Nagios的httpd配置文件,将所有使用密码文件验证的地方替换为ldap验证,具体如下:
vi/etc/httpd/conf.d/nagios.conf
<Directory"/usr/local/nagios/share">
#SSLRequireSSL
OptionsNone
AllowOverrideNone
Orderallow,deny
Allowfromall
#如下红色几行为原默认认证方式
#AuthName"NagiosAccess"
#AuthTypeBasic
#AuthUserFile/etc/nagios/htpasswd.users
#Requirevalid-user
#如下部分为LDAP认证方式
AuthName"NagiosAccess"
AuthTypeBasic
AuthBasicProviderldap
AuthzLDAPAuthoritativeOn
#注意ldap路径的方式,用户和组使用CN,组织单元使用OU
AuthLDAPURL[url=]ldap://dc01.toxingwang.com:389/OU=admin,DC=toxingwang,DC=com?sAMAccountName?sub?(objectClass[/url]=*)
AuthLDAPBindDNnagiosadmin@toxingwang.com##与AD通讯的账号,任意普通账号即可
AuthLDAPBindPasswordpassword##上述账号的密码,注意,明文方式,因此一定使用普通账号
#如下一行可定义基于指定ou下的用户验证
#Requirevalid-user
#如下两行定义基于指定组的认证
AuthLDAPGroupAttributeIsDNon##开启基于组的验证
#组对应的ldap路径
requireldap-groupCN=nagiousers,OU=admin,DC=toxingwang,DC=com
</Directory>
注意需要替换所有用到验证的地方(包含pnp4nagios的httpd配置)。然后重启httpd即可使用域账号登录nagios了。当然可以访问nagios的web页面,不一定具有查看相关监控服务的权限,下面进行定义:
3.2定义联系人:3.2.1定义联系人:
打开Nagios的contacts.cfg文件,定义每一个就具有权限的用户:
definecontact{
contact_namebarlow##需要与WindowsAD域中的账号相同
aliasBarlow
##如下两行定义通知方式,后面会详细讲到
host_notification_commandsnotify-host-by-email,notify-host-by-message
service_notification_commandsnotify-service-by-email,notify-service-by-message
emailbarlow@toxingwang.com##定义通知邮箱
address118000000000##定义短信通知手机
usegeneric-contact##使用通用模板
register1##是否启用
}
3.2.2定义联系人组:
按用户管理服务的不同,定义相关的联系人组,如DBA管理组、OA管理组、网络管理组、SAP管理组等,编辑contactgroups.cfg
definecontactgroup{
contactgroup_nameadmins
aliasNagiosAdministrators
membersbarlow
register1
}
definecontactgroup{
contactgroup_namenetadmins
aliasNetworkAdministrators
memberszhangsan,barlow,lisi##组内包含的用户
register1
}
3.2.3使用服务模板和主机模板的方式实现权限管理:
与联系人组定义思想相同,按权限不同,将相关联系人组和联系人加入到服务模板和主机模板,以后在定义服务是引用该模板即可,具体实现如下:
编辑主机模板文件:hosttemplates.cfg
definehost{
namegeneric-network-admins
contact_groupsnetadmins##将上诉定义的联系人组加入
register0
}
以后在定义主机时,如果需要改组用户具有此主机的权限,则引用该模板即可。
编辑服务模板文件:servicetemplates.cfg
defineservice{
namenetwork-service-admins
#如下几行定义通知机制,可根据需要调整
#notification_interval30
#notification_period24x7
#notification_optionsw,u,c,r
#notifications_enabled1
contact_groupsadmins,netadmins
register0
}
同使用主机模板一样,在以后定义服务时,如果需要用户具有查看该服务的权限,则引用模板即可。
3.3使用Mail和短信双重报警:
我使用sendEmail脚本(脚本下载)发送通知邮件,命令定义如下:
definecommand{
command_namenotify-service-by-email
command_line/usr/bin/printf"%b""**ServerInfofor$HOSTALIAS$**AdditionalInfo:$SERVICEOUTPUT$NotificationType:$NOTIFICATIONTYPE$Service:$SERVICEDESC$Host:$HOSTALIAS$Address:$HOSTADDRESS$State:$SERVICESTATE$Date/Time:$LONGDATETIME$Ifyouhaveanyquestions,pleasesendemailtobarlow@toxingwang.comorcallmyphone13360052520"|/usr/local/sendEmail/sendEmail–f<发件人邮箱>-t$CONTACTEMAIL$–s<smtp服务器>-u"$NOTIFICATIONTYPE$Service:$HOSTALIAS$/$SERVICEDESC$is$SERVICESTATE$"-xu<发件人账号(邮箱)>-xp<发件人密码>-omessage-charset=utf-8-omessage-header=utf-8
register1
}
短信通知功能可以使用短信猫、飞信、或者其他短信接口实现,我使用公司短信结构实现,命令定义如下:
definecommand{
command_namenotify-service-by-message
command_line$USER1$/sendmessage.py$CONTACTADDRESS1$"$NOTIFICATIONTYPE$Service:$HOSTALIAS$/$SERVICEDESC$is$SERVICESTATE$!$SERVICEOUTPUT$–byNagios"
register1
}
想做NagiosZabbix,Cacti,iTop各种交流的,可以进入开源监控工具Nagios交流QQ群号476809427





上一篇:简化nagios监控部署ansible+shell方案
下一篇:nagios与zorka是如何协作的
monicazhang

写了 2297 篇文章,拥有财富 12859,被 21 人关注

您需要登录后才可以回帖 登录 | 立即注册
B Color Link Quote Code Smilies

成为第一个吐槽的人

Powered by IT 运维管理
返回顶部