分类: 系统运维
2009-10-16 16:04:12
机器名称 | 角色 | 可查看状态及接受报警信息的用户 | 所需工具 |
Nagios服务器 | 监控端 | 系统管理员(SA) | Apache、nagios、nagios plugin、sendmail、perl等 |
邮件服务器 | 被监控端 | 系统管理员、邮件管理员 | Nrpe、nagios plugin、自定义脚本等 |
数据库服务器 | 被监控端 | 系统管理员、dba | Nrpe、nagios plugin、自定义脚本等 |
Web服务器 | 被监控端 | 系统管理员、webmaster | Nrpe、nagios plugin、自定义脚本等 |
Nfs共享服务器 | 被监控端 | 系统管理员 | Nrpe、nagios plugin、自定义脚本等 |
缓存服务器(squid) | 被监控端 | 系统管理员、webmaster | Nrpe、nagios plugin、自定义脚本等 |
要实现资源和服务两个方面的监控,需要配置服务器端(nagios server)及被监控端(NRPE-nagios remote plugin executor).为了能顺利地、有条理的部署nagios监控平台,一个好的工作风格是在nagios server自身实现服务和资源的监控,然后再在其他监控端部署nrpe,从nagios server端用check_nrpe测试通过后,再在nagios server配置文件中逐一增加监控项目。当然如果只是监控服务而不监控主机资源,则被监控端不做任何nrpe的安装。为了方便初学者更容易上手和成功, 我们就从简单的步骤开始。
如果系统是redhat 或 centos ,只需执行 service sendmail start 启动守护进程,然后再用dns服务器给它一个合法的域名(即A记录),马上就可以用mail命令来发送测试邮件到你的某个电子邮箱里了。收到测试邮件,就 说明邮件系统配置结束,是不是很容易呢?这里给一个发送邮件的例子:
正常情况下,没有任何服务器能向手机发送短消息的,要到达这个目的,得花钱购买短信服务(也有些人运用飞信一类的方式来达到这个目的,个人觉得对于运营 网站不是太靠谱)。要是在几年前,自己申请短信通道还是有可能的,2005年以后似乎门槛提高了很多。当你付费成功后,短信服务商会给你提供入口及加密关 键字;然后我们自己写个脚本就可以发送短信。以下是我的服务器用perl写的脚本:
#!/usr/bin/perl -w
use strict;
use LWP::Simple;
use URI::Escape;
use Digest::MD5;
my ($mobile, $content) = @ARGV;
my $log_control = 1;
my $key = 'Ysdbyhd6T';
my $souce_content = substr($mobile, 0, 8) . substr($mobile, -10, 10) . $key;
my $md5 = Digest::MD5->new;
$md5->add($souce_content);
my $result_conent = uc($md5->hexdigest);
my
$url =
"([-BVG'0&Mobile=$mobile&Content=$content&Keyword=$result_conent";
my $result = get $url;
if($log_control) {
my $fh;
open($fh, '>> /var/log/sms.log') or die "can't open log: $!";
print $fh join(' ', time, $result, "n");
close $fh;
}
我们把这个文件放在目录 /usr/local/bin/ 下面,把它命名为 sms_send.pl ,用命令 chomod +x /usr/local/bin/sms.pl 给与它执行权限。这个脚本在各种各样的unix、linux下都可以正常工作,nagios报警短信发送就是靠它了。如果读者也打算拿这个脚本发送短信的 话,只要改一下key值和url值就可以直接使用。
接下来就是验证是否可以发送短信,执行命令行 /usr/local/bin/sms.pl 13300108888 "It is a test" ,回车后数秒钟,你的手机应该能收到带有内容"It is a test"的短信息。为了保证短信服务的可靠性,我做了一个策略:每天下午6点定时给我发一个通知短信;告诉我短信发送是正常的,也是该下班回家了。做 法:执行 crontab -e 然后输入行 00 18 * * * /usr/local/bin/sms.pl 13300108888 "It is Ok" 。
tar zxvf httpd-2.2.8.tar.gz
cd httpd-2.2.8
./configure --prefix=/usr/local/apache #仅仅需要这么一个选项
make
make install
2、执行命令行 /usr/local/apache/bin/apachectl start 启动apache守护进程,在别的机器的浏览器里输入这个服务器的ip地址,看是否可以正常浏览apache的默认页面-通常是一个"IT works!"。为了方便以后维护apache 更方便些,我们可以修改环境变量文件/etc/profile,在文件的末尾追加行 "export PATH=$PATH:/usr/local/apache/bin ",保存后执行 source /etc/profile 使其修改立即生效,这样我们以后执行apache 启动之类的命令就不必输很长一串路径,直接输入 apachectl start 就可以了。
ScriptAlias /nagios/cgi-bin /usr/local/nagios/sbin
AuthType Basic
Options ExecCGI
AllowOverride None
Order allow,deny
Allow from all
AuthName "Nagios Access"
AuthUserFile /usr/local/nagios/etc/htpasswd
Require valid-user
Alias /nagios /usr/local/nagios/share
AuthType Basic
Options None
AllowOverride None
Order allow,deny
Allow from all
AuthName "nagios Access"
AuthUserFile /usr/local/nagios/etc/htpasswd
Require valid-user
照这样一种方式修改配置文件,保证不会把配置文件改得一塌糊涂,我相信大部分初学者都有把文件修改后而不知道文件本身的原貌。到这步配置文件虽然修改好 了,但还不能通过语法检查,因为有2个与之相关联的东西还不存在,他们是用户和组nagios及apache的验证用户文件/usr/local /nagios/etc/htpasswd . 在后续操作中完成这任务后,再验证不迟。
tar zxvf nagios-2.9.tar.gz
cd nagios-2.9
./configure -prefix=/usr/local/nagios ----with-nagios-user=nagios --with-nagios-group=nagios
make all
make install-commandmode
make install-config
先把这些文件改名,如 cgi.cfg-sample改成cgi.cfg ,用命令cp cgi.cfg-sample cgi.cfg …依样把余下的几个*.cfg-sample都复制成*.cfg文件。从nagios2.6版开始,不用修改配置文件localhost.cfg就可以直 接运行../bin/nagios -v nagios.cfg验证程序是否能正常运行(nagios2.5及以前版本的最小运行的配置文件是minimal.cfg,但需要修改这个文件多处才能 验证成功)。当然,我们不能指望这个最小的配置文件能够满足实际的需求,因此,需要对现有的配置文件进行修改,其次增加自定义的一些配置文件。通过复制这 些自带的模板文件,我们可以得出几个主要的配置文件,我们可以把它归类为:
类型名 | 包含文件 | 作用 | 备注 |
主配置文件 | nagios.cfg | 定义和控制nagios行为 | 需要修改 |
Cgi配置文件 | cgi.cfg | 浏览器执行诸如重启nagios服务等 | 修要修改 |
宏定义文件 | Resource.cfg | 定义插件路径 | 不需修改 |
命令定义文件 | Commands.cfg | 定义怎么发送短信、邮件等 | 需要修改 |
其他文件 | contactgroups.cfg, contacts.cfg,hostgroups.cfg,hosts.cfg,services.cfg | 监控对象配置文件,如主机配置文件、联系人配置文件等 | 主配置文件包含,手动创建 |
#注释或删掉这行
#cfg_file=/usr/local/nagios/etc/localhost.cfg
#主机配置文件路径
cfg_file=/usr/local/nagios/etc/hosts.cfg
#//主机组配置文件路径
cfg_file=/usr/local/nagios/etc/hostgroups.cfg
#联系人配置文件路径
cfg_file=/usr/local/nagios/etc/contacts.cfg
#联系组配置文件路径
cfg_file=/usr/local/nagios/etc/contactgroups.cfg
#服务配置文件路径
cfg_file=/usr/local/nagios/etc/services.cfg
#监视时段配置文件路径
cfg_file=/usr/local/nagios/etc/timeperiods.cfg
#在web界面下重启nagios、停止主机/服务检查等操作,.默认值是0.
check_external_commands=1
#根据自己的情况定这个命令检查时间间隔.默认值是1秒.
command_check_interval=10s
#如有多个用户,中间用逗号隔开
authorized_for_system_information=sery
authorized_for_configuration_information=sery
authorized_for_system_commands=sery
authorized_for_all_services=sery
authorized_for_all_hosts=nagiosadmin,sery
authorized_for_all_service_commands=sery
authorized_for_all_host_commands=sery
###### host-notify-by-sms command definition
define command{
command_name host-notify-by-sms
command_line /usr/local/bin/sms.pl $CONTACTPAGER$ "$NOTIFICATIONTYPE$ alert - Host $HOSTNAME$ is $HOSTSTATE$"
}
###### service-notify-by-sms command definition
define command{
command_name service-notify-by-sms
command_line /usr/local/bin/sms.pl $CONTACTPAGER$
"$NOTIFICATIONTYPE$: $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$"
}
第一个块定义主机报警的内容,即主机发生死机、恢复等情况发送手机短信报警,其接受者和发送内容由"$..$"定义的宏来决定。第二个块定义服务报警内 容,即监控的服务或监控的主机资源发生故障时发送手机报警短信。Nagios规定,如果探测到被监控的主机停机或不可达,它就不再探测这个停机主机上的服 务。通俗地一点理解:主机都停了,当然服务也跟着停了!另外一个需要注意的地方是命令行(command_line)路径一定要用全路径,这里调用的命令 就是我们在全面编写的那个脚本sms.pl。
在主配置文件nagios.cfg中,我们注释 了行 cfg_file=/usr/local/nagios/etc/localhost.cfg ,而使用若干单独的配置文件来定义各种对象,这样可以获得维护方便、书写规范等诸多方面的好处。这些单独的配置文件不是自然存在的,我们需要手工创建并添 加内容。当然,一开始我们并不是很清楚怎么往这些文件里添加内容,只好回过头去看官方文档,天啦,太分散了,尽然不知道怎么着手了!怎么办?打开文件 localhost.cfg-sample,心里基本上就有数了:无非是把这个文件拆分开来,形成多个文件嘛!下面我按新添一个主机进入监控的较优方式添 加这些配置文件(当然也可以有其它的顺序,这并不影响监控的效果)。好了,我们先把nagios服务器本身给监控上,这些监控包括:主机存活、web服务 监控、磁盘空间监控、负载监控、进程数监控、ip连接数监控。
define host {
host_name nagios-server
alias nagios server
address 59.26.240.63
contact_groups sagroup
check_command check-host-alive
max_check_attempts 5
notification_interval 10
notification_period 24x7
notification_options d,u,r
}
define hostgroup {
hostgroup_name sa-servers
alias sa servers
members nagios-server
}
define contact {
contact_name sery
alias system administrator
service_notification_period 24x7
host_notification_period 24x7
service_notification_options w,u,c,r
host_notification_options d,u,r
service_notification_commands service-notify-by-email,service-notify-by-sms
host_notification_commands host-notify-by-email,host-notify-by-sms
email sery@163.com
pager 13301000018
}
define contactgroup {
contactgroup_name sagroup
alias system administrator group
members sery
}
define service {
host_name nagios-server
service_description check-host-alive
check_period 24x7
max_check_attempts 4
normal_check_interval 3
retry_check_interval 2
contact_groups sagroup
notification_interval 10
notification_period 24x7
notification_options w,u,c,r
check_command check-host-alive
}
define service {
host_name nagios-server
service_description check_tcp 80
check_period 24x7
max_check_attempts 4
normal_check_interval 3
retry_check_interval 2
contact_groups sagroup
notification_interval 10
notification_period 24x7
notification_options w,u,c,r
check_command check_tcp!80
}
define service{
host_name nagios-server
service_description check-disk
check_command check_nrpe!check_df
max_check_attempts 4
normal_check_interval 3
retry_check_interval 2
check_period 24x7
notification_interval 10
notification_period 24x7
notification_options w,u,c,r
contact_groups sagroup
}
define service{
host_name nagios-server
service_description check-load
check_command check_nrpe!check_load
max_check_attempts 4
normal_check_interval 3
retry_check_interval 2
check_period 24x7
notification_interval 10
notification_period 24x7
notification_options w,u,c,r
contact_groups sagroup
}
define service{
host_name nagios-server
service_description total_procs
check_command check_nrpe!check_total_procs
max_check_attempts 4
normal_check_interval 3
retry_check_interval 2
check_period 24x7
notification_interval 10
notification_period 24x7
notification_options w,u,c,r
contact_groups sagroup
}
tar zxvf nrpe-2.8.1.tar.gz
cd nrpe-2.8.1
./configure -prefix=/usr/local/nrpe
make
make install
安装完nrpe后,在安装目录/usr/local/nrpe/libexec只有一个文件check_nrpe,而在nagios插件目录,却缺少这 个文件,因此需要把这个文件复制到nagios插件目录;同样,因为nrpe需要调用的诸如check_disk等插件在自己的目录没有,可是这些文件确 是nagios插件所存在的,所以也需要从nagios目录复制一份过来。我们把复制过程列举出来:
cp /usr/local/nrpe/libexec/check_nrpe /usr/local/nagios/libexec
cp /usr/local/nagios/libexec/check_disk /usr/local/nrpe/libexec
cp /usr/local/nagios/libexec/check_load /usr/local/nrpe/libexec
cp /usr/local/nagios/libexec/check_ping /usr/local/nrpe/libexec
cp /usr/local/nagios/libexec/check_procs /usr/local/nrpe/libexec
pid_file=/var/run/nrpe.pid
server_port=5666
#以单独的守护进程运行
server_address=59.26.240.63
nrpe_user=nagios
nrpe_group=nagios
allowed_hosts=127.0.0.1,59.26.240.63
dont_blame_nrpe=0
debug=0
command_timeout=60
connection_timeout=300
# The following examples use hardcoded command arguments...
command[check_users]=/usr/local/nrpe/libexec/check_users -w 5 -c 10
command[check_load]=/usr/local/nrpe/libexec/check_load -w 15,10,5 -c 30,25,20
#command[check_hda1]=/usr/local/nrpe/libexec/check_disk -w 20 -c 10 -p /dev/hda1
command[check_df]=/usr/local/nrpe/libexec/check_disk -w 20 -c 10
command[check_zombie_procs]=/usr/local/nrpe/libexec/check_procs -w 5 -c 10 -s Z
command[check_total_procs]=/usr/local/nrpe/libexec/check_procs -w 150 -c 200
command[check_ips]=/usr/local/nrpe/libexec/ip_conn.sh 8000 10000
● command[check_df]=/usr/local/nrpe/libexec/check_disk -w 20 -c 10 检查整个服务器的磁盘利用率;如果是freebsd系统,因为其/dev分区为100%,需要排除这个分区,因此其命令行应该为 "command[check_df]=/usr/local/nrpe/libexec/check_disk -x /dev -w 20 -c 10"。
● command[check_ips]=/usr/local/nrpe/libexec/ip_conn.sh 8000 10000 ip连接数,ip_conn.sh脚本需要自己写,下面给出脚本的内容:
#!/bin/sh
#if [ $# -ne 2 ]
#then
# echo "Usage:$0 -w num1 -c num2"
#exit 3
#fi
ip_conns=`netstat -an | grep tcp | grep EST | wc -l`
if [ $ip_conns -lt $1 ]
then
echo "OK -connect counts is $ip_conns"
exit 0
fi
if [ $ip_conns -gt $1 -a $ip_conns -lt $2 ]
then
echo "Warning -connect counts is $ip_conns"
exit 1
fi
if [ $ip_conns -gt $2 ]
then
echo "Critical -connect counts is $ip_conns"
exit 2
fi
我在nrpe配置文件nrpe.cfg把脚本所需的两个参数写上了,因此这个脚本就不需判断两个参数输入值的情况。只要当前ip连接数大于8000,系统就发warning报警,超过10000,则发"critical"报警信息。把这个脚本 放在目录/usr/local/nrpe/libexec下,并给于执行权限。
Mar 2 21:07:18 MONITOR nrpe[23823]: Starting up daemon
Mar 2 21:07:18 MONITOR nrpe[23823]: Listening for connections on port 5666
Mar 2 21:07:18 MONITOR nrpe[23823]: Allowing connections from: 127.0.0.1,59.26.240.63
[root@MONITOR nrpe]# netstat -an
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 59.26.240.63:5666 0.0.0.0:* LISTEN
[root@MONITOR nrpe]#ps aux | grep nrpe | grep -v grep
nagios 23823 0.0 0.0 4864 924 ? Ss 21:07 0:00 bin/nrpe -c etc/nrpe.cfg -d
[root@MONITOR nrpe]# libexec/check_nrpe -H 59.26.240.63
NRPE v2.8.1
[root@MONITOR nrpe]# libexec/check_nrpe -H 59.26.240.63 -c check_df
DISK OK - free space: / 8241 MB (77% inode=98%); /var 5239 MB (95%
inode=99%); /usr 11971 MB (86% inode=97%); /dev/shm 1013 MB (100%
inode=99%);| /=2417MB;11218;11228;0;11238 /var=273MB;5792;5802;0;5812
/usr=1807MB;14508;14518;0;14528 /dev/shm=0MB;993;1003;0;1013
[root@MONITOR nrpe]#libexec/check_nrpe -H 59.26.240.63 -c check_ips
OK -connect counts is 13956
/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg
Reading configuration data...
Running pre-flight check on configuration data...
……………
Total Warnings: 0
Total Errors: 0
Things look okay - No serious problems were detected during the pre-flight check
/usr/local/nagios/bin/nagios -d /usr/local/nagios/etc/nagios.cfg
/usr/local/apache/bin/htpasswd -c /usr/local/nagios/etc/htpasswd sery