Nagios企业监控讲解
一、关于Nagios
Nagioss 是经典老牌子监控,伴随着一代运维工程师们路路成长,即便到了现在也广泛在企业中使用。Nagios有三个特点决定了它屹立不倒的优势:
第一: Nagios跟其他监控产品比起来是部署和配置最便便捷,没有之一,且最容易易入门的开源监控产品. 企业的老总们最喜欢的就是省时快速的完成工作
第二:Nagios对于各种基础服务层面的监控就是两个字"完善"这得益于Nagios的很多对于监控项目的基本计算方式都十分的直接有效,且非常符合一般人们对于"监控"的实现理理念.
第三:新的监控产品虽然很多,但是这里有一个奇怪现象:一般企业中面试运维工程师/架构师,到了监控这里不问别的就爱问Nagios相关的问题。对于各个企业来说,已经是用来考核一个合格的运维工程师的基本素养的指标了了。
二、Nagios的两种核心工作模式
1、nagios的第一种工作模式:远程直连采集
远程直连采集工作模式是什么意思呢?Nagios的监控服务器端需要采集被监控机器器的数据,而被监控机器器上的一些数据例如:
IP地址通不通
端口通不通
2、Nagios第二种工作模式:桥接间接采集
CPU负载,硬盘剩余,进程存在等等,类似这样的数据本身并不不是一个"服务"好比硬盘剩余多少,这是一项客户端Linux系统上的自身的状态本身不像SSH服务一样可以被外界直接访问到,如果nagios服务端想获取客户端硬盘状况没有办法直接从网络连上去获取,那怎么办呢?这就要提到 Nagios的一个扩展功能,NRPE组件。
三:开始安装Nagios服务端和NRPE组件
首先做linux服务器时间同步
时间服务器可以从http://www.pool.ntp.org/zh/这里查看
[root@elk ~]# ntpdate 1.cn.pool.ntp.org
由于我们的yum源不包含nagios包,所以要先安装一下epel-release。
[root@Cent65 ~]# yum -y install epel-release
nagios本身不不带web server,但是需要以web的形式体现出来,所以需要先安装httpd(apache)
1、安装http
[root@Cent65 ~]# yum install httpd
安装完成后启动服务,检查是否安装成功。
root@Cent65 ~]# service httpd restart
[root@Cent65 ~]# netstat -anptu | grep 80
查看一下网站信息
[root@Cent65 ~]# curl -I 192.168.1.65
2、安装nagios*、nrpe
[root@Cent65 ~]# yum install nagios* nrpe
安装完之后启动
[root@Cent65 ~]# service nagios start
启动之后我们来设置⼀下nagios的初始登录密码:
这里我们默认用nagiosadmin作为登录名,密码为123456
(注:如果web管理理员不是使用默认的nagiosadmin, 需要修改cgi.cfg
# vim /usr/local/nagios/etc/cgi.cfg
//把所有的nagiosadmin改为自定义的用户名)
[root@Cent65 ~]# htpasswd -c /etc/nagios/passwd nagiosadmin
接下来在我们的浏览器输入:
四、Nagios如何设置配置文件(一):节点定义.
配置文件路径
[root@Cent65 ~]# cd /etc/nagios/objects
如下便是我们要找到的配置路路径可以看到已经有好多以cfg结尾的默认配置文件了,不过这些其实都是一些自带的模板我们当前用不上,我们先关注 localhost.cfg文件。
1、 定义节点
[root@Cent65 objects]# vim localhost.cfg
内容如下:
define host{ use linux-server ; Name of host template to use ; This host definition will inherit all variables that are defined ; in (or inherited by) the linux-server host template definition. host_name Centos_67 alias localhost address 192.168.1.67 }
我们可以通过复制这段文件把要被监控的机器加进来。
需要修改的地方:
host_name:Centos_67(注:Centos_67这是自己取的名字是唯一标识符号,不可以重复,后面会被反复的调用,名字可以随便取,建议FQDN)。
alias:别名,任意取名。
address:被监控节点的 IP地址。
添加完节点之后重启nginx
[root@Cent65 objects]# service nagios restart
接下来回到我们的浏览器http://192.168.1.65/nagios/
点击左侧的host按钮,在我们的监控列表中会出现Centos_67主机。
五、Nagios如何设置配置文件(二):组定义和Service定义
在Nagios中各个节点的定义毕竟是分散的,我们可以将属于一类的'节点' 统一成一个'组'。接下来我们来看下配置文件的定义:
define hostgroup{ hostgroup_name ceshi ; The name of the hostgroup alias Linux Servers ; Long name of the group members localhost,Centos_67 ; Comma separated list of hosts that belong to this group }
如上这一段添加到localhost.cfg,就是把之前的节点(包括本机)都加入到一个host_group组当中。
hostgourp_name定义组名称很好理理解
alias 是起一个组别名
members后面接上各个节点的host_name,注意这里的host_name 就是节点当中的 host_name,必须一致,名称用逗号公开,且不可以使用别名。
然后继续重启nagios。
[root@Cent65 objects]# service nagios restart
打开网页界面:点击左侧的Host Groups按钮。会显示出我们刚才设置的ceshi组。
六、Nagios service(服务)的定义
定义服务,就是来定义我们需要监控的主机上面跑的服务。
我们来看如下这一段,取自localhost.cfg中这一段就是默认模板提供的 service定义方法用来监控机器器各类服务(软件)
defineservice{ use local-service ;Nameofservice templatetouse host_name localhost service_description SSH check_command check_ssh notifications_enabled 0 }
Use:字段我们保留不更改。
host_name:
这里写上在define_host当中定义的节点名字注意必须跟之前的host_name一致不然Nagios找不到,这里也再次证明了,定义节点是多么的关键,后续会大量的二次引用。
service_description
这里仅仅是这一项服务监控的注解,可以随意写成你要的名字。
check_command这是最关键的一项了,定义这项服务监控具体要监控什么内容调什么监控脚本去执(后我会讲到脚本自定义)。
notifications_enabled:
是否开启提醒功能。1为开启,0为禁用。也就是是否启报警。也就是是否开启报警针对这一项服务的监控(我后面会讲到报警 Pagerduty)。
接下来我们来做一个Centos_67上的SSH服务监控,继续在localhost.cfg文件中添加定义以下内容:
define service{ use local-service ; Name of service template to use host_name Centos_67 service_description SSH check_command check_ssh notifications_enabled 0 }
重启nagios服务后再来看一下nagios的主页.
选择左侧的services,发现已经有了Centos_67的ssh监控。
接下来,我们来监控一下http服务。在localhost.cfg后面添加如下配置:
defineservice{ use local-service ;Nameofservice templatetouse host_name Centos_67 service_description HTTP check_command check_http notifications_enabled 0 }
客户端要提前安装好http服务并启动,我们以apache为例:
[root@cent67 ~]# yum -y install httpd
[root@cent67 ~]# service httpd start
登录nagios网页端查看:
那么如果我们要监控的网站使用的不是默认80端口,而是指定的其他端口怎么办呢?我们如何来灵活的改动监控呢?
七、服务监控插件的配置
上面这一段service配置中,红色标记的部分,之所以能直接调用check_http并不是凭空出现的,而是有依据的。这个依据就是nagios的插件(我们之前安装的时候不是安装了很多nagios-plugins这个就是插件)。
nagios定义service中check_command其实就是通过调用插件当中预先设置好的这些脚本(check_http其实就是个脚本)才能实现监控的。
我们来分析下这些脚本和插件的关联:
(1)首先从rpm中先找到跟http相关的nagios插件
[root@centos65 objects]# rpm -qa | grep nagios-plugins | grep http
check_http这个脚本其实就来自于这个插件。
(2)接下来我们来查看这个插件中都包含了什么具体文件(脚本)
[root@centos65 objects]# rpm -ql nagios-plugins-http-2.2.1-4git.el6.x86_64
/usr/lib64/nagios/plugins/check_http
如上就可以看到,其实check_http是放在了一个默认的nagios插件路径当中了,作为脚本被 nagios调用。
(3)check_http这个脚本找到后,我们在Linux本地来试一下。
[root@centos65 objects]# /usr/lib64/nagios/plugins/check_http -H 192.168.1.67
HTTP OK: HTTP/1.1 200 OK - 253 bytes in 0.001 second response time |time=0.000980s;;;0.000000 size=253B;;;0
发现原来这个脚本不光可以被nagios的check_command直接调用 它自身还可以直接被咱们执行并能返回结果。
(4)我们把Centos_67的 httpd端口改到8080
改好之后原本的nagios配置的check_http就监控不到了。
[root@centos65 objects]# /usr/lib64/nagios/plugins/check_http -H 192.168.0.66
那么怎么办呢?我们现在Linux本地试试check_http脚本是 否支持端口改变。
[root@centos65 objects]# /usr/lib64/nagios/plugins/check_http -H 192.168.0.66 -p8080
手动本地运行测试,我们可以灵活改动,现在我们需要建立和nagios的关联)接下来咱们就来看看怎么建立这样的关联。首先我们先找到这个配置文件:
/etc/nagios/objects/commands.cfg
此文件中这一段配置,
其实是把check_http定义出来名称以及使用方法参数如何调用都是在这里设置的。所以说,在define_service中的check_http,其实 先要在command.cfg中定义出来。来看一下这一行:
command_line $USER1$/check_http -I $HOSTADDRESS$ $ARG1$
$USER1$:/usr/lib64/nagios/plugins/check_xxxx
$ARG1$:这个参数的值是需要在service中自行定义添加进去的 (define_service,ARG1传参数)。
接下来一段defineservice的定义:
defineservice{ use local-service ;Nameofservice templatetouse host_name Centos_67 service_description HTTP check_command check_http!-p8080 notifications_enabled 0 }
注意红色标记部分,这就是在service中调用监控脚本时候,添加额外参数的方法 使用!分开,参数的使用方法跟本地命令行是一模一样的。接下来看一下监控的Centos_67机器的HTTP服务就正常了。
八、通过NRPE建立桥接方式监控
刚才举的几个例子其实都是属于之前说过的nagios第一种监控形式"直接连接监控",那如果想监控例如CPU硬盘内存怎么办呢?自然就是要使第二种形式"间接桥接获取",通过NRPE这个插件来实现。
接下来开始安装间接监控NRPE:
(1)首先需要在Nagios的服务端和被监控客户端都安装NRPE和nagios-plugins两个组件。
开始服务端安装的时候yum install nrpe(nagios-plugins*之前已经安装过了),所以现在不用安装了。
客户端安装:
先安装一下epel-release,来提供我们的安装包。
[root@centos66 ~]# yum -y install epel-release
接下来安装插件:
[root@Cent67 ~]# yum install -y nrpe nagios-plugins*
(2)
①接下来回到服务端Centos_65, 到localhost.cfg配置文件,末尾加入如下内容:定义check_nrpe:
define command{ command_name check_nrpe command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$ }
②再在nagios服务端localhost.cfg配置文件末尾再添加如下的一项service,用来监控Centos_67上面的CPU的负载状况:
define service{ use local-service ;Name of service template to use host_name Centos_67 service_description UPTIME check_command check_nrpe!check_cpu notifications_enabled 0 }
③接下来配置客户端
check_cpu这个脚本属于间接获取数据使用,所以check_cpu只能是在客户端上被调用然后采集客户端上的CPU负载数据, 之前设置在服务端上的check_nrpe其实只能调用到客户端的check_nrpe,并不能调用到客户端上的check_cpu脚本.所以,只能是客户端的nrpe调用本地的check_cpu脚本,那么接下来就需要把客户端nrpe和check_cpu脚本关联起来。
check_cpu在客户端上必须2个地方都有。
第1处是NRPE在客户端上关联命令的设置:
[root@centos67~] # cat /etc/nrpe.d/lcgdm-common.cfg command[check_cpu]=/usr/lib64/nagios/plugins/lcgdm/check_cpu command[check_network]=/usr/lib64/nagios/plugins/lcgdm/check_network command[check_process]=/usr/lib64/nagios/plugins/lcgdm/check_process -p rfiod,globus-gridftp-server command[check_hostcert]=/usr/lib64/nagios/plugins/lcgdm/check_hostcert -C /etc/grid-security/hostcert.pem -s 第2处是:/usr/lib64/nagios/plugins/lcgdm/check_cpu
[root@centos66 ~]# ls /usr/lib64/nagios/plugins/lcgdm/check_cpu /usr/lib64/nagios/plugins/lcgdm/check_cpu
④服务端和客户端都要启动NRPE软件,确认工作在5666端口。
[root@centos65 objects]# service nrpe start Starting nrpe [确定] [root@centos65 objects]# netstat -antpu | grep 5666 tcp 0 0 0.0.0.0:5666 0.0.0.0:* LISTEN 53633/nrpe tcp 0 0 :::5666 :::* LISTEN 53633/nrpe
[root@centos67 ~]# service nrpe start Starting nrpe [确定] [root@centos66 ~]# netstat -antpu | grep 5666 tcp 0 0 0.0.0.0:5666 0.0.0.0:* LISTEN 53202/nrpe tcp 0 0 :::5666 :::* LISTEN 53202/nrpe
⑤修改一下客户端上的nrpe主配置文件,否则nagios服务端连不上。
[root@centos67 ~]# vim /etc/nagios/nrpe.cfg
修改:allowed_hosts=192.168.1.65
192.168.1.65为nagios服务端IP。修改完之后重启rnpe服务。
[root@centos67 ~]# service nrpe restart
⑥在服务端做个本地测试
[root@centos65 objects]# /usr/lib64/nagios/plugins/check_nrpe -H 192.168.1.67
出现nrpe版本号,表示成功。
最后到nagios主页来看一下,已经监控到客户端cpu的情况了。
九、自己编写监控脚本,并嵌入进nagios
之前我们在使用的监控项目都是nagios和nagios_plugins*插件包提供的。其实Nagios插件是完全支持自己动手编写的,看被监控端如下这一段shell代码:
[root@cent67 ~] # vim /usr/lib64/nagios/plugins/check_waiting_connect
(以check_waiting_connect作为我们的脚本名称。所有自行编写的脚本都放在vim /usr/lib64/nagios/plugins/这个路径下)
#!/bin/bash STATE_OK=0 STATE_CRITICAL=2 W=`netstat -an | grep -i wait | wc -l` if [ $W -le 1000 ]; then echo "OK,waiting_connections<1000 low" exit $STATE_OK; else echo "WARING, waiting_connections>1000high" exit $STATE_CRITICAL fi
(脚本实现的内容很简单,就是通过netstat命令来获取Linux系统中的等待链接数(waitting_connections) 如果大于1000就报警,小于1000就属于正常)。
Nagios可以识别4种状态返回信息,
0(OK)表示状态正常/绿色、
1(WARNING)表示出现警告/huangs色(系统自动和谐治好写拼音)
2(CRITICAL)表示出现非常严重的错误/红色
3(UNKNOWN)表示未知错误/深huangs色 Nagios根据插件返回来的值,来判断监控对象的状态,并通过web显示出来,以 供管理理员及时发现故障。
写好脚本后,被监控端找到nrpe的配置文件,添加一项新的命令(nrpe)
[root@cent67 ~]# vim /etc/nrpe.d/lcgdm-common.cfg
command[check_waiting_connect]=/usr/lib64/nagios/plugins/check_waiting_connect
回到服务端nagios服务端Centos_65添加defineservice
define service{ use local-service ;Nameofservice templatetouse host_name Centos_67 service_description WAITING_CONNECTS check_command check_nrpe!check_waiting_connect notifications_enabled 0 }
接下来保证客户端nagios用户有权限执行监控脚本然后来到服务端检查:
[root@Cent65 objects]# /usr/lib64/nagios/plugins/check_nrpe -H 192.168.1.67 -c check_waiting_connect
执行成功,接下来重启服务端nagios、nrpe服务。
service nagios restart
service nrpe restart
查看nagios主页显示:
这里已经可以显示出来了。
好了,关于nagios就先总结到这里,欢迎到家提问指正。