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

接下来在我们的浏览器输入:

http://192.168.1.65/nagios

四、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_nameCentos_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的服务端和被监控客户端都安装NRPEnagios-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就先总结到这里,欢迎到家提问指正。