百度空间 | 百度首页 
 
查看文章
 
nagios监控系统安装(2)
2008-12-21 21:00
6、设置监控报警

需要调整的文件包括:
/usr/local/nagios/etc/objects/contacts.cfg
/usr/local/nagios/etc/objects/commands.cfg

a./usr/local/nagios/etc/objects/contacts.cfg
这里面是联系人、分组的信息,简单配置contact项目如下:
define contact{
        contact_name                    nagiosadmin
        use                             generic-contact
        service_notification_period     24x7
        host_notification_period        24x7
        service_notification_options    w,u,c,r
        host_notification_options       d,u,r
        alias                           Nagios Admin
        service_notification_commands   notify-service-by-email,notify-service-by-sms
        host_notification_commands      notify-host-by-email,notify-host-by-sms

        email                           wulujia@gmail.com       ; <<***** CHANGE THIS TO YOUR EMAIL ADDRESS ******
        }

b./usr/local/nagios/etc/objects/commands.cfg
这里配置了各种plugins的用法、命令等,可以好好看看这份文件,在其中做的事情包括了,定义发sms和通过邮件发报警信息,其中sms信息的细节建议参见《libfetion短信通知与nagios整合》:

#host notify by sms
define command {
command_name    notify-host-by-sms
command_line    /usr/local/fetion/sms.sh "Host $HOSTSTATE$ alert for $HOSTNAME$! on '$DATETIME$'">/dev/null 2>&1
}

#service notify by sms
define command {
command_name    notify-service-by-sms
command_line    /usr/local/fetion/sms.sh "$HOSTADDRESS$ $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$">/dev/null 2>&1
}

# 'notify-host-by-email' command definition
define command{
        command_name    notify-host-by-email
        command_line    /usr/local/nagios/bin/mail_send.sh "** $NOTIFICATIONTYPE$ Host Alert: $HOSTNAME$ is $HOSTSTATE$ **" "***** N
agios *****\n\nNotification Type: $NOTIFICATIONTYPE$\nHost: $HOSTNAME$\nState: $HOSTSTATE$\nAddress: $HOSTADDRESS$\nInfo: $HOSTOUTPU
T$\n\nDate/Time: $LONGDATETIME$\n" $CONTACTEMAIL$
        }

# 'notify-service-by-email' command definition
define command{
        command_name    notify-service-by-email
        command_line    /usr/local/nagios/bin/mail_send.sh "** $NOTIFICATIONTYPE$ Service Alert: $HOSTALIAS$/$SERVICEDESC$ is $SERVI
CESTATE$ **" "***** Nagios *****\n\nNotification Type: $NOTIFICATIONTYPE$\n\nService: $SERVICEDESC$\nHost: $HOSTALIAS$\nAddress: $HO
STADDRESS$\nState: $SERVICESTATE$\n\nDate/Time: $LONGDATETIME$\n\nAdditional Info:\n\n$SERVICEOUTPUT$" $CONTACTEMAIL$
        }

顺便提一句:如果要检查非标准端口(比如,ftp开在了22222端口上),也是修改commands.cfg文件,对check_ftp的声明修改增加-p参数即可。
# 'check_ftp' command definition
define command{
        command_name    check_ftp
        command_line    $USER1$/check_ftp -H $HOSTADDRESS$ -p $ARG1$
        }
       
再把test.cfg中,对应服务的检测命令后面加一个端口号的参数:
define service {
host_name ...
...
check_command check_ftp!22222
}

这就可以对22222端口的FTP进行监控,要添加多个参数,也可以如法炮制。

其中用到的脚本mail_send.sh如下:

#!/bin/bash

cd /usr/local/nagios/bin

if [ $# -ne 4 ]; then
        Subject="$1"
        AlertInfo="$2"
        Touser="$3"
        /usr/bin/python /usr/local/nagios/bin/mail_send.py "$Subject" "$AlertInfo" "$Touser"
fi

# EOF :mail_send.sh

用到的mail_send.py脚本如下:

## below is the mail_send.py
## mail_send.py
----------------------------------------------------------
# -*- coding: utf-8 -*-
import sys,os,re,glob,sys
import os.path
import smtplib
import time,datetime
import base64
import random

import email
import mimetypes
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
from email.MIMEImage import MIMEImage
#from email import Encoders
#from email import Message

#os.sys.path.append('/webapp/_conf/nagios/')

#from nagios_conf import visit


#################################################################
##    vspMail                                                  ##
##    参数列表                                                 ##
##    smtp_server                发邮件smtp服务器地址          ##
##    from_usr                   发件人地址                    ##
##    to_usr                     收件人地址                    ##
##    subject                      邮件标题                    ##
##    htmlText                        邮件内容                 ##
##    auth                       是否需要认证,1为是,0为否    ##
##    log_usr                    smtp用户名                    ##
##    log_passwd                 smtp密码                      ##
##                                                             ##
#################################################################

def nagiosMail(smtp_server,from_usr,to_usr,subject,plainText,htmlText,auth,log_usr,log_passwd):
        server = smtplib.SMTP(smtp_server)
        #server.set_debuglevel(1)
        if auth == 1:
                server.login(log_usr,log_passwd)

        strFrom = from_usr
        strTo = to_usr
        subject="=?GB2312?B?%s?=" % (base64.encodestring(subject)[:-1])

#   msgRoot = MIMEMultipart('related')
        msgRoot = MIMEMultipart('alternative')
        msgRoot['Subject'] = subject
        msgRoot['From'] = strFrom
        msgRoot['To'] = strTo
        msgRoot.preamble = 'This is a multi-part message in MIME format.'

        msgAlternative = MIMEMultipart('alternative')
        msgAlternative.attach(msgAlternative)

        #设定纯文本信息
        msgText = MIMEText(plainText, 'plain', 'gbk')
        msgAlternative.attach(msgText)      # 隐藏文本
#   msgRoot.attach(msgText)

        #设定HTML信息
        msgText = MIMEText(htmlText, 'html', 'gbk')
        msgRoot.attach(msgText)

        #设定内置图片信息,可以考虑作为取日志的附件的方法
#   fp = open('test.jpg', 'rb')
#   msgImage = MIMEImage(fp.read())
#   fp.close()
#   msgImage.add_header('Content-ID', '<image1>')
#   msgRoot.attach(msgImage)

        server.sendmail(strFrom, strTo, msgRoot.as_string())
        server.quit()


class Logger(object):
        def __init__(self):
                from time import strftime
                pid = os.getpid()
                logtime=strftime('%Y%m%d')
                self.logfile = '/var/log/nagios/nagios-%s.log' % logtime

        def write(self, err):
                logline = '%s|%s\n' % (time.asctime(), err)
                f = file(self.logfile, 'a')
                f.write(logline)
                f.close()

#class mailsend(object,subject,htmlText):
def mailsend(*arguments):
        logger = Logger()
        subject=arguments[0]
        htmlText=arguments[1]
        plainText=arguments[1]
        touser=arguments[2]
        #print subject
        #print htmlText
        #print plainText
        #return True
        #flist=visit()
        ######################################################
        ##
        ##         以下为配置内容
        ##
        ######################################################

        #邮件发送服务器地址
        smtp_server = 'localhost'
        #smtp_server = 'smtp.163.com'
        #smtp_server = 'abc.com'
        #smtp_server = '192.168.0.220'

        #发一封歇息多久
        delay = 3

        #smtp服务器是否需要验证
        #需要验证为1不需要为0
        auth = 0

        #如果需要验证,请在下面输入用户名和密码
        log_usr="abcdef"
        log_passwd="123456"

        #发件人地址
        from_usr = 'nagios@abc.com'


        try:

                tousr=touser.split(",")
                for to_usr in tousr:
                        print to_usr
                        nagiosMail(smtp_server,from_usr,to_usr,subject,plainText, htmlText,auth,log_usr,log_passwd)
                        logger.write('''Email has been sent to: %s \n''' % (to_usr))
                        time.sleep(delay)
                logger.write('''......The all logs for nagios has been Finished!!!\n''')

        except IOError:
                logger.write("Can not open list file please place it in current directory and name it as 'addr-xxx.txt'\n")

if __name__ == '__main__':
        logger = Logger()
        argv = sys.argv
        subject=argv[1]
        htmlText=argv[2]
        touser=argv[3]
        #subject="**RECOVERY alert - 192.168.0.233/Partition_Webapp is OK **"
        #htmlText="***** Nagios *****\n\nNotification Type:RECOVERY\n\nService: Partition_Webapp\nHost:192.168.0.233\nAddress: 192.168.0.233\nState:OK\n\nDate/Time: Mon Jul 30 18:24:59 CST 2007\n\nAdditionalInfo:\n\nDISK OK - free space: /webapp 757 MB (54% inode=70%):"
        print argv
        try:
                mailsend(subject,htmlText,touser)
        except:
                logger.write('execution failure:' + str(sys.exc_info()[0]))
                raise

测试:/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg
启动nagios配置文件:/etc/init.d/nagios start

7、登陆web访问:http://server/nagios/
输入在nagios.pw中定义的用户名和密码登陆,就可以看到对test服务器的监控情况了,如果停止其中的某个服务,会在检测4次失败后,短消息和邮件通知。

8、如果需要服务器使用mysql进行数据存储,需要安装NDOUtils
./configure --enable-mysql
make

Mysql中建立库、用户,并赋予权限:
mysqladmin -uroot -p create nagios
mysql -uroot -p
mysql> grant all privileges on nagios.* to m1@localhost identified by 'xfocusisbest';
mysql> flush privileges;

导入库:
cd db
./installdb –u user –p password –h localhost –d database

拷贝编译完成的文件:
cp src/ndomod-3x.o /usr/local/nagios/bin/ndomod.o
cp config/ndomod.cfg /usr/local/nagios/etc/

调整/usr/local/nagios/etc/nagios.cfg
broker_module=/usr/local/nagios/bin/ndomod.o config_file=/usr/local/nagios/etc/ndomod.cfg
event_broker_options=-1

安装NDO2DB DAEMON
cp src/ndo2db-3x /usr/local/nagios/bin/ndo2db
cp config/ndo2db.cfg /usr/local/nagios/etc/

运行ndo2db,并将之加入/etc/rc.local
/usr/local/nagios/bin/ndo2db -c /usr/local/nagios/etc/ndo2db.cfg

9、如果希望对Linux受监控端的机器进行更细粒度的监控,需要安装NRPE

在客户机(受监控端),解压后:
./configure --enable-ssl --enable-command-args
make all
make install

将下面命令行运行并加入/etc/rc.local:
/usr/sbin/nrpe -c /etc/nrpe.cfg -d

在服务器(监控端),解压后:
./configure --enable-ssl --enable-command-args
make all
make install
cp sample-config/nrpe.cfg /etc/
cp src/nrpe /usr/sbin/
cp src/check_nrpe /usr/local/nagios/libexec/

在 objects/commands.cfg 中定义 check_nrpe 使用的命令:
# 'check_nrpe' command definition
define command{
        command_name    check_nrpe
        command_line    $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$
        }

之后调整server的配置,加入check_nrpe,并重载nagios.cfg,就可以使用nrpe的功能了。

再次说明,本文中的配置和脚本多数来自:http://www.linuxtone.org/viewthread.php?tid=514,不知道是否原始出处,记录。

类别:默认分类 | 浏览() | 评论 (0)
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu