Linux下Nagios的安装与配置
一、Nagios简介
Nagios是一款开源的电脑系统和网络监视工具,能有效监控Windows、Linux和Unix的主机状态,交换机路由器等网络设置,打印机等。在系统或服务状态异常时发出邮件或短信报警第一时间通知网站运维人员,在状态恢复后发出正常的邮件或短信通知。
Nagios原名为NetSaint,由Ethan Galstad开发并维护至今。NAGIOS是一个缩写形式: “Nagios Ain’t Gonna Insist On Sainthood” Sainthood 翻译为圣徒,而”Agios”是”saint”的希腊表示方法。Nagios被开发在Linux下使用,但在Unix下也工作得非常好。
主要功能
- 网络服务监控(SMTP、POP3、HTTP、NNTP、ICMP、SNMP、FTP、SSH)
- 主机资源监控(CPU load、disk usage、system logs),也包括Windows主机(使用NSClient++ plugin)
- 可以指定自己编写的Plugin通过网络收集数据来监控任何情况(温度、警告……)
- 可以通过配置Nagios远程执行插件远程执行脚本
- 远程监控支持SSH或SSL加通道方式进行监控
- 简单的plugin设计允许用户很容易的开发自己需要的检查服务,支持很多开发语言(shell scripts、C++、Perl、ruby、Python、PHP、C#等)
- 包含很多图形化数据Plugins(Nagiosgraph、Nagiosgrapher、PNP4Nagios等)
- 可并行服务检查
- 能够定义网络主机的层次,允许逐级检查,就是从父主机开始向下检查
- 当服务或主机出现问题时发出通告,可通过email, pager, sms 或任意用户自定义的plugin进行通知
- 能够自定义事件处理机制重新激活出问题的服务或主机
- 自动日志循环
- 支持冗余监控
- 包括Web界面可以查看当前网络状态,通知,问题历史,日志文件等
二、Nagios工作原理
Nagios的功能是监控服务和主机,但是他自身并不包括这部分功能,所有的监控、检测功能都是通过各种插件来完成的。
启动Nagios后,它会周期性的自动调用插件去检测服务器状态,同时Nagios会维持一个队列,所有插件返回来的状态信息都进入队列,Nagios每次都从队首开始读取信息,并进行处理后,把状态结果通过web显示出来。
Nagios提供了许多插件,利用这些插件可以方便的监控很多服务状态。安装完成后,在nagios主目录下的/libexec里放有nagios自带的可以使用的所有插件,如,check_disk是检查磁盘空间的插件,check_load是检查CPU负载的,等等。每一个插件可以通过运行./check_xxx –h 来查看其使用方法和功能。
Nagios可以识别4种状态返回信息,即 0(OK)表示状态正常/绿色、1(WARNING)表示出现警告/黄色、2(CRITICAL)表示出现非常严重的错误/红色、3(UNKNOWN)表示未知错误/深黄色。Nagios根据插件返回来的值,来判断监控对象的状态,并通过web显示出来,以供管理员及时发现故障。
种监控状态
状态 | 代码 | 颜色 |
---|---|---|
正常 | OK | 绿色 |
警告 | WARNING | 黄色 |
严重 | CRITICAL | 红色 |
未知 | UNKOWN | 浅黄色 |
如果监控系统发现问题不能报警那就没有意义了,所以报警也是nagios很重要的功能之一。但是,同样的,Nagios 自身也没有报警部分的代码,甚至没有插件,而是交给用户或者其他相关开源项目组去完成的。
Nagios 通过NRPE 来远端管理服务
- Nagios 执行安装在它里面的check_nrpe 插件,并告诉check_nrpe 去检测哪些服务。
- 通过SSL,check_nrpe 连接远端机子上的NRPE daemon
- NRPE 运行本地的各种插件去检测本地的服务和状态(check_disk,..etc)
- 最后,NRPE 把检测的结果传给主机端的check_nrpe,check_nrpe 再把结果送到Nagios状态队列中。
- Nagios 依次读取队列中的信息,再把结果显示出来。
三、实验环境
Host Name | 操作系统 | IP |
---|---|---|
nagios | CentOS release 6.5 | 192.168.1.123 |
server01 | CentOS release 6.5 | 192.168.1.127 |
Server 安装了nagios软件,对监控的数据做处理,并且提供web界面查看和管理。当然也可以对本机自身的信息进行监控。
Client 安装了NRPE等客户端,根据监控机的请求执行监控,然后将结果回传给监控机。
防火墙已关闭/iptables: Firewall is not running.
SELINUX=disabled
四、Nagios服务端安装 目标机器是 hostname为 nagios
4.1 基础支持套件
检查是否安装了支持套件
rpm -q gcc glibc glibc-common gd gd-devel xinetd openssl-devel
如果系统中没有这些套件,使用yum 安装
yum install -y gcc glibc glibc-common gd gd-devel xinetd openssl-devel
4.2 创建nagios用户和用户组
useradd -s /sbin/nologin -M nagios
mkdir /usr/local/nagios
chown -R nagios:nagios /usr/local/nagios
4.3 编译nagios
cd /usr/local/src
下载 nagios-3.4.3.tar.gz
tar -xvf nagios-3.4.3.tar.gz
cd nagios
./configure --prefix=/usr/local/nagios # 配置
echo $?
make all # 编译
make install # 安装
make install-init # 安装初始化
make install-commandmode # 安装命令
make install-config #安装配置
chkconfig --add nagios
chkconfig --level 35 nagios on
chkconfig --list nagios
4.4 安装nagios-plugin
cd /usr/local/src
下载 nagios-plugins-1.4.16.tar.gz
tar zxvf nagios-plugins-1.4.16.tar.gz
cd nagios-plugins-1.4.16
./configure --prefix=/usr/local/nagios
make && make install
4.5 安装httpd
4.6 安装PHP
4.7 创建密码文件
htpasswd -c /usr/local/nagios/etc/htpasswd nagiosadmin
4.8 启动 httpd 和 nagios 服务端
service httpd start
service nagios start
5. 被监控机器 安装nrpe服务器server01上
5.1 下载nrpe编译安装
下载 nrpe-2.13.tar.gz 文件到 /usr/local/src
tar -xvf nrpe-2.13.tar.gz
cd nrpe-2.13
# 加 --with-mysql 指定Mysql安装目录,生成监控mysql的命令 check_mysql 和 check_mysql_query 命令 到 /usr/local/nagios/libexec 下
./configure --prefix=/usr/local/nagios/ --with-mysql=/usr/local/mysql/
make && make install
5.2 修改/usr/local/nagios/etc/nrpe.cfg
在文件最后加上这行
command[check_mysql]=/usr/local/nagios/libexec/check_mysql -H 192.168.1.127 -u nagios -p123456 -d nagios
创建软链接 libmysqlclient.so.18 链接到 /usr/lib64 (32位系统链接到/usr/lib目录)
ln -s /usr/local/mysql/lib/libmysqlclient.so.18 /usr/lib64
修改文件 /etc/xinetd.d/nrpe
将文件中only_from 项目增加 监控主机(host 为nagios的ip)的ip
# default: on
# description: NRPE (Nagios Remote Plugin Executor)
service nrpe
{
flags = REUSE
socket_type = stream
port = 5666
wait = no
user = nagios
group = nagios
server = /usr/local/nagios/bin/nrpe
server_args = -c /usr/local/nagios/etc/nrpe.cfg --inetd
log_on_failure += USERID
disable = no
only_from = 127.0.0.1 192.168.1.123
}
编辑 /etc/services 文件,在文件最后一行加上
nrpe 5666/tcp # nrpe
重启 xinetd
service xinetd restart
查看nrpes是否启动,看到监听的5666端口说明启动成功,到这里客户机配置完成
netstat -nlp | grep 5666
6 配置nagios服务器监控server01服务器上的mysql服务器
在配置文件 etc/nagios.cfg 中加入一行
cfg_dir=/usr/local/nagios/etc/conf.d
在 etc/objects/commands.cfg 文件中加入命令
#监控nrpe
define command{
command_name check_nrpe
command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$
}
#监控mysql
define command{
command_name check_mysql
command_line $USER1$/check_mysql -H $HOSTADDRESS$ -u $ARG1$ -p $ARG2$ -d $ARG3$
}
新建文件etc/conf.d/127.cfg
define host{
use linux-server
host_name server01
alias server01
address 192.168.1.127
}
define hostgroup{
hostgroup_name linux-servers01
alias Linux Servers01
members server01
}
define service{
use local-service
host_name server01
service_description PING
check_command check_ping!100.0,20%!500.0,60%
max_check_attempts 4
normal_check_interval 1
retry_check_interval 1
}
define service{
use local-service
host_name server01
service_description check_disk
check_command check_nrpe!check_hda1
max_check_attempts 4
normal_check_interval 1
retry_check_interval 1
}
define service{
use local-service
host_name server01
service_description check_total_procs
check_command check_nrpe!check_total_procs
}
define service{
use local-service
host_name server01
service_description check_load
check_command check_nrpe!check_load
max_check_attempts 4
normal_check_interval 1
retry_check_interval 1
}
define service {
host_name server01
service_description MysqlDB
check_period 24x7
max_check_attempts 2
normal_check_interval 1
retry_check_interval 1
notification_interval 5
notification_period 24x7
notification_options w,u,c,r
check_command check_nrpe!check_mysql!nagios!123456!nagios
}
7nagios 邮件告警
7.1 配置sendmail
a、卸载系统自带的sendmail,先查找,然后卸载
yum list installed | grep sendmail
b、下载sendmail邮件
以下就来介绍一下sendEmail这个软件的使用.
sendEmail的主页http://caspian.dotconf.net/menu/Software/SendEmail/
下载地址http://caspian.dotconf.net/menu/Software/SendEmail/sendEmail-v1.55.tar.gz
c、解压拷贝sendEmail 文件到 /usr/local/bin 目录下
cp sendEmail /usr/local/bin
d、发送邮件命令
/usr/local/bin/sendEmail –f 发送邮件的邮箱 –t 收件人 –s smtp.exmail.qq.com –u "标题" –xu 发邮件账号 –xp 发送邮箱的密码 –m 内容
解释:
-f 表示发送者的邮箱
-t 表示接收者的邮箱
-s 表示SMTP服务器的域名或者ip
-u 表示邮件的主题
-xu 表示SMTP验证的用户名
-xp 表示SMTP验证的密码(注意,这个密码貌似有限制,例如我用d!5neyland就不能被正确识别)
-m 表示邮件的内容
e、修改etc/object/commands.cfg 文件, 这两条命令,在文件已经存在,需要修改即可
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" | /usr/local/bin/sendEmail -f noreply@hks360.com -s smtp.exmail.qq.com -xu noreply@hks360.com -xp 密码 -t $CONTACTEMAIL$ -u "** $NOTIFICATIONTYPE$ Host Alert: $HOSTNAME$ is $HOSTSTATE$ **"
}
define command{
command_name notify-service-by-email
command_line /usr/bin/printf "%b" "***** Nagios 2.9 *****\n\nNotification Type: $NOTIFICATIONTYPE$\n\nService: $SERVICEDESC$\nHost: $HOSTALIAS$\nAddress: $HOSTADDRESS$\nState: $SERVICESTATE$\n\nDate/Time: $LONGDATETIME$\n\nAdditional Info:\n\n$SERVICEOUTPUT$" | /usr/local/bin/sendEmail -f noreply@hks360.com -s smtp.exmail.qq.com -t $CONTACTEMAIL$ -xu noreply@hks360.com -xp 密码 -u "** $NOTIFICATIONTYPE$ alert - $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$ **"
f、修改etc/object/contact.cfg文件
define contact{
contact_name gary
use generic-contact
alias gary1
service_notification_commands notify-service-by-email
; 服务通知,发送 邮件,这里的 notify-service-by-email 是 commands.cfg 中的 command_name
host_notification_commands notify-host-by-email
; host 通知,这里的 notify-host-by-email 是commands.cfg 中的 command_name
email 834865081@qq.com
; 要通知的邮箱账号
}
define contact{
contact_name gary2
use generic-contact
alias gary2
service_notification_commands notify-service-by-email
host_notification_commands notify-host-by-email
email huangfei@tianjuninfo.com
}
define contactgroup{
contactgroup_name admins
alias gary-common
members gary2,gary
; 多个成员组 用逗号隔开
}
g、在需要的邮件通知的添加到监控的服务组
define service{
use local-service
host_name server01
service_description check_disk
check_command check_nrpe!check_hda1
max_check_attempts 4
normal_check_interval 1
retry_check_interval 1
contact_groups admins
; admins 是 contact.cfg 中 的 contactgroup_name
}