| 来自:网络 
 
 安装完成后的一些情况准备工作开始安装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、准备NRPE for HP-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安装了下面几个软件包:
 
 ApachePHPGCC compilerGD development libraries
 你可以通过yum完成这些安装工作:  开始安装Nagios 创建帐号
 #yum install httpd httpd-devel php openssl-devel  #yum install gcc glibc glibc-common  #yum install gd gd-devel 
 
 创建 nagios用户并创建nagcmd用户组以执行来自web接口的命令,并添加nagios和apache用户到此用户组。  下载Nagios和插件
 #groupadd nagcmd                /*建立组nagcmd*/  #usermod –G nagcmd apache               /*添加用户apache到组nagcmd*/  #useradd -G nagcmd nagios               /*新建用户nagios并添加到组nagcmd*/  #passwd nagios               /*修改nagios密码*/ 
 
 创建下载存储目录:  
 #mkdir ~/downloads 
#cd ~/downloads
 从网站http://www. /download/下载Nagios(英语不好的同学初次安装建议安装中文版)以及插件。 编译安装Nagios 
 #tar -jxvf nagios-cn-3.2.3.tar.bz2#cd nagios-cn-3.2.3
 
 运行Nagios配置脚本,并把nagcmd更改为之前所创建的组。  
 #./configure --prefix=/usr/local/nagios --with-nagios-user=nagios --with-nagios-group=nagios --with-command-group=nagcmd 
 
 编译源码:  安装二进制,init脚本,sample配置文件和设置外部命令目录权限。  
 #make install#make install-init
 #make install-config
 #make install-commandmode
 
 不要现在执行nagios,下面还有一些需要配置。 定制配置 样式配置文件已经安装在/usr/local/nagios/etc目录,修改联系人为下一步中的管理员并更改email地址。  配置web接口
 #vi /usr/local/nagios/etc/objects/contacts.cfg 
 
 安装Nagios Web配置文件在Apache的conf.d目录:  为登录Nagios Web接口创建nagiosadmin帐号。记住下面你设置的密码,之后登录用到。  
 #htpasswd -c /usr/local/nagios/etc/htpasswd.users barlow##我这里使用我的英文名barlow为默认管理员
 
 重启Apache使新配置生效。 编译安装Nagios插件 
 #cd ~/downloads#tar xzf nagios-plugins-1.4.16.tar.gz
 #cd nagios-plugins-1.4.16
 #./configure --with-nagios-user=nagios --with-nagios-group=nagios
 #make
 #make install
 
 启动Nagios
 设置开机启动:  
 #chkconfig --add nagios#chkconfig nagios on
 #chkconfig httpd on
 #service httpd restart
 #service nagios restart
 
 测试配置文件是否有错误:  
 #/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg 
 
 这个命令后面经常会用到,但这么长的命令很难输入也难记,因此我将其添加为别名,方法如下:  #vi /etc/bashrc 
 最最后添加如下一行:  alias nagc='/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 登录Nagios 安装已经完成,你可以使用barlow用户以及之前设置的密码通过http://Nagios_IP/nagios/地址登录Nagios后台。  登录后界面如下:  左边菜单栏的顶部有中英文的说明书,根据说明,能完成绝大部分监控配置。  可能存在的问题点:  
 现象:无法访问解决办法:查看防火墙配置是否开放了80端口,
现象:只能打开主页,其他菜单点击后显示“Internal Server Error”错误提示解决办法:关闭SELinux
 监控监控linux本地主机时,我们可以直接更改配置文件进行监控,如果需要监控的主机与nagios不在同一机器上,即监控远程linux主机时,我们需要借助NRPE插件实现。     nrpe工作原理图:  远程主机的操作  安装支持:  # yum -y install openssl openssl-devel 
 下载Nagios Plugins和NRPE  创建nagios帐号  # useradd nagios# passwd nagios
 安装nagios-plugin  # cd /tmp# tar xvfz nagios-plugins-1.4.16.tar.gz
 # cd nagios-plugins-1.4.16
 # export LDFLAGS=-ldl
 # ./configure --with-nagios-user=nagios --with-nagios-group=nagios --enable-redhat-pthread-workaround
 # make
 # make install
 #chown nagios.nagios /usr/local/nagios#chown -R nagios.nagios /usr/local/nagios/libexec/
 安装NRPE  # cd /tmp# tar xvfz nrpe-2.13.tar.gz
 # cd nrpe-2.13
 # ./configure
 # make all
 # make install-plugin
 # make install-daemon
 # make install-daemon-config
 # yum install xinetd
 # make install-xinetd
 配置NRPE以守护进程运行  1、更改/etc/xinetd.d/nrpe文件,设置允许nagios服务器连接,如nagios服务器的ip为192.168.1.2:  only_from       = 127.0.0.1 192.168.1.2 
 2、在/etc/services结尾增加:  nrpe 5666/tcp # NRPE 
 3、启动xinetd  # service xinetd restart 
 4、验证nrpe是否监听  # netstat -at | grep nrpe 
 5、测试nrpe是否正常运行  # /usr/local/nagios/libexec/check_nrpe -H localhostNRPE v2.13
 6、更改 /usr/local/nagios/etc/nrpe.cfgnrpe.cfg文件里包含需要监控远程主机的命令,如下面是我的配置:
 #用户登录数command[check_users]=/usr/local/nagios/libexec/check_users -w 5 -c 10
 #CPU负载
 command[check_load]=/usr/local/nagios/libexec/check_load -w 15,10,5 -c 30,25,20
 #磁盘空间
 command[check_disk]=/usr/local/nagios/libexec/check_disk -w  20 -c 10 -p /dev/sda
 #僵尸进程数
 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[check_mem]=/usr/local/nagios/libexec/check_mem -H $HOSTADDRESS$
 #脚本内容见下文
 物理内存检查脚本/usr/local/nagios/libexec/check_mem:  #!/bin/bash# check memory script
 # Total memory
 # by Barlow
 # 2014-06-13
 help() {
 echo "Usage: `basename $0` -w <%> -c <%>"
 echo "-w is WARNING % of used mem;-c is CRITICAL % of used mem!"
 exit 3
 }
 TOTAL=`free -m | head -2 |tail -1 |gawk '{print $2}'`
 # check memory
 FREE=`free -m | head -3 |tail -1 |gawk '{print $4}'`
 USED=`free -m | head -3 |tail -1 |gawk '{print $3}'`
 # to calculate free percent
 # use the expression free * 100 / total
 FREETMP=`expr $FREE \* 100`
 USEDTMP=`expr $USED \* 100`
 FREE_PERCENT=`expr $FREETMP / $TOTAL`
 USED_PERCENT=`expr $USEDTMP / $TOTAL`
 if [ $# -le 3 ];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
 }
 while getopts "w:c:h" OPT; do
 case $OPT in
 "w")
 WARNTMP=$OPTARG
 WARN=$(echo $WARNTMP |bc 2>/dev/null)
 if ! [ "$WARN" == "$WARNTMP" ];then
 help
 fi
 ;;
 "c")
 CRITTMP=$OPTARG
 CRIT=$(echo $CRITTMP |bc 2>/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! Used Memory $USED MB ($USED_PERCENT%,Total=$TOTAL MB) | 'USED MEM'=${USED}MB;$WARN_LEVEL;$CRIT_LEVEL;0;$TOTAL"
 exit 2
 fi
 if [ $USED_PERCENT -gt $WARN ];then
 echo "WARNING! Used Memory $USED MB ($USED_PERCENT%,Total=$TOTAL MB) | 'USED MEM'=${USED}MB;$WARN_LEVEL;$CRIT_LEVEL;0;$TOTAL"
 exit 1
 else
 echo "OK! Used Memory $USED MB ($USED_PERCENT%,Total=$TOTAL MB) | 'USED MEM'=${USED}MB;$WARN_LEVEL;$CRIT_LEVEL;0;$TOTAL"
 exit 0
 fi
 nagios服务器的操作  下载安装NRPE  # cd nrpe-2.13# ./configure
 # make all
 # make install-plugin
 测试是否正常:  # /usr/local/nagios/libexec/check_nrpe -H 192.168.1.3NRPE v2.13
 为监控远程主机定义host和service  1、定义check_nrpe命令在文件/usr/local/nagios/etc/objects/commands.cfg后面增加:
 # 'check_nrpe' command definitiondefine command{
 command_name check_nrpe
 command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -t 30 -c $ARG1$
 }
 2、创建/usr/local/nagios/etc/objects/host.cfg    (需提前在nagios.cfg中定义)host定义示例:
 define host{use linux-server
 host_name remotehost
 address 192.168.1.3
 }
 3、创建服务:vi /usr/local/nagios/etc/objects/services.cfg  (需提前在nagios.cfg中定义)  如定义监控远程主机磁盘空间示例(其他服务语法相同):  define service{use generic-service
 host_name  remotehost
 service_description sda磁盘空间
 check_command check_nrpe!check_disk
 }
 之后重载nagios配置文件使其生效  # service nagios reload 
 
 
 一、交换机snmp配置,下面是H3C 5500系列的配置命令:  snmp-agent enablesnmp-agent community read public
 snmp-agent sys-info version all
 snmp-agent group v1 public
 snmp-agent group v2c public
 snmp-agent group v3 public
 snmp-agent target-host trap address udp-domain <nagios服务器IP> params securityname public
 二、安装和配置mrtg1、安装MRTG,使用yum默认安装即可:
 [root@nagios ~]#yum -y install mrtg 
 2、创建配置文件,因为我只需要监控一台核心交换机,因此只创建一个,如果有多个交换机需要监控,则用下面同样的方法创建多个即可:  [root@nagios ~]#mkdir /usr/local/nagios/mrtg        ##创建配置文件存放文件夹[root@nagios ~]#cfgmaker -output=/usr/local/nagios/mrtg/mainswitch.cfg public@交换机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 ~]# env LANG=C /usr/bin/mrtg /usr/local/nagios/mrtg/mainswitch.cfg 
 此步可能会有警告提示,不管他,多执行几次,直到没有警告为止。  使用任务计划配置每5分钟生成一次:  [root@nagios ~]#vi /etc/crontab 
 添加如下一行:  */5 * * * * root /usr/bin/env LANG=C  /usr/bin/mrtg /usr/local/nagios/mrtg/mainswitch.cfg 
 使用service crond restart 重新启动计划任务。  生成汇总首页:  [root@nagios ~]# indexmaker -output=/usr/local/nagios/share/mrtg/index.html -title="MainSwitch Traffic Monitoring"  /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:
 define host{use             generic-switch
 host_name       MainSwitch
 alias           MainSwitch
 address         替换为交换机IP地址
 hostgroups      switches
 }
 定义server:  define service{use                     generic-service
 host_name               MainSwitch
 service_description     端口1流量
 check_command           check_local_mrtgtraf!/usr/local/nagios/share/mrtg/替换为交换机IP_1.log!AVG!1000000,1000000!5000000,5000000!10
 }
 注意:上面交换机IP后面的数字1表示交换机端口1。要监控更多的端口同同样的方法定义更多的服务即可。
 我的机房没有温度报警装置,我用此方法实现对机房温度的掌控,如果只有一台报警,则可认为单机故障,如果几台同时报警,则可认为机房空调出现了问题。具体实现方法如下:  环境:被监控机:CentOS 6.x 1、安装硬件传感器监控软件sensors 2、运行sensors-detect进行传感器检测#yum install  lm_sensors* 
 3、运行sensors看是否能读取数据,如下像下面这样表示正常:#sensors-detect  ##一路回车即可,此步我在虚拟机下报错,但在物理机上没有问题 
 4、#vi /usr/local/nagios/libexec/check_cputemp[root@rd02 ~]# sensorscoretemp-isa-0000
 Adapter: ISA adapter
 Core 0: +35.0°C (high = +85.0°C, crit = +95.0°C)
 Core 1: +34.0°C (high = +85.0°C, crit = +95.0°C)
 Core 9: +36.0°C (high = +85.0°C, crit = +95.0°C)
 Core 10: +31.0°C (high = +85.0°C, crit = +95.0°C)
 5、赋予上述脚本执行权限:#!/bin/sh#########check_cputemp###########
 #date : May 2013
 #Licence GPLv2
 #by Barlow
 #/usr/local/nagios/libexec/check_cputemp
 #you can use NRPE to define service in nagios
 #check_nrpe!check_cputemp
 # Plugin return statements
 STATE_OK=0
 STATE_WARNING=1
 STATE_CRITICAL=2
 STATE_UNKNOWN=3
 print_help_msg(){
 $Echo "Usage: $0 -h to get help."
 }
 print_full_help_msg(){
 $Echo "Usage:"
 $Echo "$0 [ -v ] -m sensors -w cpuT -c cpuT"
 $Echo "Sepicify the method to use the temperature data sensors."
 $Echo "And the corresponding Critical value must greater than Warning value."
 $Echo "Example:"
 $Echo "${0} -m sensors -w 40 -c 50"
 }
 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
 }
 unset LANG
 Echo="echo -e"
 if [ $# -lt 1 ]; then
 print_help_msg
 exit 3
 else
 while getopts :vhm:w:c: OPTION
 do
 case $OPTION
 in
 v)
 #$Echo "Verbose mode."
 Debug=true
 ;;
 m)
 method=$OPTARG
 ;;
 w)
 WARNING=$OPTARG
 ;;
 c)
 CRITICAL=$OPTARG ;;
 h)
 print_full_help_msg
 exit 3
 ;;
 ?)
 $Echo "Error: Illegal Option."
 print_help_msg
 exit 3
 ;;
 esac
 done
 if [ "$method" = "sensors" ]; then
 use_sensors="true"
 to_debug use_sensors
 else
 $Echo "Error. Must to sepcify the method to use sensors."
 print_full_help_msg
 exit 3
 fi
 to_debug All Values  are \" Warning: "$WARNING" and Critical: "$CRITICAL" \".
 fi
 #########lm_sensors##################
 if [ "$use_sensors" = "true" ]; then
 sensorsCheckOut=`which sensors 2>&1`
 if [ $? -ne 0 ];then
 echo $sensorsCheckOut
 echo Maybe you need to check your sensors.
 exit 3
 fi
 to_debug Use $sensorsCheckOut to check system temperature
 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 "No Data been get here. Please confirm your ARGS and re-check it with Verbose mode, then to check the log."
 exit 3
 fi
 to_debug temperature data is $TEMP
 else
 $Echo "Error. Must to sepcify the method to use sensors"
 print_full_help_msg
 exit 3
 fi
 ######### Comparaison with the warnings and criticals thresholds given by user############
 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 , Message is $STATE_MESSAGE
 elif [ "$CPU_TEMP" -gt "$WARNING" ] && [ "$WARNING" != "0" ]; then
 STATE="$STATE_WARNING"
 STATE_MESSAGE="WARNING"
 to_debug $STATE , Message is $STATE_MESSAGE
 else
 STATE="$STATE_OK"
 STATE_MESSAGE="OK"
 to_debug $STATE , Message is $STATE_MESSAGE
 fi
 ##返回值中注意要包含性能数据,即采用|分隔的后半部数据,且数据单位不能包含中文,否则使用PNP等绘图软件无法正常绘图。
 echo "The TEMPERATURE "$STATE_MESSAGE" "-" The CPU's Temperature is "$CPU_TEMP" ℃ ! | 温度=`echo $CPU_TEMP`Celsius;$WARNING;$CRITICAL"
 exit $STATE
 6、配置nrpe.cfg,添加如下一行:#chmod +x  /usr/local/nagios/libexec/check_cputemp 
 command[check_cputemp]=/usr/local/nagios/libexec/check_cputemp -m sensors -w 38 -c 45 
 -w 表示警告值,-c表示关键(紧急)值,自行根据实际情况调整7、在Nagios服务器配置服务:注意:以上六步均在被监控机上完成。
 define service{use             generic-service,svr-pnp
 host_name
 service_description CPU Temperature
 check_command check_nrpe!check_cputemp
 }
 一、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服务器)配置自带防火墙例外或者关闭自带防火墙,开放TCP 5666和TCP 12489端口。  3.2         Nagios服务器端:  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,添加主机定义:define host{
 use            windows-server   ;使用主机模板host_name      主机名            ;主机名
 alias          主机别名         ;主机别名
 address        192.168.0.8             ;IP地址
 }
 3.2.3.       定义服务,编辑/usr/local/nagios/etc/objects/windows.cfg,添加服务定义:  define service{  use                 generic-service ;服务模板  host_name           主机名  ;上面定义的主机名  check_interval        18  service_description    CPU 负载 ;服务名称  check_command      check_nt!CPULOAD!-l 5,80,90  }  说明:检查5分钟平均值,报警值80%,警告值90%。  define service{  use                     generic-service,srv-pnp  host_name               主机名  check_interval          18  service_description     Memory 含虚拟内存  check_command           check_nt!MEMUSE!-w 78 -c 82  }  说明:内存报警值78%,警告值82%(该数据包含虚拟内存)                            监控软件 define service{  use                   generic-service,srv-pnp  host_name             主机名  check_interval          30  service_description      Drive Space D盘  check_command   check_nt!USEDDISKSPACE!-l d -w 80 -c 90  }  说明:-l后接盘符,报警值80%,警告值90%。  define service{  use               generic-service  host_name         主机名  service_description  服务名  check_command  check_nt!SERVICESTATE!-d SHOWALL -l 服务名  }  说明:-l后接要检查的服务名称;contacts为定义的通知联系人。  
 其他更多的用法可以根据windows.cfg文件的预定义服务进行举一反三。
 3.2.4.       使用命令:service nagios restart重启查看状态,正常的话如下图:  四、        自定义脚本监控(NRPE):  4.1         客户端脚本编写:  脚本的编写可以使用批处理、powershell脚本或vbs等,只要能返回状态信息和返回值(见文章开头第一段说明)。  例如如使用批处理,可以使用echo命令返回状态信息;使用exit跟数字0、1、2、3返回状态值。如下面的一段批处理脚本可以实现对进程状态进行监控:  :: 监控进程是否运行  ::%1表示使用中的第一个参数,即进程名称  tasklist |find "%1" >NUL  IF ERRORLEVEL 1 GOTO err  IF ERRORLEVEL 0 GOTO ok  :err  echo CRITICAL!Process %1 is not exist!  exit  2  ::返回值为2,表示警告  : ok  echo OK!Process %1 is exist!  exit  0  ::返回值为0,表示正常  将上述命令作为批处理保存在C:\Program Files\NSClient++\scripts路径下如check_run.bat,注意,在返回的状态信息中尽量不要用中文。4.2         客户端脚本命令配置:
 编辑C:\Program Files\NSClient++\nsclient.ini,找到[/settings/external scripts/scripts]一行,在下面加入如下内容:  Command_alias=scripts\check_run.bat Process_Name.exe  注意:等号前面的别名为服务器端调用的命令,等号后面接具体的脚本,脚本后面跟参数进程名称,该参数会被脚本使用%1变量进行调用。如我要监控【视频监控主机】的视频录像程序是否启动,可替换为check_manager=scripts\check_run.bat  VideoManager.exe4.3         服务器端服务配置():
 定义服务后:  define service{  use                     generic-service  host_name               Monitor  service_description           管理平台  check_command          check_nrpe!check_manager  }  4.4         重启Nagios服务:service nagios restart  通过上述默认支持的监控项目和自定义脚本,基本能实现Windows所有需要的监控(对部分服务的详细监控需要很复杂的脚本才能实现)。 1.DBI的安装 2.DBD的安装 3.编译安装NDOUtils# wget modules/by-module/DBD/DBD-mysql-4.023.tar.gz# tar -zxvf DBD-mysql-4.023.tar.gz
 # cd DBD-mysql-4.023
 # perl Makefile.PL --mysql_config=/usr/local/mysql/bin/mysql_config --libs=-L/usr/local/mysql/lib-static -lmysqlclient
 # make
 # make install
 4.为NDOUtils创建数据库# tar zxf ndoutils-1.5.2.tar.gz# cd ndoutils-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
 # chown nagios:nagios /usr/local/nagios/bin/*
 # cp ./config/ndo* /usr/local/nagios/etc/
 # chown nagios:nagios /usr/local/nagios/etc/*
 5.编辑配置文件# mysql -uroot -pmysql> create database nagios;
 mysql> GRANT SELECT,INSERT,UPDATE,DELETE ON nagios.* TO nagios@localhost IDENTIFIED BY '123456';
 mysql> flush privileges;
 mysql> \q
 生成ndoutils所需要的数据库
 # cd db
 # ./installdb -u n root -p 123456 -h localhost -d nagios
 也可这样:# /opt/mysql/bin/mysql -u root -p -D nagios -h localhost < ./db/mysql.sql
 6.启动ndo2db# vi /usr/local/nagios/etc/ndo2db.cfgdb_user=nagios
 db_pass=123456
 # vi /usr/local/nagios/etc/nagios.cfg
 # 复制下面内容粘贴到#broker_module=...下面。
 broker_module=/usr/local/nagios/bin/ndomod-3x.o config_file=/usr/local/nagios/etc/ndomod.cfg
 此外,请确保您的/usr/local/nagios/etc/nagios.cfg中有如下行出现,否则,请自行添加:
 event_broker_options=-1 //为Nagios开启event broker
 7.重启动nagios# /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
 # /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg# service nagios restart
 检查安装  8、遇到问题:# tail -20 /usr/local/nagios/var/nagios.log 
 1.执行 # /usr/local/nagios/bin/ndo2db-3x -c /usr/local/nagios/etc/ndo2db.cfg提示错误:Could not bind socket: Address already in use
 解决:ps aux|grep ndo2db #没有
 查看套接字文件是否存在,删除之
 ll /usr/local/nagios/var/ndo.sockrm /usr/local/nagios/var/ndo.sock
 2.#ndo2db数据不能导入到数据库原因:编译时没有LDFLAGS=-L/opt/mysql/lib
 解决:重新编译ndoutils并加上 LDFLAGS=-L/opt/mysql/lib
 1、准备NRPE for HP-UX软件和用户: 1.1 准备软件# ./configure --prefix=/usr/local/nagios --enable-mysql --disable-pgsql LDFLAGS=-L/usr/local/mysql/lib --with-mysql-inc=/usr/local/mysql/include/mysql --with-mysql-lib=/usr/local/mysql/lib/mysql# make
 #再执行一下安装过程后,通过
 可以到naghpux/下载  我实际使用中由于存在多台HP-UX,因此都是统一从Nagios服务器拷贝至被监控端的,命令如下:  # scp /var/ftp/nagios/NRPE-2.12.depot HP-UX_IP:/tmp 
 如果服务器很多,可以将上述命令写成脚本,实现批量推送。 1.2 建立NRPE用户: 2、在HP-UX上安装NRPE:groupadd -g 312 nrpeuseradd -g nrpe -u 312 nrpe
 ##指定GID和UID为312是因为后面的配置脚本中默认是这样指定的,我这里就不做修改                   nagios实施
 2.1 HP-UX的软件包格式为depot,使用swinstall命令安装:  # swinstall -s /tmp/NRPE-2.12.depot 
 2.2 默认会弹出swinstall命令的使用提示,按任意键继续:  2.3 使用空格键选中NRPE包,并使用tab键切换至菜单“Actions”,然后选择“Mark For Install”  按回车后,NRPE包前方会有Yes标记:  2.4 再次按tab键,切换到菜单“Actions”,然后选择“Install”进行安装:  首先会对安装程序进行分析,通过后选中“OK”,进入正式安装:  安装完成后,选中“done”,后按回车键,然后使用tab键选择“File”菜单的"exit"退出:  检查安装情况,默认nrpe会被安装到/opt/nrpe:  3、配置nrpe: 3.1 配置nrpe主配置文件/opt/nrpe/etc/nrpe.conf:root@rzcs:/#ls /opt/nrpebin etc libexec
 3.2 将NRPE配置为inetd管理的进程:vi /opt/nrpe/etc/nrpe.cfg ##修改如下两行server_address=127.0.0.1 Nagios_Server_IP
 allowed_hosts=127.0.0.1 Nagios_Server_IP
 ##其他可以暂时保持默认,注意底部有监控命令的配置,如果是自写脚本,则需要配置:
 ……中间省略……  command[check_users]=/opt/nrpe/libexec/check_users -w 5 -c 10command[check_load]=/opt/nrpe/libexec/check_load -w 15,10,5 -c 30,25,20
 command[check_zombie_procs]=/opt/nrpe/libexec/check_procs -w 5 -c 10 -s Z
 command[check_total_procs]=/opt/nrpe/libexec/check_procs -w 1500 -c 2000
 command[check_hpux_disk]=/opt/nrpe/libexec/check_disk -w 20 -c 10
 command[check_free_mem]=/opt/nrpe/libexec/check_mem.pl -f -w 10 -c 5   ##自写脚本,后面会贴出脚本内容
 NRPE自带有配置脚本,只需执行下该脚本即可  4、编写内存监控脚本:/opt/nrpe/bin/configure.sh##该脚本会将nrpe相关配置写入/etc/inetd.conf 和/etc/services,与Linux下nrpe启动配置一样
 NRPE自带有大量监控插件的,此处于linux下需要单独安装插件不同。但自带的插件不能监控内存,因此我借鉴网上别人脚本,再根据实际情况做了些调整:  #!/usr/bin/perl -w#by barlow修改
 #use strict;
 use Getopt::Std;
 use vars qw($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);
 # Predefined exit codes for Nagios%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);
 # Define the calculating scalars$used_memory = $memlist[0];
 $free_memory = $memlist[1];
 $total_memory = $used_memory + $free_memory;
 # Get the optionsif ($#ARGV le 0)
 {
 &usage;
 }
 else
 {
 getopts('c:fuw:');
 }
 # Shortcircuit the switchesif (!$opt_w or $opt_w == 0 or !$opt_c or $opt_c == 0)
 {
 print "*** You must define WARN and CRITICAL levels!" if ($verb_err);
 &usage;
 }
 elsif (!$opt_f and !$opt_u)
 {
 print "*** You must select to monitor either USED or FREE memory!" if ($verb_err);
 &usage;
 }
 # Check if levels are saneif ($opt_w <= $opt_c and $opt_f)
 {
 print "*** WARN level must not be less than CRITICAL when checking FREE memory!" if ($verb_err);
 &usage;
 }
 elsif ($opt_w >= $opt_c and $opt_u)
 {
 print "*** WARN level must not be greater than CRITICAL when checking USED memory!" 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 "Memory CRITICAL -FREE $fmt_pct% (FREE:$free_memory kB TOTAL:$total_memory kB)\n";
 exit $exit_codes{'CRITICAL'};
 }
 elsif ($percent <= $warn_level)
 {
 print "Memory WARNING -FREE $fmt_pct% (FREE:$free_memory kB TOTAL:$total_memory kB)\n";
 exit $exit_codes{'WARNING'};
 }
 else
 {
 print "Memory OK -FREE $fmt_pct% (FREE:$free_memory kB TOTAL:$total_memory kB)\n";
 exit $exit_codes{'OK'};
 }
 }
 elsif ($opt_u)
 {
 $percent = $used_memory / $total_memory * 100;
 $fmt_pct = sprintf "%.1f", $percent;
 if ($percent >= $crit_level)
 {
 print "Memory CRITICAL -USED $fmt_pct% (USED:$used_memory kB TOTAL:$total_memory kB)\n";
 exit $exit_codes{'CRITICAL'};
 }
 elsif ($percent >= $warn_level)
 {
 print "Memory WARNING -USED $fmt_pct% (USED:$used_memory kB TOTAL:$total_memory kB)\n";
 exit $exit_codes{'WARNING'};
 }
 else
 {
 print "Memory OK -USED $fmt_pct% (USED:$used_memory kB TOTAL:$total_memory kB)\n";
 exit $exit_codes{'OK'};
 }
 }
 #打印帮助sub usage()
 {
 print "\ncheck_mem.pl - Nagios Plugin\n\n";
 print "usage:\n";
 print " check_mem.pl -<f|u> -w <warnlevel> -c <critlevel>\n\n";
 print "options:\n";
 print " -f Check FREE memory\n";
 print " -u Check USED memory\n";
 print " -w PERCENT Percent free/used when to warn\n";
 print " -c PERCENT Percent free/used when critical\n";
 exit $exit_codes{'UNKNOWN'};
 }
 脚本说明:/usr/sbin/swapinfo 取出的信息并不是真实的物理内存使用情况,也不是swap信息,而是HP-UX系统下的页面调度信息,与服务器真实的内存使用情况有一定出入,但基本一致。  另外由于swapinfo命令需要管理员身份执行,因此我直接赋予脚本u+s权限:  5、启动NRPE: 5.1 方法一:chmod 4755 /opt/nrpe/libexec/check_mem.pl  ##相当于chmod u+x 
 5.2 方法二:# inetd -k && inetd   ##重启inetd守护进程以实现nrpe的启动 
 # 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 在被监控服务器上查看服务是否正常启动:
 6.2 在Nagios服务器上测试联系NRPE:# netstat -an|grep -i tcp |grep 5666  ##查看监控端口是否开启 
 /usr/local/nagios/libexec/check_nrpe -H HP-UX_IP  NRPE v2.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:  # INTERVAL LENGTH # This is the seconds per unit interval as used in the
 # host/contact/service configuration files.  Setting this to 60 means
 # that each interval is one minute long (60 seconds).  Other settings
 # have not been tested much, so your mileage is likely to vary...
 interval_length=60 
 在定义主机和服务时,都是以该值为基础的,如服务中定义如下:  check_interval                 6 retry_interval                  2
 则表示检查间隔为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 服务和主机依赖: 定义服务依赖,有助于降低务必要的报警,如某服务器连接的交换机坏了,则服务器及其服务肯定无法再检测,此时就完全不再去检测服务器和其服务。 服务依赖定义语法: 标记了(*)的域是必备的而蓝色是可选的。然而你最少要在定义中给定出一种使用类型标准。  主机间依赖定义:define servicedependency{ dependent_host_name       host_name(*)
 dependent_hostgroup_name       hostgroup_name
 dependent_service_description       service_description(*)
 host_name       host_name(*)
 hostgroup_name       hostgroup_name
 service_description       service_description(*)
 inherits_parent       [0/1]
 execution_failure_criteria       [o,w,u,c,p,n]
 notification_failure_criteria       [o,w,u,c,p,n]
 dependency_period       timeperiod_name
 ...
 }
 在上图例子中,针对主机C的依赖关系定义将会是这样的:  二、使用pnpnagios实现对性能数据绘图:define hostdependency{ host_name            Host A
 dependent_host_name        Host C
 notification_failure_criteria    d
 }
 define hostdependency{
 host_name            Host B
 dependent_host_name        Host C
 notification_failure_criteria    d,u
 }
 只要检测返回数据包含性能数据(即返回结果以管道符|分开的,且有特定格式的部分),就可以使用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个,如果使用传统的密码文件方式认证,很不利于管理(比如用户不能自己修改密码,用户要记多个系统不同的密码),而我们所有系统的认证都是通过Windows Active Directory进行认证的,因此使用LDAP认证可以实现统一认证。在apache httpd中,提供了一个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
 Options None
 AllowOverride None
 Order allow,deny
 Allow from all
 #  如下红色几行为原默认认证方式 #   AuthName "Nagios Access"
 #   AuthType Basic
 #   AuthUserFile /etc/nagios/htpasswd.users
 #   Require valid-user
 #   如下部分为LDAP认证方式 AuthName "Nagios Access"
 AuthType Basic
 AuthBasicProvider ldap
 AuthzLDAPAuthoritative On
     #注意ldap路径的方式,用户和组使用CN,组织单元使用OU AuthLDAPURL [url=]ldap://dc01.toxingwang.com:389/OU=admin,DC=toxingwang,DC=com?sAMAccountName?sub?(objectClass[/url]=*)
 AuthLDAPBindDN nagiosadmin@toxingwang.com   ##与AD通讯的账号,任意普通账号即可
 AuthLDAPBindPassword password    ##上述账号的密码,注意,明文方式,因此一定使用普通账号
 #如下一行可定义基于指定ou下的用户验证
 #Require valid-user
 #如下两行定义基于指定组的认证
 AuthLDAPGroupAttributeIsDN on    ##开启基于组的验证
    #组对应的ldap路径 require ldap-group CN=nagiousers,OU=admin,DC=toxingwang,DC=com
 </Directory>
 注意需要替换所有用到验证的地方(包含pnp4nagios的httpd配置)。然后重启httpd即可使用域账号登录nagios了。当然可以访问nagios的web页面,不一定具有查看相关监控服务的权限,下面进行定义: 3.2 定义联系人: 3.2.1 定义联系人: 打开Nagios的contacts.cfg文件,定义每一个就具有权限的用户:  3.2.2 定义联系人组:define contact { contact_name                    barlow   ##需要与WindowsAD域中的账号相同
 alias                           Barlow
         ##如下两行定义通知方式,后面会详细讲到 host_notification_commands      notify-host-by-email,notify-host-by-message
 service_notification_commands   notify-service-by-email,notify-service-by-message
 email                           barlow@toxingwang.com  ##定义通知邮箱
 address1                        18000000000   ##定义短信通知手机
 use                             generic-contact     ##使用通用模板
 register                        1   ##是否启用
 }
 按用户管理服务的不同,定义相关的联系人组,如DBA管理组、OA管理组、网络管理组、SAP管理组等,编辑contactgroups.cfg  3.2.3 使用服务模板和主机模板的方式实现权限管理:define contactgroup { contactgroup_name               admins
 alias                           Nagios Administrators
 members                         barlow
 register                        1
 }
 define contactgroup { contactgroup_name               netadmins
 alias                           Network Administrators
 members                         zhangsan,barlow,lisi   ##组内包含的用户
 register                        1
 }
 与联系人组定义思想相同,按权限不同,将相关联系人组和联系人加入到服务模板和主机模板,以后在定义服务是引用该模板即可,具体实现如下: 编辑主机模板文件:hosttemplates.cfg define host { name                            generic-network-admins
 contact_groups                  netadmins   ##将上诉定义的联系人组加入
 register                        0
 }
 以后在定义主机时,如果需要改组用户具有此主机的权限,则引用该模板即可。 编辑服务模板文件:servicetemplates.cfg define service { name                            network-service-admins
         #如下几行定义通知机制,可根据需要调整 #notification_interval           30
 #notification_period             24x7
 #notification_options            w,u,c,r
 #notifications_enabled           1
 contact_groups                  admins,netadmins
 register                        0
 }
 同使用主机模板一样,在以后定义服务时,如果需要用户具有查看该服务的权限,则引用模板即可。 3.3 使用Mail和短信双重报警: 我使用sendEmail脚本(脚本下载)发送通知邮件,命令定义如下:  define command { command_name                    notify-service-by-email
 command_line                    /usr/bin/printf "%b" "**Server Info for $HOSTALIAS$**\nAdditional Info:\n\n$SERVICEOUTPUT$\n\nNotification Type: $NOTIFICATIONTYPE$\n\nService: $SERVICEDESC$\nHost: $HOSTALIAS$\nAddress: $HOSTADDRESS$\nState: $SERVICESTATE$\n\nDate/Time: $LONGDATETIME$\n\nIf you have any questions, please send email tobarlow@toxingwang.com or call my phone 13360052520\n" | /usr/local/sendEmail/sendEmail –f <发件人邮箱> -t $CONTACTEMAIL$ –s <smtp服务器> -u "$NOTIFICATIONTYPE$ Service:$HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$"   -xu <发件人账号(邮箱)>  -xp <发件人密码> -o message-charset=utf-8 -o message-header=utf-8
 register                        1
 }
 短信通知功能可以使用短信猫、飞信、或者其他短信接口实现,我使用公司短信结构实现,命令定义如下:  define command { command_name                    notify-service-by-message
 command_line                    $USER1$/sendmessage.py $CONTACTADDRESS1$ "$NOTIFICATIONTYPE$ Service:$HOSTALIAS$ / $SERVICEDESC$ is $SERVICESTATE$!$SERVICEOUTPUT$ –by Nagios"
 register                        1
 }
 想做Nagios, Zabbix,Cacti,iTop各种交流的,可以进入开源监控工具Nagios交流  QQ群号 :476809427 
 |