最近一直在研究Nagios,我们公司属于纯windows环境,在这样的环境中弄个这样的“另类”还着实费了我一点精力啊。

首先,我们现有的环境中已经有了Exchange的邮件服务,按照网上无数部署教程的说法均是说要用sendmail,google了一下sendmail,觉得完全没这个必要啊,我们已经有邮件服务器了,现需要的实现的仅是:用已有的邮件服务平台来发告警。没必要高那么复杂,而且架一台邮件服务器的复杂程度是怎么样的,搞过的人都知道:觉得不会再爱了。


于是,从检查Nagios的配置文件开始,细节是魔鬼:

我的环境:CentOS 6.4+Nagios3.x+Exchange2007

1、首先检查nagios的邮件发送指令:

[root@pcnnagios objects]# pwd
/usr/local/nagios/etc/objects
[root@pcnnagios objects]# vi commands.cfg
# 'notify-host-by-email' command definition
*****以上省略N行******
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' command definition
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$
}
*****以下省略N行******


2、发现一点蹊跷,貌似nagios默认用的是这个东东在发邮件:/bin/mai -s ……

3、拉出来看看

[root@pcnnagios objects]# ll /bin/mail
lrwxrwxrwx. 1 root root 5 5月   6 17:45 /bin/mail -> mailx

4、原来如此,用的是叫做mailx的这个邮件发送程序:

[root@pcnnagios objects]# mailx -h
mailx: option requires an argument -- h
Usage: mailx -eiIUdEFntBDNHRV~ -T FILE -u USER -h hops -r address -s SUBJECT -a FILE -q FILE -f FILE -A ACCOUNT -b USERS -c USERS -S OPTION users

5、结合man和google,发现该程序的配置文件是这个:/etc/mail.rc。在这个文添加上我们环境中的SMTP服务信息:

………………以上省略N行………………
#Set MyCompany's SMTP server
set from=nagios@domain.com
set smtp=10.40.1.36
#set smtp-auth-user=nagios
#set smtp-auth-password=123.abc
#set smtp-auth=login

测试一下:echo hello | mailx -v -s "test" [youremaiaddress]

6、注意:我们的公司的SMTP服务器上设定的是不需要任何帐号认证就可提供邮件服务,若此处强制提供的话会报错:

250-SIZE
250-PIPELINING
250-DSN
250-ENHANCEDSTATUSCODES
250-STARTTLS
250-X-ANONYMOUSTLS
250-AUTH NTLM
250-X-EXPS GSSAPI NTLM
250-8BITMIME
250-BINARYMIME
250-CHUNKING
250-XEXCH50
250 XRDST
>>> AUTH LOGIN
504 5.7.4 Unrecognized authentication type
smtp-server: 504 5.7.4 Unrecognized authentication type
"/root/dead.letter" 11/307
. . . message not sent.

注释掉帐号信息后再测试:

Resolving host 10.40.1.36 . . . done.
Connecting to 10.40.1.36 . . . connected.
220 ServerName@domain.com Microsoft ESMTP MAIL Service ready at Tue, 4 Jun 2013 17:29                                                              :18 +0800
>>> HELO nagiosServer
250 MailServerName Hello [10.40.1.115]
>>> MAIL FROM:<nagiosServer>
250 2.1.0 Sender OK
>>> RCPT TO:<YourEmailAddress>
250 2.1.5 Recipient OK
>>> DATA
354 Start mail input; end with <CRLF>.<CRLF>
>>> .
250 2.6.0 <51adb36e.mTIO0bjlR9KKEMWV%nagiosServer> Queued mail for delivery
>>> QUIT
221 2.0.0 Service closing transmission channel



OK,outlook中已经收到来信了!

7、最后到nagios中停止/打开一个服务试试,OK没问题!


补充:我的mailx版本是


[root@pcnnagios objects]# mailx -V
12.4 7/29/08



这样,不仅仅是在nagios中,在日工作中的其他任何程序或脚本中要启用邮件告警功能时,均可直接调用mailx指令进行发送告警邮件了,很方便的说!当然,前提是你的环境中要有现成的邮件服务器了,不过没有也没关系,用第三方比若163、qq、yahoo等也可以,只有设定正确的SMTP服务地址和认证帐号就可以了。


另,参考资料来源:http://www.cnblogs.com/xiaoshi1991/archive/2012/09/19/2694465.html