• 使用 Nagios 搭建监控服务器

    使用 Nagios 搭建监控服务器

    关于Nagios

    Nagios是一款用于监控系统和网络的开源应用软件,它的模式是服务器客户端,也就是说首先要在在一台服务器上(server)部署相应的主要套件,然后在要监控的服务器上部署客户端程序,这样server会和client通信,从而监控client端的各项资源。Nagios功能十分强大几乎所有的项目都可以监控,大到服务器的存活状态,小到服务器上的某一个服务(web)。这些功能都是通过自定义插件(或者叫做脚本)来实现。

    Nagios监控到某项资源发生异常会通知到用户,你可以接入手机短信接口也可以接入邮件接口。我们可以通过web页面来查看Nagios所监控的各项资源,默认搭建的Nagios服务器只能监控简单的几个项目,而其他服务之类的监控项目都是由我们自己开发的插件来实现的。

    需要下载的软件

    nagios-3.0.5

    nagios-plugins-1.4.13

    nrpe-2.12.tar.gz

    apache-2.2.11

    // 以上软件版本可以不一样

    监控中心Server端的配置

    1. 安装apache (略,请参考第16章中相关内容,只需安装,到后边再配置)

    2. 建立nagios账户

    useradd nagios

    3. 下载软件

    cd /usr/local/src/

    wget http://syslab.comsenz.com/downloads/linux/nagios-3.0.5.tar.gz

    wget http://syslab.comsenz.com/downloads/linux/nagios-plugins-1.4.13.tar.gz

    wget http://syslab.comsenz.com/downloads/linux/nrpe-2.12.tar.gz

    4. 编译安装nagios

    cd /usr/local/src/

    tar zxvf nagios-3.0.5.tar.gz

    cd nagios-3.0.5

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

    make all

    make install

    make install-init # nagios做成一个运行脚本,使nagios随系统开机启动

    make install-config # 把配置文件样例复制到nagios的安装目录

    make install-commandmode # 给外部命令访问nagios配置文件的权限

    chown -R nagios:nagios /usr/local/nagios

    5. 编译安装nagios-plugins

    cd /usr/local/src/

    tar zxvf nagios-plugins-1.4.13.tar.gz

    cd nagios-plugins-1.4.13

    ./configure —prefix=/usr/local/nagios —with-nagios-user=nagios —with-nagios-group=nagios

    make && make install

    查看是否安装成功的方法是:

    ls /usr/local/nagios/libexec/

    看这个目录下是否有插件文件

    6. 安装nrpe

    cd /usr/local/src/

    tar zxvf nrpe-2.12.tar.gz

    cd nrpe-2.12

    ./configure —enable-ssl —enable-command-args

    make all

    make install-plugin

    make install-daemon

    make install-daemon-config

    7. 配置web接口

    vim /usr/local/apache2/conf/httpd.conf

    在最后加入以下内容:

    ScriptAlias /nagios/cgi-bin /usr/local/nagios/sbin

    <Directory “/usr/local/nagios/sbin/“>

    AllowOverride AuthConfig

    Options ExecCGI

    Order allow,deny

    Allow from all

    </Directory>

    Alias /nagios/ /usr/local/nagios/share/

    <Directory “/usr/local/nagios/share”>

    Options None

    AllowOverride AuthConfig

    Order allow,deny

    Allow from all

    </Directory>

    8. 配置nagios

    cd /usr/local/nagios/etc/

    vim cgi.cfg

    useauthentication=1 改成 use_authentication=0 意思是不用用户验证

    9. 启动nagios

    在启动前先检测一下:

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

    如果最后显示如下,则说明配置没有问题了。

    Total Warnings: 0

    Total Errors: 0

    启动命令:

    /etc/init.d/nagios start

    或者:

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

    此时,就可以访问web页面的nagios了,在浏览器中输入:

    http://IP/nagios/ 看看吧。

    在要监控的机器上client部署nagios

    如果你打开了web页面,点击左栏的Host Detail 会在右栏看到一行数据,其中Host 名为 “localhost” Status显示为”up”,并且显示为绿色,如果是其他颜色就说明你的localhost出了问题。目前只有一行数据,也就是说只监控了监控中心(localhost)一台主机,那么如何添加其他机器被它监控呢?这就需要在要被监控的机器上也部署nagios软件。

    1. 添加账户

    useradd nagios

    2. 安装nrpe

    cd /usr/local/src/

    wget http://syslab.comsenz.com/downloads/linux/nrpe-2.12.tar.gz

    tar zxvf nrpe-2.12.tar.gz

    cd nrpe-2.12

    ./configure —enable-ssl —enable-command-args

    make all

    make install-plugin

    make install-daemon

    make install-daemon-config

    3. 安装nagios-plugin

    cd /usr/local/src/

    wget http://syslab.comsenz.com/downloads/linux/nagios-plugins-1.4.13.tar.gz

    tar zxvf nagios-plugins-1.4.13.tar.gz

    cd nagios-plugins-1.4.13

    ./configure —prefix=/usr/local/nagios —with-nagios-user=nagios —with-nagios-group=nagios

    make && make install

    到此就算安装完成了,请查看/usr/local/nagios/目录下是否有四个目录分别为:bin etc libexec share 另外在libexec目录下会有很多check开头的文件。如果你的机器上没有,就请重新安装吧。

    4. 配置

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

    找到”allowed_hosts=127.0.0.1” 改成 “allowed_hosts=127.0.0.1,10.0.4.67”

    // 后边的IPserverIP

    找到dont_blame_nrpe=0” 改成 “dont_blame_nrpe=1”

    5. 启动nrpe

    /usr/local/nagios/bin/nrpe -c /usr/local/nagios/etc/nrpe.cfg -d

    在监控中心添加被监控主机

    添加主机当然是要到server端(监控中心)修改配置文件了。

    1. 修改主配置文件

    cd /usr/local/nagios/etc/

    vim nagios.cfg

    增加内容:

    cfg_dir=/usr/local/nagios/etc/services ##定义一个目录,以后把新增加的主机信息文件全部放到这里

    2. 添加被监控主机信息

    mkdir /usr/local/nagios/etc/services

    cd /usr/local/nagios/etc/services

    vim 10.0.4.56.cfg 加入如下内容:

    define host{

    use linux-server

    host_name 10.0.4.56

    alias 10.0.4.56

    address 10.0.4.56

    }

    define service{

    use generic-service

    host_name 10.0.4.56

    service_description check_ping

    check_command check_ping!100.0,20%!200.0,50%

    max_check_attempts 5

    normal_check_interval 1

    }

    define service{

    use generic-service

    host_name 10.0.4.56

    service_description check_ssh

    check_command check_ssh

    max_check_attempts 5

    normal_check_interval 1

    }

    define service{

    use generic-service

    host_name 10.0.4.56

    service_description check_http

    check_command check_http

    max_check_attempts 5

    normal_check_interval 1

    }

    // 注意,这里的IPclient端的IP,监控的项目有三个ping, ssh, http。其实这三个项目使用的脚本都为本地脚本,也就是说,即使远程主机没有安装nagiosnrpe同样可以监控这些项目。但是如果想监控loaddisk,等等就需要通过nrpe服务来搞定了,道理很简单,loaddisk都需要登录到远程主机上去获得信息,而pingsshhttp都不需要的。这个到远程主机获取相关的信息的过程是由nrpe完成的。如果你的client上没有启动nrpe服务那么我们是无法获取远程主机的loaddisk等信息的。下面笔者配置一下使用nrpe来监控远程主机的相关项目。

    server端编辑/usr/local/nagios/etc/objects/commands.cfg

    vim /usr/local/nagios/etc/objects/commands.cfg # 在最后面添加如下内容

    define command{

    command_name check_nrpe

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

    }

    然后编辑10.0.4.56.cfg (还是server上)

    cd /usr/local/nagios/etc/services

    vim 10.0.4.56.cfg # 加入如下内容:

    define service{

    use generic-service

    host_name 10.0.4.56

    service_description check_load

    check_command check_nrpe!check_load

    max_check_attempts 5

    normal_check_interval 1

    }

    define service{

    use generic-service

    host_name 10.0.4.56

    service_description check_disk_hda1

    check_command check_nrpe!check_hda1

    max_check_attempts 5

    normal_check_interval 1

    }

    define service{

    use generic-service

    host_name 10.0.4.56

    service_description check_disk_hda2

    check_command check_nrpe!check_hda2

    max_check_attempts 5

    normal_check_interval 1

    }

    // 这里需要解释一下相关的”check_command”, 先看这个” check_nrpe!check_load” 这里的check_nrpe就是上面/usr/local/nagios/etc/objects/commands.cfg中刚刚定义的,后面的check_load是在远程主机上定义的一个命令脚本。具体在哪里定义稍后介绍。为什么中间加一个”!”,这个是nagios特有的形式,无需关心。下面需要到远程主机上去定义上面用到的脚本了。

    在远程主机上编辑/usr/local/nagios/etc/nrpe.cfg 文件

    vim /usr/local/nagios/etc/nrpe.cfg (client)

    command[check_hda1]”那行改成:

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

    然后再增加一行:

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

    // 这里的check_hda1 check_hda2 都是自定义的,和server端的定义的service中的check_command对应。也就是说,如果在server端定义了一个service(通过nrpe方式)那么必须要在客户端上的nrpe.cfg中定义相应的脚本。保存这个文件后,需要重新启动一下nrpe服务。

    killall nrpe ; /usr/local/nagios/bin/nrpe -c /usr/local/nagios/etc/nrpe.cfg -d client上)

    3. 重启nagios服务

    修改了配置需要重启服务才能使添加的监控主机生效。

    /etc/init.d/nagios restart server上)

    此时再到web页面去观察是否多了一台10.0.4.56

    nagios客户端上自定义监控脚本

    在开始,笔者就讲过,我们可以自定义写监控脚步,从上面的例子中也可以看到监控磁盘状态时,是根据磁盘分区来监控的。这样不免有些麻烦,因为每台主机的磁盘分区状况都不一样(一样还好),而且有多少个分区就需要定义多少个命令。所以笔者就自定义写一个shell脚本来监控所有的磁盘分区:

    1. 在客户端上创建脚本/usr/local/nagios/libexec/check_disk.sh

    vim /usr/local/nagios/libexec/check_disk.sh 写入如下内容:(client)

    #!/bin/bash

    row=df -h -P|wc -l

    status=0

    for i in seq 2 $row

    do

    spare=df -h -P|sed -n "$i"p|awk ''

    use_percentage=df -h -P|sed -n "$i"p|sed -n "s/\%//"p|awk ''

    spare_percentage=expr 100 - $use_percentage

    partition_name=df -h -P|sed -n "$i"p|awk ''

    if [ “$spare_percentage” -lt “3” ];then

    echo -n “$partition_name CRITICAL $% $spare

    status[$i]=2

    elif [ “$spare_percentage” -lt “5” ];then

    echo -n “$partition_name WARNING! $% $spare

    status[$i]=1

    else

    echo -n “$partition_name OK $% $spare

    status[$i]=0

    fi

    done

    zhuangtai=0

    for j in seq 2 $row

    do

    if [ “$” -gt “$zhuangtai” ];then

    zhuangtai=$

    fi

    done

    exit $zhuangtai

    2. 保存后,修改该脚本的权限

    chmod +x /usr/local/nagios/libexec/check_disk.sh client上)

    3. 然后编辑/usr/local/nagios/etc/nrpe.cfg文件

    vim /usr/local/nagios/etc/nrpe.cfg # 加入一行:(client上)

    command[check_disk]=/usr/local/nagios/libexec/check_disk.sh

    保存,重启nrpe服务

    killall nrpe ; /usr/local/nagios/bin/nrpe -c /usr/local/nagios/etc/nrpe.cfg -d client上)

    4. 检测刚才的脚本是否正常运行的方法是,到server端执行如下命令:

    /usr/local/nagios/libexec/check_nrpe -H 10.0.4.56 -c check_diskserver上)

    如果正常的话,会输出一行磁盘检测的数据,否则可能会报错。

    5. server上添加相应的service

    cd /usr/local/nagios/etc/services server上)

    vim 10.0.4.56.cfg # 加入如下内容:

    define service{

    use generic-service

    host_name 10.0.4.56

    service_description check_disk

    check_command check_nrpe!check_disk

    max_check_attempts 5

    normal_check_interval 1

    }

    6. 重启nagios服务

    /etc/init.d/nagios restart server上)

    配置nagios报警邮件

    现在139邮箱有顺便发短信的功能,所以当有报警时,只需发送到你的139邮箱你就同样会收到一条报警短信。这样做的优势就是不用再去买短信网关了,节省了很大一笔钱。

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

    email nagios@localhost” 修改成 “email 你的139邮箱

    vim /usr/local/nagios/etc/objects/templates.cfg

    找到:

    define service{

    name generic-service

    之所以看这一段,是因为在上面添加的10.0.4.56.cfg 定义了很多generic-service所以要关注这段的配置。

    define service{

    name generic-service

    active_checks_enabled 1

    passive_checks_enabled 1

    parallelize_check 1

    obsess_over_service 1

    check_freshness 0

    notifications_enabled 1

    event_handler_enabled 1

    flap_detection_enabled 1

    failure_prediction_enabled 1

    process_perf_data 1

    retain_status_information 1

    retain_nonstatus_information 1

    is_volatile 0

    check_period 24x7

    max_check_attempts 3

    normal_check_interval 10

    retry_check_interval 2

    ontact_groups admins

    notification_options w,u,c,r

    notification_interval 60

    notification_period 24x7

    register 0

    }

    其中有几个参数需要你注意:

    notifications_enabled : 是否开启提醒功能。1为开启,0为禁用。一般,这个选项会在主配置文件(nagios.cfg)中定义,效果相同。

    notification_interval: 重复发送提醒信息的最短间隔时间。默认间隔时间是60分钟。如果这个值设置为0,将不会发送重复提醒。

    notification_period: 发送提醒的时间段。非常重要的主机(服务)我定义为7×24,一般的主机(服务)就定义为上班时间。如果不在定义的时间段内,无论什么问题发生,都不会发送提醒。

    notification_options: 这个参数定义了发送提醒包括的情况:d = 状态为DOWN, u = 状态为UNREACHABLE , r = 状态恢复为OK , f = flapping。,n=不发送提醒。

    要想正确发送邮件,上面的参数得配置合理才行。