nagios运维手册

 

1      前言

1.1  系统功能概述

Nagios是一款开源的免费网络监视工具,能有效监控Windows、Linux和Unix的主机状态,交换机路由器等网络设置,打印机等。在系统或服务状态异常时发出邮件或短信报警第一时间通知网站运维人员,在状态恢复后发出正常的邮件或短信通知。

Nagios 可以监控的功能有:

1、监控网络服务(SMTP、POP3、HTTP、NNTP、PING等);

2、监控主机资源(处理器负荷、磁盘利用率等);

3、简单地插件设计使得用户可以方便地扩展自己服务的检测方法;

4、并行服务检查机制;

5、具备定义网络分层结构的能力,用"parent"主机定义来表达网络主机间的关系,这种关系可被用来发现和明晰主机宕机或不可达状态;

6、当服务或主机问题产生与解决时将告警发送给联系人(通过EMail、短信、用户定义方式);

7、可以定义一些处理程序,使之能够在服务或者主机发生故障时起到预防作用;

8、自动的日志滚动功能;

9、可以支持并实现对主机的冗余监控;

10、可选的WEB界面用于查看当前的网络状态、通知和故障历史、日志文件等;


2      安装配置

2.1  安装配置nagios

2.1.1      安装依赖程序

yum install gcc glibc glibc-common gd gd-devel xinetd openssl-devel

2.1.2      创建nagios用户和用户组

useradd -s /sbin/nologin nagios

mkdir /usr/local/nagios

chown -R nagios.nagios /usr/local/nagios

2.1.3      安装nagios

wget http://cznic.dl.sourceforge.net/project/nagios/nagios-4.x/nagios-4.0.8/nagios-4.0.8.tar.gz

tar zxvf nagios-4.0.8.tar.gz

nagios在nginx+fcgi下会出现在web界面下设置主机信息的时候出错502,这是需要

到nagios源代码目录的cgi目录,找到cmd.c文件,搜索post,只有一个,修改为get

vi /usr/local/src/nagios-4.0.8/cgi/cmd.c

printf("

\n", COMMAND_CGI);

改成

printf("\n", COMMAND_CGI);

cd Nagios-4.0.8

./configure --prefix=/usr/local/nagios

make all

make install

make install-init

make install-commandmode

make install-config

make install-cgis

 

chkconfig --add nagios

chkconfig --level 3 nagios on

2.1.4      nagios目录说明

切换目录到安装路径(这里是/usr/local/nagios),看是否存在etc、bin、sbin、share、var 这五个目录,如果存在则可以表明程序被正确的安装到系统了。Nagios 各个目录用途说明如下:

目录 说明
bin Nagios 可执行程序所在目录
etc Nagios 配置文件所在目录
sbin Nagios CGI 文件所在目录,也就是执行外部命令所需文件所在的目录
share Nagios网页文件所在的目录
libexec Nagios 外部插件所在目录
var Nagios 日志文件、lock 等文件所在的目录
var/archives Nagios 日志自动归档目录
var/rw 用来存放外部命令文件的目录

2.1.5      安装Nagiosplugins

wget http://nagios-plugins.org/download/nagios-plugins-2.0.3.tar.gz

tar zxvf nagios-plugins-2.0.3.tar.gz

cd nagios-plugins-2.0.3

./configure --prefix=/usr/local/nagios

make && make install

2.1.6      配置nagios

l  配置文件和目录说明

文件名或目录 用途
cgi.cfg 控制CGI访问的配置文件
nagios.cfg Nagios 主配置文件
resource.cfg 变量定义文件,又称为资源文件,在些文件中定义变量,以便由其他配置文件引用,如$USER1$
objects objects 是一个目录,在此目录下有很多配置文件模板,用于定义Nagios 对象
objects/commands.cfg 命令定义配置文件,其中定义的命令可以被其他配置文件引用
objects/contacts.cfg 定义联系人和联系人组的配置文件
objects/localhost.cfg 定义监控本地主机的配置文件
objects/printer.cfg 定义监控打印机的一个配置文件模板,默认没有启用此文件
objects/switch.cfg 定义监控路由器的一个配置文件模板,默认没有启用此文件
objects/templates.cfg 定义主机和服务的一个模板配置文件,可以在其他配置文件中引用
objects/timeperiods.cfg 定义Nagios 监控时间段的配置文件
objects/windows.cfg 监控Windows 主机的一个配置文件模板,默认没有启用此文件

 

l  resource.cfg文件

resource.cfg是nagios的变量定义文件,文件内容只有一行:

$USER1$=/usr/local/nagios/libexec

其中,变量$USER1$指定了安装nagios插件的路径,如果把插件安装在了其它路径,只需在这里进行修改即可。需要注意的是,变量必须先定义,然后才能在其它配置文件中进行引用。

l  commands.cfg文件

此文件默认是存在的,无需修改即可使用,当然如果有新的命令需要加入时,在此文件进行添加即可。

#notify-host-by-email命令的定义
define command{
        command_name    notify-host-by-email             #命令名称,即定义了一个主机异常时发送邮件的命令。
        command_line    /usr/bin/printf "%b" "***** Nagios *****\n\nNotification Type: $NOTIFICATIONTYPE$\nHost: $HOSTNAME$\nState: $HOSTSTATE$\nAddress: $HOSTADDRESS$\nInfo: $HOSTOUTPUT$\n\nDate/Time: $LONGDATETIME$\n" | /bin/mail -s "** $NOTIFICATIONTYPE$ Host Alert: $HOSTNAME$ is $HOSTSTATE$ **" $CONTACTEMAIL$                                     #命令具体的执行方式。
        }
#notify-service-by-email命令的定义
define command{
        command_name    notify-service-by-email          #命令名称,即定义了一个服务异常时发送邮件的命令
        command_line    /usr/bin/printf "%b" "***** Nagios *****\n\nNotification Type: $NOTIFICATIONTYPE$\n\nService: $SERVICEDESC$\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$
        }
#check-host-alive命令的定义
define command{
        command_name    check-host-alive                 #命令名称,用来检测主机状态。
        command_line    $USER1$/check_ping -H $HOSTADDRESS$ -w 3000.0,80% -c 5000.0,100% -p 5            
                        # 这里的变量$USER1$在resource.cfg文件中进行定义,即$USER1$=/usr/local/nagios/libexec;
                        # 那么check_ping的完整路径为/usr/local/nagios/libexec/check_ping;
                        # “-w 3000.0,80%”中“-w”说明后面的一对值对应的是“WARNING”状态,“80%”是其临界值。
                        # “-c 5000.0,100%”中“-c”说明后面的一对值对应的是“CRITICAL”,“100%”是其临界值。
                        # “-p 1”说明每次探测发送一个包。
        }
define command{
        command_name    check_local_disk
        command_line    $USER1$/check_disk -w $ARG1$ -c $ARG2$ -p $ARG3$            #$ARG1$是指在调用这个命令的时候,命令后面的第一个参数。
        }

 

l  hosts.cfg文件

此文件默认不存在,需要手动创建,hosts.cfg主要用来指定被监控的主机地址以及相关属性信息:

define host{  
        use                     linux-server          #引用主机linux-server的属性信息,linux-server主机在templates.cfg文件中进行了定义。
        host_name               Nagios-Linux          #主机名
        alias                   Nagios-Linux          #主机别名
        address                 192.168.1.111         #被监控的主机地址,这个地址可以是ip,也可以是域名。
        }  
#定义一个主机组  
define hostgroup{     
        hostgroup_name          bsmart-servers        #主机组名称,可以随意指定。
        alias                   bsmart servers        #主机组别名
        members                 Nagios-Linux          #主机组成员,其中“Nagios-Linux”就是上面定义的主机。    
        }

 

l  services.cfg文件

此文件默认也不存在,需要手动创建,services.cfg文件主要用于定义监控的服务和主机资源,例如监控http服务、ftp服务、主机磁盘空间、主机系统负载等等。

define service{ 
        use                     local-service          #引用local-service服务的属性值,local-service在templates.cfg文件中进行了定义。
        host_name               Nagios-Linux           #指定要监控哪个主机上的服务,“Nagios-Server”在hosts.cfg文件中进行了定义。
        service_description     check-host-alive       #对监控服务内容的描述,以供维护人员参考。
        check_command           check-host-alive       #指定检查的命令。
        } 

 

l  contacts.cfg文件

contacts.cfg是一个定义联系人和联系人组的配置文件,当监控的主机或者服务出现故障,nagios会通过指定的通知方式(邮件或者短信)将信息发给这里指定的联系人或者使用者。

define contact{
        contact_name                    David             #联系人的名称,这个地方不要有空格
        use                             generic-contact   #引用generic-contact的属性信息,其中“generic-contact”在templates.cfg文件中进行定义
        alias                           Nagios Admin
        email                           [email protected]
        }
define contactgroup{
        contactgroup_name       ts                              #联系人组的名称,同样不能空格
        alias                   Technical Support               #联系人组描述
        members                 David                           #联系人组成员,其中“david”就是上面定义的联系人,如果有多个联系人则以逗号相隔
        }

 

l  timeperiods.cfg文件

此文件只要用于定义监控的时间段,下面是一个配置好的实例:

#下面是定义一个名为24x7的时间段,即监控所有时间段 
define timeperiod{ 
        timeperiod_name 24x7       #时间段的名称,这个地方不要有空格
        alias           24 Hours A Day, 7 Days A Week 
        sunday          00:00-24:00 
        monday          00:00-24:00 
        tuesday         00:00-24:00 
        wednesday       00:00-24:00 
        thursday        00:00-24:00 
        friday          00:00-24:00 
        saturday        00:00-24:00 
        } 
#下面是定义一个名为workhours的时间段,即工作时间段。 
define timeperiod{ 
        timeperiod_name workhours  
        alias           Normal Work Hours 
        monday          09:00-17:00 
        tuesday         09:00-17:00 
        wednesday       09:00-17:00 
        thursday        09:00-17:00 
        friday          09:00-17:00 
        } 

 

l  nagios.cfg文件

nagios.cfg默认的路径为/usr/local/nagios/etc/nagios.cfg,是nagios的核心配置文件,所有的对象配置文件都必须在这个文件中进行定义才能发挥其作用,这里只需将对象配置文件在Nagios.cfg文件中进行引用即可。

log_file=/usr/local/nagios/var/nagios.log                  # 定义nagios日志文件的路径
cfg_file=/usr/local/nagios/etc/objects/commands.cfg        # “cfg_file”变量用来引用对象配置文件,如果有更多的对象配置文件,在这里依次添加即可。
cfg_file=/usr/local/nagios/etc/objects/contacts.cfg
cfg_file=/usr/local/nagios/etc/objects/hosts.cfg
cfg_file=/usr/local/nagios/etc/objects/services.cfg
cfg_file=/usr/local/nagios/etc/objects/timeperiods.cfg
cfg_file=/usr/local/nagios/etc/objects/templates.cfg
cfg_file=/usr/local/nagios/etc/objects/localhost.cfg       # 本机配置文件
cfg_file=/usr/local/nagios/etc/objects/windows.cfg         # windows 主机配置文件
object_cache_file=/usr/local/nagios/var/objects.cache      # 该变量用于指定一个“所有对象配置文件”的副本文件,或者叫对象缓冲文件
precached_object_file=/usr/local/nagios/var/objects.precache
resource_file=/usr/local/nagios/etc/resource.cfg           # 该变量用于指定nagios资源文件的路径,可以在nagios.cfg中定义多个资源文件。
status_file=/usr/local/nagios/var/status.dat               # 该变量用于定义一个状态文件,此文件用于保存nagios的当前状态、注释和宕机信息等。
status_update_interval=10                                  # 该变量用于定义状态文件(即status.dat)的更新时间间隔,单位是秒,最小更新间隔是1秒。
nagios_user=nagios                                         # 该变量指定了Nagios进程使用哪个用户运行。
nagios_group=nagios                                        # 该变量用于指定Nagios使用哪个用户组运行。
check_external_commands=1                                  # 该变量用于设置是否允许nagios在web监控界面运行cgi命令;
                                                           # 也就是是否允许nagios在web界面下执行重启nagios、停止主机/服务检查等操作;
                                                           # “1”为运行,“0”为不允许。
command_check_interval=10s                                 # 该变量用于设置nagios对外部命令检测的时间间隔,如果指定了一个数字加一个"s"(如10s);
                                                           # 那么外部检测命令的间隔是这个数值以秒为单位的时间间隔;
                                                           # 如果没有用"s",那么外部检测命令的间隔是以这个数值的“时间单位”的时间间隔。
interval_length=60                                         # 该变量指定了nagios的时间单位,默认值是60秒,也就是1分钟;
                                                           # 即在nagios配置中所有的时间单位都是分钟。

2.1.7      验证Nagios 配置文件的正确性

Nagios 在验证配置文件方面做的非常到位,只需通过一个命令即可完成:

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

看到下面这些信息就说明没问题了,如图(图1)

图1

2.1.8      Nagios的启动与停止

l  启动Nagios

/etc/init.d/nagios start

l  重启Nagios

/etc/init.d/nagios reload

or

/etc/init.d/nagios restart

l  停止Nagios

/etc/init.d/nagios stop

2.1.9      登陆nagios

登录Nagios Web监控页http://IP/nagios/ 查看相关信息。如图(图2)

图2

 

2.2  安装配置nginx

2.2.1      安装nginx

详见cacti运维手册

2.2.2      配置nginx

l  修改nginx.conf配置文件(增加红色部分)

user  webuser users;
worker_processes  1;
 
#error_log  logs/error.log;
error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
 
pid        logs/nginx.pid;
 
 
events {
    worker_connections  1024;
}
 
 
http {
    include       mime.types;
    default_type  application/octet-stream;
 
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';
 
    #access_log  logs/access.log  main;
 
    sendfile        on;
    #tcp_nopush     on;
 
    #keepalive_timeout  0;
    keepalive_timeout  65;
 
    #gzip  on;
 
server {
        listen       80;
        server_name  10.0.112.100;
 
        #charset koi8-r;
 
        #access_log  logs/host.access.log  main;
 
        location / {
            root   html;
            index  index.html index.htm index.php;
        }
 
 
 
 
        #error_page  404              /404.html;
 
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
 
        location ~ \.php$ {
            root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi.conf;
            fastcgi_ignore_client_abort on;
        }
 
 
        location ~ .*\.(cgi|pl)?$ {
        gzip off;
        root   /usr/local/nagios/sbin;
        rewrite ^/nagios/cgi-bin/(.*)\.cgi /$1.cgi break;
        fastcgi_pass  unix:/opt/nginx/logs/perl-fcgi.sock;
        fastcgi_param SCRIPT_FILENAME /usr/local/nagios/sbin$fastcgi_script_name;
        fastcgi_index index.cgi;
        fastcgi_read_timeout   60;
        fastcgi_param  REMOTE_USER        $remote_user;
        include        fastcgi_params;
        }
    }
}

l  将nagios页面路径链接到网站文件存放路径

ln -s /usr/local/nagios/share/ /opt/nginx/html/nagios

2.2.3      nginx的perl环境

Nagios依赖PHP环境和perl环境。由于Nginx不支持Perl的CGI,这里就需要先来搭建Perl环境。让nginx支持fcgi

l  安装FCGI-ProcManager模块

wget http://search.cpan.org/CPAN/authors/id/F/FL/FLORA/FCGI-0.73.tar.gz

tar -zxvf FCGI-ProcManager-0.73.tar.gz

cd FCGI-ProcManager-0.73

perl Makefile.PL

make

make install

 

l  安装FCGI-0.73

tar zxvf FCGI-0.73.tar.gz

cd FCGI-0.73

perl Makefile.PL

make

make install

 

l  安装IO和IO::ALL模块

wget http://search.cpan.org/CPAN/authors/id/G/GB/GBARR/IO-1.25.tar.gz

tar -zxvf IO-1.25.tar.gz

cd IO-1.25

perl Makefile.PL

make

make install

 

wget http://search.cpan.org/CPAN/authors/id/I/IN/INGY/IO-All-0.41.tar.gz

tar -zxvf IO-All-0.41.tar.gz

cd IO-All-0.41

perl Makefile.PL

make

make install

 

l  下载Perl脚本,这个脚本的目的就是产生一个PERL的FastCGI接口,让Nginx可以以CGI方式处理Perl。

wget http://www.mike.org.cn/wp-content/uploads/2011/07/perl-fcgi.zip

unzip perl-fcgi.zip

mv perl-fcgi.pl /opt/nginx/

chmod 755 /opt/nginx/perl-fcgi.pl

 

l  建立一个CGI启动/停止脚本,注意pidfile和dir路径。

vi /etc/init.d/perl-fcgi

#!/bin/bash
# chkconfig:   - 99 15
# description: perl-fcgi
# processname: perl-fcgi
# pidfile: /usr/local/webserver/nginx/logs/perl-fcgi.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
#set -x
dir=/opt/nginx
 
stop ()
{
#pkill  -f  $dir/perl-fcgi.pl
kill $(cat $dir/logs/perl-fcgi.pid)
rm $dir/logs/perl-fcgi.pid 2>/dev/null
rm $dir/logs/perl-fcgi.sock 2>/dev/null
echo "stop perl-fcgi done"
}
 
start ()
{
rm $dir/now_start_perl_fcgi.sh 2>/dev/null
rm $dir/logs/perl-fcgi.pid 2>/dev/null
rm $dir/logs/perl-fcgi.sock 2>/dev/null
chown webuser.users $dir/logs
echo "$dir/perl-fcgi.pl -l $dir/logs/perl-fcgi.log -pid $dir/logs/perl-fcgi.pid -S $dir/logs/perl-fcgi.sock" >>$dir/now_start_perl_fcgi.sh
 
chown webuser.users $dir/now_start_perl_fcgi.sh
chmod u+x $dir/now_start_perl_fcgi.sh
 
sudo -u webuser $dir/now_start_perl_fcgi.sh
echo "start perl-fcgi done"
}
 
case $1 in
stop)
stop
;;
start)
start
;;
restart)
stop
start
;;
esac

chmod 755 /etc/init.d/perl-fcgi

chkconfig --add perl-fcgi

chkconfig perl-fcgi on

 

由于启动脚本里使用了sudo,所以当服务器重启并加载这个服务脚本时会提示需要一个tty,导致fcgi不能随服务器一起启动起来,所以要修改/etc/sudoers

vi /etc/sudoers

Defaults requiretty,修改为 Defaults:webuser! requiretty 表示仅webuser用户不需要控制终端。

启动脚本,正常情况下在/opt/nginx/logs下生成perl-fcgi.sock这个文件,如果没有生成,请检查下上面的步聚。

 

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

use_authentication=1 #把1修改为0,保存

l  启动nginx

/etc/init.d/nginx start

 

2.3  安装配置PHP

详见cacti运维手册

2.4  安装插件ndoutils

(如果要整合cacti,此步跳过看2.5)

该插件可以将nagios监控结果保存到mysql中

cd ndoutils-2.0.0

./configure  --enable-mysql --with-ndo2db-user=nagios --with-ndo2db-group=nagios

make

l  将源目录下的相关文件考到相应位置并修改权限

cp src/{ndomod-4x.o,ndo2db-4x,log2ndo,file2sock} /usr/bin/

cp config/ndo2db.cfg-sample /usr/local/nagios/etc/ndo2db.cfg

cp config/ndomod.cfg-sample /usr/local/nagios/etc/ndomod.cfg

chown nagios.nagios /usr/local/nagios/etc/ndo*

l  生成数据库

mysql> create database nagios;

Query OK, 1 row affected (0.02 sec)

mysql> grant all on nagios.* to [email protected] IDENTIFIED BY 'nagios123';

Query OK, 0 rows affected (0.07 sec)

mysql> flush privileges;

Query OK, 0 rows affected (0.01 sec)

mysql> quit

Bye

 

l  修改ndo2db配置文件

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

db_host=127.0.0.1

db_port=3306

db_name=nagios

db_prefix=nagios_

db_user=nagios

db_pass=nagios123

l  将ndo2db启动脚本放到系统目录下

cp /usr/local/src/ndoutils-2.0.0/daemon-init /etc/init.d/ndo2db

l  编辑该启动脚本

vi /etc/init.d/ndo2db

Ndo2dbBin=/usr/bin/ndo2db-4x

l  修改启动脚本权限并启动

chmod +x /etc/init.d/ndo2db

chkconfig --add ndo2db

chkconfig ndo2db on

/etc/init.d/ndo2db start

l  修改nagios配置文件,让nagios支持ndomod这个broker

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

broker_module=/usr/bin/ndomod-4x.o config_file=/usr/local/nagios/etc/ndomod.cfg

event_broker_options=-1

l  重启nagios

/etc/ini.d/nagios restart

2.5  整合cacti和nagios

2.5.1      安装配置ndoutils插件

该插件可以将nagios监控结果保存到mysql中

wget http://nchc.dl.sourceforge.net/project/nagios/ndoutils-2.x/ndoutils-2.0.0/ndoutils-2.0.0.tar.gz

cd ndoutils-2.0.0

./configure  --enable-mysql --with-ndo2db-user=nagios --with-ndo2db-group=nagios

make

l  将源目录下的相关文件考到相应位置并修改权限

cp src/{ndomod-4x.o,ndo2db-4x,log2ndo,file2sock} /usr/bin/

cp config/ndo2db.cfg-sample /usr/local/nagios/etc/ndo2db.cfg

cp config/ndomod.cfg-sample /usr/local/nagios/etc/ndomod.cfg

chown nagios.nagios /usr/local/nagios/etc/ndo*

l  修改ndo2db配置文件

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

db_host=127.0.0.1

db_port=3306

db_name=cacti

db_prefix=npc_

db_user=cacti

db_pass=cacti100

l  将ndo2db启动脚本放到系统目录下

cp /usr/local/src/ndoutils-2.0.0/daemon-init /etc/init.d/ndo2db

l  编辑该启动脚本

vi /etc/init.d/ndo2db

Ndo2dbBin=/usr/bin/ndo2db-4x

l  修改启动脚本权限并启动

chmod +x /etc/init.d/ndo2db

chkconfig --add ndo2db

chkconfig ndo2db on

/etc/init.d/ndo2db start

l  修改nagios配置文件,让nagios支持ndomod这个broker

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

broker_module=/usr/bin/ndomod-4x.o config_file=/usr/local/nagios/etc/ndomod.cfg

event_broker_options=-1

l  重启nagios

/etc/ini.d/nagios restart

2.5.2      安装npc插件

l  下载插件

wget http://www.constructaegis.com/downloads/npc-2.0.4.tar.gz

l  安装插件

mv npc /opt/nginx/html/cacti/plugins/

chown webuser. -R /opt/nginx/html/cacti/plugins/

l  登陆cacti,安装npc插件,如图(图3)

图3

 

l  配置 npc

Console -> Settings -> npc

钩选Remote Commands

Nagios Command File Path:      /usr/local/nagios/var/rw/nagios.cmd

Nagios URL:                    http://yourserver/Nagios

如图(图4)

图4

 

l  添加执行权限

chmod +x /usr/local/nagios/var/rw/nagios.cmd

 

l  mysql修改表结构,否则npc无数据

alter table npc_eventhandlers add long_output TEXT NOT NULL default '' after output;

alter table npc_hostchecks add long_output TEXT NOT NULL default '' after output;

alter table npc_hoststatus add long_output TEXT NOT NULL default '' after output;

alter table npc_notifications add long_output TEXT NOT NULL default '' after output;

alter table npc_servicechecks add long_output TEXT NOT NULL default '' after output;

alter table npc_servicestatus add long_output TEXT NOT NULL default '' after output;

alter table npc_statehistory add long_output TEXT NOT NULL default '' after output;

alter table npc_systemcommands add long_output TEXT NOT NULL default '' after output;

2.5.3      登陆nagios

登录Nagios Web监控页http://IP/nagios/ 查看相关信息。如图(图5)

图5

 

3      监控设置

3.1  nrpe监控

3.1.1      前言

上面已经对远程Linux 主机是否存活做了监控,而判断远程机器是否存活,我们可以使用ping 工具对其监测。还有一些远程主机服务,例如ftp、ssh、http,都是对外开放的服务,即使不用Nagios,我们也可以试的出来,随便找一台机器看能不能访问这些服务就行了。但是对于像磁盘容量,cpu负载这样的“本地信息”,Nagios只能监测自己所在的主机,而对其他的机器则显得有点无能为力。毕竟没得到被控主机的适当权限是不可能得到这些信息的。为了解决这个问题,nagios有这样一个附加组件--“NRPE”,用它就可以完成对Linux 类型主机"本地信息”的监控。

3.1.2      工作原理图,如图(图6)

图6

NRPE 总共由两部分组成:

check_nrpe 插件,位于监控主机上

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

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

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

Nagios 会运行check_nrpe 这个插件,告诉它要检查什么;

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

NRPE daemon 会运行相应的Nagios 插件来执行检查;

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

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

3.1.3      安装nagiosplugins(被监控机

nagios监控linux服务器,需要让被监控的linux服务器安装nrpe+nagiosplugins

wget http://nagios-plugins.org/download/nagios-plugins-2.0.3.tar.gz

tar zxvf nagios-plugins-2.0.3.tar.gz

cd nagios-plugins-2.0.3

./configure --prefix=/usr/local/nagios

make && make install

3.1.4      安装nrpe(被监控机,监控机

l  创建nagios用户

useradd nagios

设置禁止nagios用户登陆

nagios:x:500:500::/home/nagios:/sbin/nologin

l  下载nrpe

wget http://nchc.dl.sourceforge.net/project/nagios/nrpe-2.x/nrpe-2.15/nrpe-2.15.tar.gz

tar zxvf nrpe-2.15.tar.gz

cd nrpe-2.15

./configure

make all

安装check_nrpe 这个插件

make install-plugin (监控机

监控机需要安装check_nrpe 这个插件,被监控机并不需要,我们在这里安装它只是为了测试目的。

 

安装deamon

make install-daemon (被监控机

 

安装配置文件

make install-daemon-config (被监控机

 

3.1.5      安装xinted(被监控机

yum install xinetd

l  安装xinted 脚本

make install-xinetd(接上面安装nrpe)

可以看到创建了这个文件

l  编辑这个脚本:

在only_from 后增加监控主机的IP地址。(如图,图7)

vi /etc/xinetd.d/nrpe

图7

l  编辑/etc/services文件,增加NRPE服务

vi /etc/services (如图,图8)

图8

l  启动xinted 服务

/etc/init.d/xinetd start

查看NRPE 是否已经启动(如图,图9)

图9

l  测试NRPE是否则正常工作

使用上面在被监控机上安装的check_nrpe 这个插件测试NRPE 是否工作正常。

/usr/local/nagios/libexec/check_nrpe -H 10.0.0.101

会返回当前NRPE的版本,也就是在本地用check_nrpe连接nrpe daemon是正常的。(如图,图10)

 

图10

3.1.6      check_nrpe(被监控机)

check_nrpe –H 被监控的主机 -c 要执行的监控命令

注意:-c 后面接的监控命令必须是nrpe.cfg 文件中定义的。也就是NRPE daemon只运行nrpe.cfg中所定义的命令。

l  nrpe配置文件

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

log_facility=daemon
pid_file=/var/run/nrpe.pid
server_port=5666
nrpe_user=nagios
nrpe_group=nagios
allowed_hosts=127.0.0.1
 
dont_blame_nrpe=0
debug=0
command_timeout=60
connection_timeout=300
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_sda1]=/usr/local/nagios/libexec/check_disk -w 20% -c 10% -p /dev/sda1
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

红色部分是命令名,也就是check_nrpe 的-c 参数可以接的内容,等号 “=” 后面是实际执行的插件程序(这与commands.cfg 中定义命令的形式十分相似,只不过是写在了一行)。也就是说check_users 就是等号后面/usr/local/nagios/libexec/check_users -w 5 -c 10 的简称。

我们可以很容易知道上面这5行定义的命令分别是检测登陆用户数,cpu负载,sda1的容量,僵尸进程,总进程数。各条命令具体的含义见插件用法(执行“插件程序名 –h”)。

 

l  命令测试

被监控机测试:

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

OK - load average: 1.17, 1.16, 1.11|load1=1.170;15.000;30.000;0; load5=1.160;10.000;25.000;0; load15=1.110;5.000;20.000;0;

/usr/local/nagios/libexec/check_disk -w 20% -c 10% -p /dev/sda2

DISK OK - free space: /oracle 25443 MB (53% inode=97%);| /oracle=22392MB;40316;45356;0;50396

监控机测试:

./check_nrpe -H 10.0.0.101 -c check_load

OK - load average: 1.11, 1.10, 1.09|load1=1.110;15.000;30.000;0; load5=1.100;10.000;25.000;0; load15=1.090;5.000;20.000;0;

./check_nrpe -H 10.0.0.101 -c check_sda2

DISK OK - free space: /oracle 25443 MB (53% inode=97%);| /oracle=22392MB;40316;45356;0;50396

 

3.1.7      check_nrpe(监控机)

l  在commands.cfg中增加对check_nrpe的定义

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

增加如下内容:

define command{

        command_name    check_nrpe

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

        }

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

l  定义主机的监控

下面就可以在services.cfg 中定义主机的监控了。

define service{

        use                     generic-service

        host_name               CPP-Linux

        service_description     Current Load

        check_command           check_nrpe!check_load

        }

 

 

define service{

        use                     generic-service

        host_name               CPP-Linux

        service_description     Check Disk sda2

        check_command           check_nrpe!check_sda2

        }

 

 

define service{

        use                     generic-service

        host_name               CPP-Linux

        service_description     Check Disk sdb1

        check_command           check_nrpe!check_sdb1

        }

l  所有的配置文件已经修改好了,现在重启Nagios。

/etc/init.d/nagios restart

3.1.8      附录CPU load average解析

l  什么是load average

linux系统中的Load对当前CPU工作量的度量 (WikiPedia: the system load is a measure of the amount of work that a computer system is doing)。也有简单的说是进程队列的长度。

       Load Average 就是一段时间 (1 分钟、5分钟、15分钟) 内平均 Load 。

我们可以通过系统命令"w"查看当前load average情况

 [root@CNC-BJ-5-3N1 ~]# w

20:01:55 up 76 days, 8:20, 6 users, load average: 1.30, 1.48, 1.69

 

上面内容显示系统负载为“1.30, 1.48, 1.69”,这3个值是什么意思呢?

第一位1.30:表示最近1分钟平均负载

第二位1.48:表示最近5分钟平均负载

第三位1.69:表示最近15分钟平均负载

PS. linux系统是5秒钟进行一次Load采样

l  load average值的含义

单核处理器

假设我们的系统是单CPU单内核的,把它比喻成是一条单向马路,把CPU任务比作汽车。当车不多的时候,load <1;当车占满整个马路的时候 load=1;当马路都站满了,而且马路外还堆满了汽车的时候,load>1。如图:

多核处理器

我们经常会发现服务器Load > 1但是运行仍然不错,那是因为服务器是多核处理器(Multi-core)。

假设我们服务器CPU是2核,那么将意味我们拥有2条马路,我们的Load = 2时,所有马路都跑满车辆。如图:

#查看CPU core

grep 'model name' /proc/cpuinfo | wc -l

l  什么样的Load average值要提高警惕

0.7 < load < 1: 此时是不错的状态,如果进来更多的汽车,你的马路仍然可以应付。

load = 1: 你的马路即将拥堵,而且没有更多的资源额外的任务,赶紧看看发生了什么吧。

load > 5: 非常严重拥堵,我们的马路非常繁忙,每辆车都无法很快的运行。

l  三种Load值,应该看哪个

通常我们先看15分钟load,如果load很高,再看1分钟和5分钟负载,查看是否有下降趋势。

1分钟负载值 > 1,那么我们不用担心,但是如果15分钟负载都超过1,我们要赶紧看看发生了什么事情。所以我们要根据实际情况查看这三个值。

3.2  自定义snmp监控

3.2.1      前言

Nagios插件可以用任何一门编程语言来编写,只要该编程语言在运行Nagios的平台上得到支持。Bash是用来编写Nagios插件的一门流行语言,因为它功能强大、使用简单。

  借助插件进行的每一次有效的Nagios检查(Nagios check)都会生成一个数字表示的退出状态。可能的状态有:

  ● 0--各方面都正常,检查成功完成。

  ● 1--资源处于警告状态。某个地方不太妙。

  ● 2--资源处于临界状态。原因可能是主机宕机或服务未运行。

● 3--未知状态,这未必表明就有问题,而是表明检查没有给出一个清楚明确的状态。

(状态由/usr/local/nagios/libexec/utils.sh脚本定义)

插件还能输出文本消息。默认情况下,该消息显示在Nagios web界面和Nagios邮件警报信息中。尽管消息并不是硬性要求,你通常还是可以在可用插件中找到它们,因为消息告诉用户出了什么岔子,而不会迫使用户查阅说明文档。

3.2.2      工作原理图,如图(图11)

图11

原理图解释:

1. 首先在被监控机上编写自定义监控的脚本,并给出监控信息。

2. 将监控信息赋予OID号给予snmp程序

3. snmp程序将OID号通过snmp端口协议发送给监控机。

4. 监控机通过check_snmp_extend.sh脚本拿取OID号里的内容判断监控结果。

5. nagios程序将定时拿取check_snmp_extend.sh脚本给出的监控结果并判断是否报警。

3.2.3      自定义监控脚本(被监控机

比如这里编写一个判断CPP主程序是否存在的脚本,内容如下:

#!/bin/bash
AVNO=`ps -ef | grep avnostop | grep -v grep | awk -F" " '{ print $2 }'`
if [ ! -z $AVNO ];
then
        echo "OK"
else
        echo "CRITICAL"
fi

程序存在将显示OK,不存在显示CRITICAL(这里显示内容其他自定义脚本也必须一样,这样监控机脚本方便进行判断)

3.2.4      snmp设置(被监控机

l  修改snmpd.conf配置文件

vi /etc/snmp/snmpd.conf

在最后一行加入

extend .1.3.6.1.4.1.2023.1 cpp /usr/local/bin/cpp.sh

关于oid号选择详见cacti运维手册

 

l  重启snmpd服务

/etc/init.d/snmpd restart

 

3.2.5      使用nagios的check_snmp(监控机)

注意:如果使用check_snmp,3.2.6和3.2.7就不必操作

l  使用nagios自带的check_snmp命令来判断

/usr/local/nagios/libexec/check_snmp -H 115.29.224.191 -C logic2015 -o .1.3.6.1.4.1.2023.1.4.1.2.11.99.104.101.99.107.95.109.121.115.113.108.1 -r OK

l  修改nagios配置

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

修改如下配置:

define command{

        command_name    check_snmp

        command_line    $USER1$/check_snmp -H $HOSTADDRESS$ -C logic -o $ARG1$ -r OK –l $ARG2$

        }

l  在services.cfg中增加监控

define service{

        use                     generic-service

        host_name               aliyun-linux-115.29.224.191

        service_description     Check Mysql Program

        check_command           check_snmp!.1.3.6.1.4.1.2023.1.4.1.2.11.99.104.101.99.107.95.109.121.115.113.108.1!"Check Mysql Program"

        }

3.2.6      安装check_snmp_extend.sh(监控机

l  下载check_snmp_extend.sh

wget http://www.logix.cz/michal/devel/nagios/check_snmp_extend.sh

l  修改check_snmp_extend.sh

由于check_snmp_extend.sh本身脚本有些问题,要进行修改,修改后内容如下:

#!/bin/sh
 
. /usr/local/nagios/libexec/utils.sh || exit 3
 
SNMPGET=$(which snmpwalk)
 
test -x ${SNMPGET} || exit $STATE_UNKNOWN
 
HOST=$1
NAME=$2
 
test "${HOST}" -a "${NAME}" || exit $STATE_UNKNOWN
 
STATUS=$(snmpwalk -v 2c -c 12345 ${HOST} ${NAME} | awk -F" " '{ print $4 }' | sed 's/"//g' 2>&1)
 
case "$STATUS" in
        OK|WARNING|CRITICAL|UNKNOWN)
                RET=$(eval "echo \$STATE_$STATUS")
                RESULT="$STATUS - SNMP returned unparsable status: $STATUS"
                echo $RESULT           #nagios显示信息
                ;;
        *)
                RET=$STATE_UNKNOWN
                RESULT="UNKNOWN - SNMP returned unparsable status: $STATUS"
                echo $RESULT           #nagios显示信息
                ;;
esac
 
 
exit $RET                     #返回结果

 

3.2.7      nagios配置(监控机)

l  在commands.cfg中增加对check_snmp_extend.sh的定义

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

增加如下内容:

define command{

        command_name check_snmp_extend

        command_line $USER1$/check_snmp_extend.sh $HOSTADDRESS$ $ARG1$

        }

 

l  在services.cfg中增加监控

vi /usr/local/nagios/etc/objects/ service.cfg

增加如下内容:

define service{

        use                     generic-service

        host_name               CPP-Linux

        service_description       Check For CPP

        check_command           check_snmp_extend!.1.3.6.1.4.1.2023.1.4.1.2.3.99.112.112.1

        }

注意:check_snmp_extend!后面写的就是OID号

 

l  重启nagios

/etc/init.d/nagios restart

 

4      报警设置

4.1  邮件报警

4.1.1      前言

由于公司监控服务器处于内网环境,所以无法直接发送邮件到外网邮箱。公司有台外网邮件服务器,现在是通过发邮件到这台外网邮件服务器再转发到运维人员邮箱。

4.1.2      转发流程图

下面是转发流程图(图12)

图12

1. nagios监控服务器需要报警将邮件发送到邮件服务器

2. 邮件服务器根据配置转发到运维人员的邮箱。

4.1.3      nagios配置

l  contacts.cfg配置

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

define contact{

        name                            generic-contact

        service_notification_period     24x7

        host_notification_period        24x7

        service_notification_options    w,u,c,r

        host_notification_options       d,u,r

        service_notification_commands   notify-service-by-email,notify-service-by-sms

        host_notification_commands      notify-host-by-email,host-notify-by-sms

        }

 

define contact{

        contact_name                    admin

        use                             generic-contact

        alias                           Nagios Admin

        email                           [email protected]

        pager                           139111111

        }

 

define contactgroup{

        contactgroup_name       admin

        alias                   Technical Support

        members                 admin

        }

注:因为是邮件转发,只需设置一个用户即可。其他用户在转发设置中配置。

 

4.1.4      转发设置

l  登陆邮件服务器,新建邮箱账号

useradd nagios

l  设置转发

vi /home/nagios/.forward

写入转发的邮箱即可

[email protected]