• nagios安装


    目录

    一.Nagios报警简介... 3

    二.nagios-master安装... 3

    1.用户,目录权限设置... 3

    2.安装 nagios-3.0.5.tar.gz. 3

    3.Nagios-plugins-1.4.13.tar.gz. 4

    4. 修改apache配置... 4

    5.主配置文件nagios.cfg. 6

    6.权限控制文件cgi.cfg的配置... 7

    7.主机定义文件hosts.cfg. 8

    8.主机组定义文件hostgroups.cfg. 9

    9.监控时间段定义文件timeperiods.cfg. 9

    11.联系人配置文件contacts.cfg. 10

    12.联系组配置文件contactgroups.cfg. 10

    13.服务定义文件services.cfg. 11

    14.检测配置,启动web监控... 11

    15.一些Nagios插件介绍... 13

    二、 监控远程主机... 15

    1.首先需要添加nagios用户... 16

    2. xinetd服务安装... 16

    3.安装nagios-plugins. 16

    4.安装nrpe. 17

    5.nrpe被监控端配置... 18

    6.nagios-master主监控机nrpe设置... 19

    三.nagios插件扩展... 19

    1.自定义插件check_log_error(shell). 20

    2.自定义插件check_hdfs_folder_age(shell). 22

    3.自定义插件check_crawler_spider(shell). 23

    4.自定义插件check_server_app(python). 24

    四.与ganglia集成... 26

    1. check_ganglia.py插件扩展... 26

    2.nagios-master的service配置... 27

    一.Nagios报警简介

    nagios的功能是监控服务和主机,但是他自身并不包括这部分功能的代码,所有的监控、检测功能都是有插件来完成的。

    再说报警功能,如果监控系统发现问题不能报警那就没有意义了,所以报警也是nagios很重要的功能之一。但是,同样的,nagios自身也没有报警部分的代码,甚至没有插件,而是交给用户或者其他相关开源项目组去完成。

    nagios安装,是指基本平台,也就是nagios软件包的安装。它是监控体系的框架,也是所有监控的基础。

    打开nagios官方的文档,会发现nagios基本上没有什么依赖包,只要求系统是linux或者其他nagios支持的系统。不过如果你没有安装apache(httpd服务),那么你就没有那么直观的界面来查看监控信息了,所以apache姑且算是一个前提条件。关于apache的安装,网上有很多,照着安装就是了。安装之后要检查一下是否可以正常工作。

     

    nagios定义了4种监控状态,代表不同的严重级别,除了OK代表正常不用关心外,其余3种都要引起重视.如下表:

    状态

    代码

    颜色

    正常

    OK

    绿色,

    警告

    WARNING

    黄色,

    严重

    CRITICAL

    红色,

    未知错误

    UNKOWN

    深黄色

     

    二.nagios-master安装

    1.用户,目录权限设置

    先增加用户 useradd nagios

    mkdir /usr/local/nagios

    chown -R nagios /usr/local/nagios

     chgrp -R nagios /usr/local/nagios

    2.安装 nagios-3.0.5.tar.gz

    cd  /usr/local/src

    wget  http://nchc.dl.sourceforge.net/project/nagios/nagios-3.x/nagios-3.0.5/nagios-3.0.5.tar.gz

    tar –zxvf  nagios-3.0.5.tar.gz

    cd  usr/local/src/nagios-3.0.5

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

    make all

    make install

    make install-init

    make install-commandmode

    make install-config

    make install-webconf

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

    bin

    Nagios执行程序所在目录,nagios文件即为主程序

    etc

    Nagios配置文件位置,初始安装完后,只有几个*.cfg-sample文件

    sbin

    Nagios   Cgi文件所在目录,也就是执行外部命令所需文件所在的目录

    Share

    Nagios网页文件所在的目录

    Var

    Nagios日志文件、spid 等文件所在的目录

    3.Nagios-plugins-1.4.13.tar.gz

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

    tar -zxvf nagios-plugins-1.4.13.tar.gz

    cd  /usr/local/src/nagios-plugins-1.4.13

    编译,指定路径为之前nagios的安装路径

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

    make

    安装

    make install

    ls /usr/local/nagios/libexec/

    会显示安装的插件文件,即所有的插件都安装在libexec这个目录下

    4. 修改apache配置

    修改apache的配置文件,增加nagios的目录,并且访问此目录需要进行身份验证

    vi /usr/local/apache2/conf/httpd.conf,在最后增加如下内容

    #setting for nagios 20070707

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

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

        Options ExecCGI

        AllowOverride None

        Order allow,deny

        Allow from all

        AuthName "Nagios Access"

        AuthType Basic

    AuthUserFile /usr/local/nagios/etc/htpasswd

    //用于此目录访问身份验证的文件

        Require valid-user

    </Directory>

     

    Alias /nagios /usr/local/nagios/share

    <Directory   "/usr/local/nagios/share">

        Options None

        AllowOverride None

        Order allow,deny

        Allow from all

        AuthName "Nagios Access"

        AuthType Basic

    AuthUserFile /usr/local/nagios/etc/htpasswd

    //用于此目录访问身份验证的文件

        Require valid-user

    </Directory>

    增加验证用户

    也就是通过web访问nagios的时候,必须要用这个用户登陆.在这里我们增加用户guest:密码为guest

    /usr/local/apache2/bin/htpasswd -c /usr/local/nagios/etc/htpasswd guest

    New password: (输入guest)

    Re-type new password: (再输入一次密码)

    Adding password for user guest

     到这里nagios的安装也就基本完成了,你可以通过web来访问了.

    [url]http://192.169.32.73/nagios[/url] 会弹出对话框要求输入用户名密码

                             

    输入guest,密码guest,就可以进入nagios的主页面了

    查看认证文件的内容

    less /usr/local/nagios/etc/htpasswd

    guest:yrxWWTzuHrX5A  前半部分是用户名guest,后面是加密后的密码

    ---有时候登陆不进去检查/usr/local/nagios/etc/htpasswd.users

    cp /usr/local/nagios/etc/htpasswd.user  /usr/local/nagios/etc/htpasswd.users

    5.主配置文件nagios.cfg

         Nagios自己定义了一套规则用于配置文件,其中最重要的概念就是”对象”----object.通俗的理解:假定我们首先定义了”性别”这个对象,它的值只可能是男,女,人妖等等,然后定义某人为一个对象,例如张三,定义张三的时候有”性别”这个属性,它的值就必须来源了之前定义的性别这个对象,要么是男,要么是女

    在Nagios里面定义了一些基本的对象,一般用到的有:

    联系人

    contact

    出了问题像谁报告?一般当然是系统管理员了

    监控时间段

    timeperiod

    7X24小时不间断还是周一至周五,或是自定义的其他时间段

    被监控主机

    host

    所需要监控的服务器,当然可以是监控机自己

    监控命令

    command

    nagios发出的哪个指令来执行某个监控,这也是自己定义的

    被监控的服务

    service

    例如主机是否存活,80端口是否开,磁盘使用情况或者自定义的服务等

         另外,多个被监控主机可以定义为一个主机组,多个联系人可以被定义为一 个联系人组,多个服务还能定义成一个服务组

    回到上面的例子,定义张三需要之前定义的性别,我们定义一个被监控的服务,当然就要指定被监控的主机,需要监控的时间段,要用哪个命令来完成这个监控操作,出了问题向哪个联系人报告

    所有这些对象绝对多数都是需要我们手动定义的,这就是nagios的安装显得复杂的地方.下面我们来配置nagios主配置文件。

    修改nagios的主配置文件nagios.cfg

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

    注释行 #cfg_file=/usr/local/nagios/etc/localhost.cfg[2],然后把下面几行的注释去掉:

    cfg_file=/usr/local/nagios/etc/contactgroups.cfg  //联系组配置文件路径

    cfg_file=/usr/local/nagios/etc/contacts.cfg       //联系人配置文件路径

    cfg_file=/usr/local/nagios/etc/hostgroups.cfg     //主机组配置文件路径

    cfg_file=/usr/local/nagios/etc/hosts.cfg          //主机配置文件路径

    cfg_file=/usr/local/nagios/etc/services.cfg       //服务配置文件路径

    cfg_file=/usr/local/nagios/etc/servicegroups.cfg       //服务组配置文件路径

    cfg_file=/usr/local/nagios/etc/timeperiods.cfg    //监视时段配置文件路径

    cfg_file=/usr/local/nagios/etc/commands.cfg    //命令配置

    cfg_file=/usr/local/nagios/etc/templates.cfg      //模板定义

    6.权限控制文件cgi.cfg的配置

    [root@nagios etc]# vim cgi.cfg

       
    Cgi.cfg的作用是控制相关cgi脚本,先确保use_authentication=1,

     

       
    default_user_name=***这句可以不用定义,默认是注释掉的,看命令解释说地定义有风险。

     

    authorized_for_system_information=nagiosadmin,guest

    authorized_for_configuration_information=nagiosadmin, guest

    authorized_for_system_commands=nagiosadmin, guest //多个用户之间用逗号隔开

    authorized_for_all_services=nagiosadmin, guest

    authorized_for_all_hosts=nagiosadmin, guest

    authorized_for_all_service_commands=nagiosadmin, guest

    authorized_for_all_host_commands=nagiosadmin, guest

     

    上述的用户名就是之前使用htpasswd -c /usr/local/nagios/etc/htpasswd.users guest生成的guest用户。在此就不做过多说明了。不过这个要注意,请不要随便添加不存在的验证用户,并且为了安全起见,不要添加过多的验证用户。

    7.主机定义文件hosts.cfg

    cd  /usr/local/nagios/etc/

    vim hosts.cfg    此处没有hosts.cfg文件,直接vim编辑创建即可

    define host{

            host_name                       192.169.32.67

    //被监控主机的名称,最好别带空格 用tab键来分隔

            alias                           mechine67

            //别名

            address                         192.169.32.67

            //被监控主机的IP地址

            check_command                   check-host-alive

            //监控的命令check-host-alive,这个命令来自commands.cfg,用来监控主机是否存活

            max_check_attempts              5

            //检查失败后重试的次数

            check_period                    24x7

            //检查的时间段24x7,见下面timeperiods.cfg中定义

            contacts                  xubl

            //联系人

    notification_interval           1000

            //提醒的间隔,每隔1000秒提醒一次

    notification_period             24x7

            //提醒的周期, 24x7,见下面timeperiods.cfg中定义

    notification_options            d,u,r

    //指定什么情况下提醒,具体含义见下面contacts.cfg部分的介绍

            }

    8.主机组定义文件hostgroups.cfg

    cat   /usr/local/nagios/etc/hostgroups.cfg

    此处添加之前已定义好的主机名就行了,不同主机名之间用逗号隔开。

    9.监控时间段定义文件timeperiods.cfg

    cat  /usr/local/nagios/etc/timeperiods.cfg

    其他时间段一般不需要。

    11.联系人配置文件contacts.cfg

    cat   /usr/local/nagios/etc/contacts.cfg

    此处定义的就是出了问题应该通知谁,通常就是系统管理员,上图定义的就是当监控服务出现w(warn) , u(unknow)、c(critical)、r(从异常状态下恢复)或者主机出现d(down机)、u(unreachable)、r(从异常状态下恢复)的时候就会以notify-service-by-email和notify-host-by-email命令定义的方式(此命令是在commands.cfg中定义的)向系统管理员发送报警通知。注意,contacts.cfg最下面也有关于contactgroup的模版,这里我们另外创建一个contactgroup.cfg联系组的文件,就不在联系人文件中定义联系组了,contacts.cfg中关于contactgroup的配置直接删除即可。

    12.联系组配置文件contactgroups.cfg

    cat   /usr/local/nagios/etc/contactgroups.cfg

    定义联系组的组名为datagroup,组的成员来自于上面定义的contacts.cfg,如果有多个联系人则以逗号相隔。下面是最关键的了,用nagios主要是监控一台主机的各种信息,包括本机资源,对外的服务等等.这些在nagios里面都是被称之为service,而实现对一个service的监控,则需要通过commands.cfg文件中定义的命令

    例如我们现在有一个需要监控的service,是监控一台机器的web服务是否正常, 我们需要哪些元素呢?最重要的有下面三点:首先是监控哪台机,然后是这个监控要用什么命令实现,最后就是出了问题的时候要通知哪个联系人?接下来,看第13部分。

    13.服务定义文件services.cfg

    cat /usr/local/nagios/etc/services.cfg

    以监控http服务为例,监控的主机为67这台主机,监控的时间段为24x7这个时间段名命定的定义

    引用的检查服务命令是commands.cfg里定义的check_tcp!80这个命令,就是去ping主机的80端口来检查http是否正常,发现ping不通后最大尝试次数为3次,包括重新检查间隔这些参数都是在timeperiods.cfg里定义的,自己可以修改。

    还有就是报警参数的设置也是自己按需求定义(参数在命令后面用!分割)。

    报警通知联系人也可以根据需要自定义。

    14.检测配置,启动web监控

    当所有的文件都配置好以后,可以用命令检查配置得是否正确。

    /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg  检测配置文件是否正确

    如果Error是0说明配置没有问题,如果有错误的话会有提示哪里出错,检查出错的配置文件。

    /etc/init.d/httpd restart

    /etc/init.d/nagios   restart

    在浏览器输入主监控机IP地址测试:http://192.169.32.73/nagios/

    要求用户名验证,就是之前httpasswd创建的web验证用户guest,第一部分的功能已经实现了,就是简单的监控主机是否存活当然,对于系统监控来说,这是远远不够的,对于来说,他的真正功能功能还没有发挥出来,在下面部分会详细的叙述。

    15.一些Nagios插件介绍

    nagios本身并没有监控的功能,所有的监控是由插件完成的,插件将监控的结果返回给nagios,nagios分析这些结果,web的方式展现给我们,同时提供相应的报警功能(这个报警的功能也是由插件完成的)

    所有的这些插件是一些实现特定功能的可执行程序,默认安装的路径是/usr/local/nagios/libexec

    我们在定义某个监控service时,所用的监控命令都是来自commands.cfg的,commands.cfg中定义的监控命令就是使用的这些插件.举个例子,之前我们已经不止一次用到了check-host-alive这个命令,打开commands.cfg就可以看到这个命令的定义,如下:

    command_name    check-host-alive

    这句话的意思是定义的命令名是check-host-alive,也就是我们在services.cfg中使用的名称

    执行的操作是

    $USER1$/check_ping -H $HOSTADDRESS$ -w 3000.0,80% -c 5000.0,100% -p 5

    其中$USER1$是在resource.cfg文件中定义的,代表插件的安装路径.就如我们上面看到的那样$USER1$=/usr/local/nagios/libexec,至于$HOSTADDRESS$,则默认被定义为监控主机的地址.

    简单的说,我们在services.cfg中定义了对192.169.32.67执行check-host-alive命令,实际上就是执行了

    /usr/local/nagios/libexec/ check_ping -H 192.169.32.67 -w 3000.0,80% -c 5000.0,100% -p 1

    实际上check-host-alive只是这一长串命令的简称而已,而在services.cfg中都是使用简称的.

    在commands.cfg中定义了很多这样的命令简称.基本上我们常用的监控项目都包含了,例如ftp,http,本地的磁盘,负载等等.

    我们再看一个命令,check_local_disk定义如下

     

    check_local_disk实际上是执行的check_disk插件.这里的$ARG1$, $ARG2$, $ARG3$是什么意思呢?在之前我们已经提到了这个check_disk这个插件的用法,-w的参数指定磁盘剩了多少是警告状态,-c的参数指定剩多少是严重状态,-p用来指定路径

    在使用check-host-alive的时候,只需要在services.cfg中直接写上这个命令名check-host-alive.后面没任何的参数.而使用check_local_disk则不同,在services.cfg中这要这么写

    check_local_disk!10%!5%!/

    在命令名后面用!分隔出了3个参数,10%是$ARG1$的值,5%是$ARG2$的值,/ 是$ARG3$的值

    简单的一句话就是

    services.cfg定义监控项目用某个命令

    这个命令必须在commands.cfg中定义

    定义这个命令时使用了libexec下的插件

    如果命令不带$ARG1$就可以在services.cfg中直接使用,如果带了使用时就带上参数,!相隔

    继续编辑services.cfg服务配置文件,添加需要监控的服务,基本上就是copy上节我们定义监控主机存活的配置,略作修改就行:

    监控192.169.32.67的FTP服务

    define service{

            host_name               192.169.32.67

              要监控的机,给出机器名,注意必须是hosts.cfg中定义的

              service_description     check ftp

              给这个监控项目起个名字,任意起,你自己懂就行

              check_command           check_ftp

              所用的命,当然必须是commands.cfg中定义了的

            max_check_attempts      5

            normal_check_interval   3

            retry_check_interval    2

            check_period            24x7

            notification_interval   10

            notification_period     24x7

            notification_options    u,c,r

            contacts                xubl

            }

    监控192.169.32.67的根分区使用情况

    define service{

            host_name              192.169.32.67

              service_description     check   disk

              check_command        check_local_disk!10%!5%!/

            max_check_attempts      5

            normal_check_interval     3

            retry_check_interval       2

            check_period              24x7

            notification_interval       10

            notification_period         24x7

            notification_options        w,u,c,r

            contacts                     xubl

            }

    其他的监控服务类似于这样,需要监控的服务在commands.cfg里都可以一一找到模版,需要监控不同主机只要修改hostname这一栏就行了。

    二、监控远程主机

             对于像磁盘容量,cpu负载这样的”本地信息”,nagios只能监测自己所在的主机,而对其他的机器则显得有点无能为力.毕竟没得到被控主机的适当权限是不可能得到这些信息的.为了解决这个问题,nagios有这样一个附加组件----NRPE.用它就可以完成对linux类型主机”本地信息”的监控.

    NRPE原理图如下:

    NRPE总共由两部分组成:

    – check_nrpe 插件,位于在监控主机(nagios-master)上

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

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

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

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

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

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

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

    注意:NRPE daemon需要nagios插件安装在远程的linux主机上,否则,daemon不能做任何的监控.下面讲述如何配置远程监控,首先需要在被监控主机上安装nrpe插件:

    1.首先需要添加nagios用户

    [root@127.43~]#useradd nagios

    [root@127.43~]#passwd nagios

     

    2. xinetd服务安装

    service xinetd 命令先查看有没有xinetd,没有的话,进行安装 yum install xinetd

     

    3.安装nagios-plugins

    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  /usr/local/src/nagios-plugins-1.4.13

      ./configure(如果报错:no acceptable C compiler found in $PATH  则先安装  yum install gcc)

      make

      make install

      这一步完成后会在/usr/local/nagios/下生成两个目录libexec和share

     修改目录权限

     chown -R nagios /usr/local/nagios

     chgrp -R nagios /usr/local/nagios

    4.安装nrpe

    cd  /usr/local/src

    wget http://prdownloads.sourceforge.net/sourceforge/nagios/nrpe-2.12.tar.gz

      tar -zxvf nrpe-2.12.tar.gz

      cd  /usr/local/src/nrpe-2.12

      ./configure --enable-command-args

      (如果提示ssl 找不到,则先运行 yum install openssl-devel,再运行./configure)

      make all

      make install-plugin

      make install-daemon

      make install-daemon-config

      现在再查看/usr/local/nagios/目录就会发现有4个目录了

      bin      etc      libexec  share

      安装到xinetd下

      make install-xinetd

      vi /etc/xinetd.d/nrpe

      设置only_from=nagios master的ip

      only_from       = 192.167.33.73 192.169.32.73 127.0.0.1

      保存退出

    增加nrpe服务

    vim /etc/services

    在最后一行添加上 nrpe         5666/tcp            #nrpe

    最后重启xinetd服务 

    service xinetd restart

    ---------------------------------------------------------------------

    可以查看到5666端口已经在监听了,然后使用check_nrpe这个插件功能测试nrpe时候正常工作

    可以看到返回当前NRPE的版本,说明本地用check_nrpe连接nrpe daemon是正常的。要注意的是为了让主监控机能监控到被监控机信息,被监控机也要保证防火墙打开5666端口

    5.nrpe被监控端配置

    进入到/usr/local/nagios/etc目录,可以看到目录下有一个nrpe.cfg文件,这就是nrpe的主配置文件,编辑他,找到下面这段话:

    # The following examples use hardcoded command   arguments...

    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_hda1]=/usr/local/nagios/libexec/check_disk   -w 20 -c 10 -p /dev/hda1

    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负载,hda1的容量,僵尸进程,总进程数.各条命令具体的含义见插件用法(执行”插件程序名 –h”)

    /usr/local/nagios/libexec/check_nrpe -H localhost -c check_users

    /usr/local/nagios/libexec/check_nrpe -H localhost -c check_load

    /usr/local/nagios/libexec/check_nrpe -H localhost -c check_hda1

    /usr/local/nagios/libexec/check_nrpe -H   localhost -c check_zombie_procs

    /usr/local/nagios/libexec/check_nrpe -H localhost -c check_total_procs

    到此被监控机上的配置就完成了,下面是在nagios-master上的nrpe设置:

    6.nagios-master主监控机nrpe设置

    在主监控机上其实要做的就是安装check_nrpe插件,然后在commands.cfg里创建check_nrpe的命令定义,daemon不需要安装上去,但是为了保险起见还是同客户端上一样都安装上去。

    安装过程参照(2. xinetd服务安装,4.安装nrpe)

     

    7.commands.cfg增加check_nrpe定义

    只需要在最后增加下面内容:

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

    下面就可以在services.cfg中定义对192.169.32.67主机cpu负载等等的监控

    define service {

    host_name  192.169.32.67

    被监控的主机名,这里注意必须是linux且运行着nrpe,而且必须是hosts.cfg中定义的

    service_description check-users

    监控项目的名称

    check_period 24x7

    max_check_attempts 4

    normal_check_interval 3

    retry_check_interval 2

    contacts    xubl

    notification_interval 10

    notification_period 24x7

    notification_options w,u,c,r

    check_command check_nrpe!check_load

    监控命令check_nrpe,是在commands.cfg中定义的,带的参数是check_load,是在nrpe.cfg中定义的

    }

    接下来重启nagios就行了,到此服务器端和客户端的配置全部完成。

    三.nagios插件扩展

    前面我们知道,监控的功能完全是否插件来实现的,很多时候我们需要扩展自己的插件来监控特定的service,插件扩展的基本步骤:

    1.插件检测的service状态是否正常,在插件的脚本程序退出码来体现。

    (如发现service正常,则 exit 0)

    2.程序在退出之前,打印一段描述文字,可以显示在nagios界面上

    (如echo “service OK!”)

    附service状态和脚本程序退出码对应关系:

    状态

    代码

    脚本程序退出码

    正常

    OK

    0

    警告

    WARNING

    1

    严重

    CRITICAL

    2

    未知错误

    UNKOWN

    --一般不用

    1.自定义插件check_log_error(shell)

    >>>1.1主要功能:

    (1)     根据关键字查找进程(通常是一个进程的运行入口主类)

    监控这个进程是否存在,如果不存在,则报警。

    (2)     检测log,看是否有新的error log出现,如果有,则报警。

    >>>1.2参数

    (1)     要检测的进程关键字(通常是一个进程的运行入口主类)

    (2)     log4j打印的日志的文件夹(该文件夹下必须有error.log文件,专门打印error级别的log)

    >>>1.3代码(shell)

    位于68机器/usr/local/nagios/libexec/

    #!/bin/sh

    folder=$2

    cd    $folder

    #====1检测进程存活============================================

    process_count=`ps -ef | grep  $1 |cut -c 9-15 |  wc    -l`

    let process_count=process_count-3

    if [ $process_count -lt  1  ]

     then

     echo   "ERROR process not exist ["$1"]"

     exit   2

    fi

     

    #=====2.检测error信息============================================

    #检查error.log,取得文件的最新更新时间,然后与当前目录下recent_solve_time.txt中的时#间,作对比

    #如果error.log修改时间大于recent_solve_time时间,则报警

    #如果recent_solve_time.txt文件不存在,则与当前时间作比较

    #==============================================================

    recent_error_time="1970-01-01   00:00:00"

    #如果有error信息,则得到error.log的最后修改时间

    if [ -f error.log ]

     then

         error_count=`tail -200 error.log | grep ERROR |wc -l`

       if   [ $error_count -gt 0  ]

          then   

           recent_error_last_modify_timestamp=`stat -c %Y error.log`

           recent_error_time=`date –d @$recent_error_last_modify_timestamp  "+%Y-%m-%d %H:%M:%S"`

        fi

    fi

    recent_solve_time="1970-01-01 00:00:00"

    #查看有没有解决问题记录

    if [ -f recent_solve_time.txt ] 

      then

          recent_solve_time=`cat    recent_solve_time.txt`

    fi

    msg="recent_solve_time="$recent_solve_time";recent_error_time="$recent_error_time

    #比较两个时间(先转化为时间戳,然后比较大小)

    recent_solve_timestamp=`date -d "$recent_solve_time"   +%s`

    recent_error_timestamp=`date -d   "$recent_error_time" +%s`

    if [ $recent_error_timestamp -gt   $recent_solve_timestamp ]

     then

         echo  "ERROR "$msg

         exit 2

     else

         echo " OK "$msg

         exit 0

    fi

     

    >>>1.4被监控端配置

    (1).脚本拷贝到/usr/local/nagios/libexec/

    (2).编辑 /usr/local/nagios/etc/nrpe.cfg  , 增加以下内容:

    (3).重启:service xinetd restart

    >>>1.5 nagios-master配置

    (1).编辑services.cfg ,配置你想要监控的进程,如:

    (2).重启 service nagios restart

    2.自定义插件check_hdfs_folder_age(shell)

    >>>2.1主要功能:

    check一个hdfs目录的最近更新时间,如果时间过久,则报警

    (如监控源码下载包的上传目录,如果很长时间没有源码包,说明下载有问题)

    >>>2.2参数

    (1)hdfs目录

    (2)目录更新时间间隔的报警阀值(如超过两个小时没更新,就报警) 单位为秒

    >>>2.3代码(shell)

    位于49机器/usr/local/nagios/libexec/

    #!/bin/sh

    current_year=`date   +%Y`

    last_modify_time=${current_year}`/home/parallel/hadoop-1.0.1/bin/hadoop   dfs -ls  $1 |  tail -1 | awk -F $1 '{print $1}'| awk -F   ${current_year}  '{print $2}'`

    last_modify_timestamp=`date   -d "${last_modify_time}"    +%s`

    current_timestamp=`date  +%s`

    #比较源码最修上传时间--与当前时间---相差特定时间以上,则报警

    current_timestamp_diff=`expr   $current_timestamp - $2`

    if   [ $current_timestamp_diff  -gt  $last_modify_timestamp ]

     then

      echo "ERROR! $1  is too old!"

      exit 2

     else

      echo "OK $1  modified at "${last_modify_time}

      exit 0

    fi

     

    >>>2.4被监控端配置

    (1).脚本拷贝到/usr/local/nagios/libexec/

    (2).编辑 /usr/local/nagios/etc/nrpe.cfg  , 增加以下内容:

    (3).重启:service xinetd restart

    >>>2.5 nagios-master配置

    (1).编辑services.cfg ,配置你想要监控的进程,如:

    (2).重启 service nagios restart

    3.自定义插件check_crawler_spider(shell)

    >>>3.1主要功能:

    (1)     检查crawler进程是否存在,不存在则报警

    (2)     检查cralwer 最近半小时内下载成功的url数量,如果==0,则报警

    >>>3.2参数

    (1)crawler进程运行入口主类(一般是tsinghua.crawlers.spider.Spider)

    (2)log4j打印的日志目录(里面有info.log)

    因为nagios需要读取文件,必须保证nagois对这个文件的读权限

    (把/home/crawler改为nagios可读 setfacl  -R -m  u:nagios:rx /home/crawler)

    >>>3.3代码(shell)

    位于68机器/usr/local/nagios/libexec/

    #!/bin/sh

    #===1.检测进程存活===================================================

    process_count=`ps   -ef | grep  $1 |cut -c 9-15 |  wc    -l`

    let   process_count=process_count-3

    if   [ $process_count -lt  1  ]

     then

     echo "ERROR process not exist   ["$1"]"

     exit 2

    fi

     

    #=====================2.检测info.log中最近半小时出现finish关键字的次数

    total_count="0"

    export   total_count

    cd   $2

    interval=3

    current_time=`date   +%s`

    last_ten_minute=`expr   $current_time - 600`

    last_twenty_minute=`expr   $current_time - 1200`

    last_thirty_minute=`expr   $current_time - 1800`

    #当前十分钟段

    current_time_interval=`date   -d @$current_time  "+%Y-%m-%d   %H:%M:%S" | cut -c 1-15`

    #十分钟之前段

    last_ten_minute_interval=`date   -d @$last_ten_minute  "+%Y-%m-%d   %H:%M:%S" | cut -c 1-15`

    #二十分钟之前段

    last_twenty_minute_interval=`date   -d @$last_twenty_minute  "+%Y-%m-%d   %H:%M:%S" | cut -c 1-15`

    #三十分钟之前段

    last_thirty_minute_interval=`date   -d @$last_thirty_minute    "+%Y-%m-%d %H:%M:%S" | cut -c 1-15`

    function   getFinishCount()

    {

    #第一个参数为文件名字,第二个参数为时间正则,第三个参数为关键字

    count=`cat   $1 | grep "$2" | grep "$3" | wc -l`

    total_count=`expr   $total_count + $count`

    }

    getFinishCount   info.log "${current_time_interval}"    "finish"

    getFinishCount   info.log "${last_ten_minute_interval}"  "finish"

    getFinishCount   info.log "${last_thirty_minute_interval}"  "finish"

    getFinishCount   info.log "${last_twenty_minute_interval}"  "finish"

    if   [ $total_count -lt 1  ]

     then

     echo "ERROR! the count of urls  in    recent thirty minutes  is   0!!"

     exit 2

    else

     echo "OK! the count of urls  in    recent thirty minutes  is   "$total_count

     exit 0

    fi

     

    >>>3.4被监控端配置

    (1).脚本拷贝到/usr/local/nagios/libexec/

    (2).编辑 /usr/local/nagios/etc/nrpe.cfg  , 增加以下内容:

    (3).重启:service xinetd restart

    >>>3.5 nagios-master配置

    (1).编辑services.cfg ,配置你想要监控的进程,如:

    (2).重启 service nagios restart

    4.自定义插件check_server_app(python)

    >>>4.1主要功能:

    检查server调度中raw_page_hbase,raw_page_extract,dr_hbase失败或等待的数据包个数,超过阀值则报警。(通过查询mysql统计的任务包个数)

    >>>4.2参数

             针对特定程序的脚本,没有参数

    >>>4.3代码(python)

    位于68机器/usr/local/nagios/libexec/

    #!/usr/bin/python

    #coding=utf-8

    import MySQLdb

    import sys

    try:

         connection = MySQLdb.connect(user="guest",passwd="guest1234",host="192.167.33.90",db="platform")

    except:

         print "Could not connect to MySQL server."

         exit( 0 )

     

    msg = "ERROR"

     

    try:

         cursor = connection.cursor()

     

       #获取[源码导入hbase]未成功的数量

         cursor.execute( "select count(*) from server_app_raw_page_hbase   where state not like 'success%'" )    

         result = cursor.fetchone();  

         raw_page_hbase_unsuccess_count = result[0]   

         #print raw_page_hbase_unsuccess_count

     

       #获取[源码抽取]未成功的数量

         cursor.execute( "select count(*) from server_app_raw_page_extract   where state not like 'success%'" )

         result = cursor.fetchone();

         raw_page_extract_unsuccess_count = result[0] 

         #print    raw_page_extract_unsuccess_count

     

       #获取[DR导入hbase]未成功的数量

         cursor.execute( "select count(*) from server_app_dr_hbase where   state not like 'success%'" )

         result = cursor.fetchone();

         dr_hbase_unsuccess_count = result[0]

         #print dr_hbase_unsuccess_count

     

         cursor.close()

      

       if(   raw_page_hbase_unsuccess_count<30 and   raw_page_extract_unsuccess_count<30 and   dr_hbase_unsuccess_count<30  ):

           msg = "ok"    

    except:

           print "Invoke Exception"

           sys.exit(2)

     

    if( msg=="ERROR" ):

           msg = "ERROR! raw_page_hbase:" +   str(raw_page_hbase_unsuccess_count)   +";raw_page_extract:"+str(raw_page_extract_unsuccess_count)+";dr_hbase:"+str(dr_hbase_unsuccess_count)

           print msg

           sys.exit(2)

    else:

           msg = "OK! raw_page_hbase:" +   str(raw_page_hbase_unsuccess_count)   +";raw_page_extract:"+str(raw_page_extract_unsuccess_count)+";dr_hbase:"+str(dr_hbase_unsuccess_count)

           print msg

           sys.exit(0)

     

    >>>4.4被监控端配置

    (1).脚本拷贝到/usr/local/nagios/libexec/

    (2).编辑 /usr/local/nagios/etc/nrpe.cfg  , 增加以下内容:

    (3).重启:service xinetd restart

    >>>3.5 nagios-master配置

    (1).编辑services.cfg ,配置你想要监控的进程,如:

    (2).重启 service nagios restart

    四.与ganglia集成

    1. check_ganglia.py插件扩展

    nagios可以监控ganglia中定义的metric的数值,当metric的value高于或低于阀值的时候,进行报警。

    ganglia本身自带了这样一个nagios插件(ganglia解压目录下的/contrib/check_ganglia.py)

    但该插件有个缺点,就是他判断当metric高于阀值时提供报警,这显然不能满足我们的要求,例如磁盘剩余空间,很显然当剩余空间低于阀值时需要报警,所以需要对check_ganglia.py进行改动。

    首先,我们约定,metric名称中含有” _free”关键字,我们认为这是剩余量的意思,此类metric低于阀值时需要报警。基于这个约定,我们改写下check_ganglia.py

    在check_ganglia.py的最后找到下面这段代码:

    在这段话之前,加上下面这样一段代码,即判定metric是否包含关键字”_free”,如果是,则在低于阀值时,报警。扩展代码如下图所示:

    (扩展后的代码位于73机器/usr/local/nagios/libexec/check_ganglia.py)

    扩展后的代码,放到nagios-master 的/usr/local/nagios/libexec/目录下

    2.nagios-master的service配置

    以下所有配置,见73机器

     

    2.1定义check_ganglia命令

    编辑/usr/local/nagios/etc/commands.cfg,增加配置

     

    2.2编辑/usr/local/nagios/etc/hostgroups.cfg

    定义ganglia-services组,组成员为*,所有机器

    2.3编辑/usr/local/nagios/etc/servicegroups.cfg

    定义ganglia-metrics服务组

     

    2.4编辑/usr/local/nagios/etc/templates.cfg

    定义ganglia-service模板

     

    2.5定义硬盘和内存service

    编辑/usr/local/nagios/etc/services.cfg

    检测各个机器的硬盘,当小于30G的时候,报警

    检测各个机器的内存,当小于30000K时,报警

    至此,各个机器的内存和硬盘已经监控起来,数据的来源当然是ganglia采集的

     

    2.6 load的监控

    load的监控有个问题,16核的机器和4核的机器报警阀值不一样。

    这样的话,得在/usr/local/nagios/etc/templates.cfg中定义load16,load8,load4这样的service模板,各个机器根据自己的cpu配置,决定引用哪个模板

    下面是在/usr/local/nagios/etc/templates.cfg中增加的内容:

    下面是/usr/local/nagios/etc/services.cfg中配置load的实例(每台机器都需要配置):

    配置成功后,重启nagios,每台机器的内存,硬盘,load全部监控了起来(如下图所示)

  • 相关阅读:
    Python标准库之csv(1)
    python3:csv的读写
    Python os模块方法
    Python闭包
    Python修饰器
    Python生成器
    Python迭代器
    Python文件对象方法
    Justep X5 Studio,业界公认第一的快速开发平台
    马云:早九晚五的工作方式在2013-2015年就是慢性自杀
  • 原文地址:https://www.cnblogs.com/521football/p/4528442.html
Copyright © 2020-2023  润新知