如何在Debian 9上使用Nagios NRPE监视主机

时间:2020-03-05 15:28:59  来源:igfitidea点击:

之前我们展示了如何在Debian 9上安装nagios core来监视某些远程主机的服务。

为此,我们将需要在远程主机上安装Nagios NRPE守护程序和插件。
它是一个软件包,将安装在所有需要监视的远程主机上。

NRPE(Nagios远程插件执行器)是一个插件,可让我们在远程Linux机器上远程执行Nagios插件。
它允许我们监视远程计算机指标(磁盘使用率,CPU负载等)。
它还可以与某些Windows代理插件(例如NSClient ++)进行通信,因此我们还可以在远程Windows主机上执行脚本并检查指标。
在本文中,我将向我们解释如何使用Nagios监视Linux和Windows主机服务器。

NRPE如何工作?

NRPE是一种监视代理程序和协议,通常用于通过Nagios监视远程主机。
NRPE与以下组织合作:

  • 在Nagios服务器上运行的客户端(check_nrpe插件)
  • 在远程服务器上运行,处理来自客户端的请求并返回状态信息的守护程序。

我们可以通过以下方案来总结过程

Nagios Server (check_nrpe)-> Remote host (NRPE deamon)-> service_to_check
Nagios Server (check_nrpe) <-Remote host (NRPE deamon) <-service_to_check

当Nagios需要监视来自远程计算机的服务资源时:

  • Nagios将执行check_nrpe插件并告诉它需要检查哪些服务
  • check_nrpe插件与远程主机上的NRPE守护程序联系
  • NRPE守护程序运行适当的Nagios插件来检查服务或者资源
  • 服务检查的结果从NRPE守护程序传递回check_nrpe插件,该插件随后将检查结果返回给Nagios进程。

可以将NRPE配置为仅接受来自特定IP地址的连接。
我们可以告诉它通过连接运行哪些命令。
仅允许本地主机配置的命令,并且可以确定Nagios是否发送参数。

1)在nagios服务器上添加Linux主机

为了使用NRPE添加组件,我们需要在Nagios服务器和安装了NRPE守护程序的远程Linux主机上执行一些任务。
在我们的情况下,远程Linux主机是Debian 9服务器。
我将展示针对Centos和Ubuntu服务器的过程的具体点。

a)配置远程Linux主机

我们需要在远程服务器上安装nagios和NRPE插件以进行监视。

安装nagios插件

我们需要首先安装准备工作

# apt install -y autoconf gcc libc6 libmcrypt-dev make libssl-dev wget bc gawk dc build-essential snmp libnet-snmp-perl gettext

在Centos 7上安装以下准备工作

# yum install -y gcc glibc glibc-common make gettext automake autoconf wget openssl-devel net-snmp net-snmp-utils epel-release perl-Net-SNMP

现在,我们将在“/opt”目录中创建工作目录,并其中下载插件

# mkdir /opt/nagios && cd /opt/nagios
# wget --no-check-certificate -O nagios-plugins.tar.gz https://github.com/nagios-plugins/nagios-plugins/archive/release-2.2.1.tar.gz
# tar zxf nagios-plugins.tar.gz
# cd nagios-plugins-release-2.2.1

现在我们将编译并安装插件

# ./tools/setup
# ./configure
# make
# make install

安装nrpe插件

现在,当我撰写本文时,我们可以下载nrpe的最新版本,即nrpe插件3.2.0。

# cd /opt/nagios/
# wget --no-check-certificate -O nrpe.tar.gz https://github.com/NagiosEnterprises/nrpe/archive/nrpe-3.2.0.tar.gz
# cd nrpe-nrpe-3.2.0
# tar xzf nrpe.tar.gz && cd nrpe-nrpe-3.2.0

现在我们将其编译

# ./configure --enable-command-args
# make all

对于Ubuntu,编译命令为

# ./configure --enable-command-args --with-ssl-lib=/usr/lib/x86_64-linux-gnu/
# make all

我们也需要在远程Linux主机上创建nagios用户和组

# make install-groups-users

我们将安装二进制文件,NRPE守护程序,check_nrpe插件和配置文件。

# make install && make install-config

现在,我们将nrpe端口号(5666)映射到命名服务

# echo >> /etc/services
# echo '# Nagios services' >> /etc/services
# echo 'nrpe    5666/tcp' >> /etc/services

我们将安装服务,并确保在系统启动时启动nrpe

# make install-init && systemctl enable nrpe.service

配置防火墙

现在重要的是将防火墙配置为接受所有nrpe通信

# iptables -I INPUT -p tcp --destination-port 5666 -j ACCEPT

我们将安装iptables-persistent,它会自动加载已保存的iptables规则。
为此,必须将规则保存在文件“ /etc/iptables/rules.v4”中

# apt install -y iptables-persistent

确保回答是以保存现有规则。
通常,我们可以使用iptables-save命令保存iptables新规则。

在Centos 7上,如下配置防火墙

# firewall-cmd --zone=public --add-port=5666/tcp
# firewall-cmd --zone=public --add-port=5666/tcp --permanent

授权nagios服务器与主机通信

安装nrpe插件后,我们需要配置所有允许与Linux主机上的nrpe插件进行通信的主机。
这意味着我们将指示要到达的nagios服务器信息(IP地址等)。
文件“ /usr/local/nagios/etc/nrpe.cfg”是包含所有nrpe设置的文件。

找到指令“ allowed_hosts”并添加Nagios服务器的私有IP地址

allowed_hosts=172.16.20.128

查找指令“ dont_blame_nrpe”,以确定NRPE守护程序是否将允许客户端为执行的命令指定参数。

dont_blame_nrpe=1

启动并测试nrpe服务

要启动nrpe服务,请使用以下命令

# systemctl start nrpe.service

现在来看一切是否正常,我们需要确保首先运行nrpe守护程序。

# netstat -at | egrep "nrpe|5666"
tcp        0      0 0.0.0.0:nrpe            0.0.0.0:*               LISTEN     
tcp6       0      0 [::]:nrpe               [::]:*                  LISTEN

现在,我们可以通过运行已安装的check_nrpe插件来测试nrpe是否在本地工作

# /usr/local/nagios/libexec/check_nrpe -H localhost
NRPE v3.2.0

我们应该在上面有输出,这表明nrpe插件在Linux主机上可以正常工作。
已安装的NRPE配置文件包含几个命令定义,我们可以使用这些定义来监视我们的远程主机。

现在我们需要配置nagios服务器

b)配置nagios服务器以检测远程主机

本文假定我们已经在Debian 9上安装并配置了Nagios服务器。
这意味着我们现在将对其进行配置,以检测并添加我们的远程Linux主机。
如果尚未进行配置,请按照本文进行操作。

在nagios服务器上,我们也需要安装nrpe插件并为Linux主机创建一个配置文件。

安装nrpe插件

该过程与Linux主机上的过程完全相同,但是请不要忘记,在nagios服务器上,我们已经有nagios用户和组,因此我们可以跳过该步骤。
我们将移至nagios工作目录

# cd /opt/nagios
# wget --no-check-certificate -O nrpe.tar.gz https://github.com/NagiosEnterprises/nrpe/archive/nrpe-3.2.0.tar.gz
# cd nrpe-nrpe-3.2.0

现在我们将其编译

# tar xzf nrpe.tar.gz && cd nrpe-nrpe-3.2.0
# ./configure --enable-command-args
# make all

我们将安装二进制文件和配置文件

# make install && make install-config

我们也需要添加nrpe服务

# echo >> /etc/services
# echo '# Nagios services' >> /etc/services
# echo 'nrpe    5666/tcp' >> /etc/services

我们将安装服务,并确保在系统启动时启动nrpe

# make install-init && systemctl enable nrpe.service

配置防火墙和nrpe服务

我们还将配置防火墙以允许与所有主机进行nrpe通信。

# iptables -I INPUT -p tcp --destination-port 5666 -j ACCEPT
# systemctl start nrpe.service

测试与远程Linux主机nrpe守护程序的通信

我们需要确保check_nrpe插件可以与远程主机上的NRPE守护程序对话。
我们将使用带有远程主机IP地址的check_nrpe插件,如下所示

# /usr/local/nagios/libexec/check_nrpe -H 172.16.20.129
NRPE v3.0

现在,我们将使用命令定义来尝试监视远程Linux上的服务(检查cpu负载)。

# /usr/local/nagios/libexec/check_nrpe -H 172.16.20.129 -c check_load
CRITICAL - load average: 0.01, 0.28, 0.31|load1=0.010;0.150;0.300;0; load5=0.280;0.100;0.250;0; load15=0.310;0.050;0.200;0;

我们可以看到我们有一个要监视的远程Linux的响应。
它表明我们的插件可以在远程主机上完美运行,并且通信良好。

c)在nagios服务器上定义新的Linux主机和服务

默认情况下,Nagios将某些对象定义包含在nagios服务器上的'/usr/local/nagios/etc/objects'目录中,该目录代表我们需要监视的每种主机类型。

# ls /usr/local/nagios/etc/objects/
commands.cfg    printer.cfg    switch.cfg    localhost.cfg   timeperiods.cfg   windows.cfg
contacts.cfg    templates.cfg

我们将首先创建一个文件夹,其中将保存Nagios服务器必须监视的所有远程主机配置文件。

# mkdir /usr/local/nagios/etc/objects/servers

Nagios有一个模板文件templates.cfg,其中包含一些其他主机,服务等引用的对象定义模板示例。
当我们创建每个远程主机文件定义时,这些定义将很有用。

默认情况下,Nagios通过localhost.cfg文件监视安装该服务器的服务器。
我们将使用此文件为我们的Linux主机创建配置文件。

# cp /usr/local/nagios/etc/objects/localhost.cfg /usr/local/nagios/etc/objects/servers/linux.cfg

现在,我们将编辑文件以添加主机。

# cd /usr/local/nagios/etc/objects/servers/
# vim linux.cfg###############################################################################
## HOST DEFINITION###############################################################################
# Define a host for the local machine
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               debian9
        alias                   Debian 9
        address                 172.16.20.129
        }###############################################################################
## SERVICE DEFINITIONS###############################################################################
# Define a service to "ping" the local machine
define service{
        use                             generic-service         ; Name of service template to use
        host_name                       debian9
        service_description             PING
	check_command			check_ping!100.0,20%!500.0,60%
        }
# Define a service to check the disk space of the root partition
# on the local machine.  Warning if < 20% free, critical if
# < 10% free space on partition.
define service{
        use                             generic-service         ; Name of service template to use
        host_name                       debian9
        service_description             Root Partition
	check_command			check_local_disk!20%!10%!
        }

文件应该看起来像上面的东西。
该输出已被截断。
我们将拥有更多的服务定义。

指令“地址”应包含要监视的远程主机的地址。

指令“ host_name”必须包含将在nagios仪表板上显示的名称,并且应该为我们指示,因此,请删除默认的localhost值,并将其替换为另一个名称(在我的情况下,debian9是该名称)。
我们应该在该指令在文件中的所有位置替换该指令,这意味着主机和所有服务定义。

文件中存在的服务定义是标准的。
如果需要在远程Linux上监视这些服务,我将在下面为imap,ftp和smtp的文件末尾提供三个服务定义。

#Checking FTP service
define service{
        use				generic-service         ; Inherit default values from a template
        host_name               	debian9
        service_description     	FTP
        check_command   		check_ftp
        }
#Checking SMTP service
define service{
        use             		generic-service         ; Inherit default values from a template
        host_name               	debian9
        service_description     	SMTP
        check_command   		check_smtp
        }
#Checking IMAP service
define service{
        use             		generic-service         ; Inherit default values from a template
        host_name               	debian9
        service_description     	IMAP
        check_command   		check_imap
        }

d)更新nagios配置文件并重新启动服务

现在,我们已经为远程主机创建了一个新目录,我们需要指出nagios可以其中找到它以便使用它。
因此,将编辑默认的nagios配置文件'/usr/local/nagios/etc/nagios.cfg'

vim /usr/local/etc/nagios.cfg
# OBJECT CONFIGURATION FILE(S)
# These are the object configuration files in which you define hosts,
# host groups, contacts, contact groups, services, etc.
# You can split your object definitions across several config files
# if you wish (as shown below), or keep them all in a single config file.
# You can specify individual object config files as shown below:
cfg_file=/usr/local/nagios/etc/objects/commands.cfg
cfg_file=/usr/local/nagios/etc/objects/contacts.cfg
cfg_file=/usr/local/nagios/etc/objects/timeperiods.cfg
cfg_file=/usr/local/nagios/etc/objects/templates.cfg
# Definitions for monitoring the local (Linux) host
cfg_file=/usr/local/nagios/etc/objects/localhost.cfg
#cfg_file=/usr/local/nagios/etc/objects/linux.cfg
# Definitions for monitoring a Windows machine
#cfg_file=/usr/local/nagios/etc/objects/windows.cfg
# Definitions for monitoring a router/switch
#cfg_file=/usr/local/nagios/etc/objects/switch.cfg
# Definitions for monitoring a network printer
#cfg_file=/usr/local/nagios/etc/objects/printer.cfg

# You can also tell Nagios to process all config files (with a .cfg
# extension) in a particular directory by using the cfg_dir
# directive as shown below:
cfg_dir=/usr/local/nagios/etc/objects/servers
#cfg_dir=/usr/local/nagios/etc/servers
#cfg_dir=/usr/local/nagios/etc/printers
#cfg_dir=/usr/local/nagios/etc/switches
#cfg_dir=/usr/local/nagios/etc/routers

我们可能会注意到,我添加了指令“ cfg_dir =/usr/local/nagios/etc/objects/servers”,该指令指示要考虑的新主机目录。
我们会注意到指令“ cfg_file”指示nagios使用的不同服务和主机配置文件。

这意味着,如果我们没有创建目录,而只是在默认的'/usr/local/nagios/etc/objects'目录中创建了linux.cfg文件,则只需添加指令'cfg_file =/usr/local /nagios/etc/objects/linux.cfg”,以便nagios可以检测到远程主机的配置。

现在,我们需要在重新启动服务之前检查nagios配置是否不包含任何错误

# /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg
Nagios Core 4.3.2
Copyright (c) 2009-present Nagios Core Development Team and Community Contributors
Copyright (c) 1999-2009 Ethan Galstad
Last Modified: 2016-05-09
License: GPL
Website: https://www.nagios.org
Reading configuration data...
   Read main config file okay...
   Read object config files okay...
Running pre-flight check on configuration data...
Checking objects...
	Checked 19 services.
	Checked 2 hosts.
	Checked 1 host groups.
	Checked 0 service groups.
	Checked 1 contacts.
	Checked 1 contact groups.
	Checked 17 commands.
	Checked 5 time periods.
	Checked 0 host escalations.
	Checked 0 service escalations.
Checking for circular paths...
	Checked 2 hosts
	Checked 0 service dependencies
	Checked 0 host dependencies
	Checked 5 timeperiods
Checking global event handlers...
Checking obsessive compulsive processor commands...
Checking misc settings...
Total Warnings: 0
Total Errors:   0
Things look okay - No serious problems were detected during the pre-flight check

我们可以看到我们没有任何错误,因此我们可以重新启动nagios服务

# systemctl restart nagios

e)访问nagios Web界面

现在一切正常,我们可以启动nagios管理页面以查看配置结果。
在本地服务器上,通过http://localhost/nagios访问

我正在远程Linux上访问,这就是为什么我们可以看到我指示了Nagios服务器IP的原因。
我们可以看到我们有我们的新远程Linux及其服务。

我们尚未在远程主机上安装FTP服务。
这就是为什么此服务处于紧急状态的原因。

2)在nagios服务器上添加Windows主机

为了使用Nagios监视Windows主机,我们需要在远程Windows系统上安装NSClient ++。
NSClient ++(nscp)是必须部署在要监视的远程主机上的代理。
NSClient ++提供了多种检查系统的方法:

  • 获取系统运行状况(cpu,磁盘等)
  • 获取表演柜台
  • 检查日志文件
  • 检查计划任务等

a)配置Windows主机

在远程Windows主机上,我们需要安装nsclient ++。
我们可以从官方下载它。

我们已经下载了msi文件NSCP-0.5.0.62-x64.msi

安装和配置nsclient

启动安装过程。

在此步骤中,选择“下一步”。

在此步骤中,请自定义

指示用于网络访问的nagios服务器IP和nagios密码。
还要保留所有“启用”选项(检查插件,check_nt,check_nrpe,Web服务器,nsca客户端)和安全模式。

我们可以将密码保留为空白进行安装。
我们无需指明。

检查NSClient状态

现在已经安装了它,我们将通过打开services.msc来验证是否启动了NSClient服务。
现在搜索有关nsclient的信息,并验证其状态(必须处于运行状态)。
检查启动类型是否设置为“自动”

我们可以看到我们的插件正在运行。
现在我们可以配置nagios服务器端。

b)配置nagios服务器

在Nagios服务器上,我们需要定义新的Windows主机以监视其服务。

添加新的Windows主机定义

我们将通过修改“ /usr/local/nagios/etc/objects/windows.cfg”文件为要监视的Windows计算机添加新的主机定义。
对于我们的Linux主机,我们将Windows配置文件复制到我们先前创建的服务器目录中。

# cp /usr/local/nagios/etc/objects/windows.cfg /usr/local/nagios/etc/objects/servers/

通常,我们已经进入服务器上的“/usr/local/nagios/etc/objects/servers /”目录。
因此,我们将编辑Windows主机文件。

# vim windows.cfg###############################################################################
## HOST DEFINITIONS###############################################################################
# Define a host for the Windows machine we'll be monitoring
# Change the host_name, alias, and address to fit your situation
define host{
	use		windows-server	; Inherit default values from a template
	host_name	winserver	; The name we're giving to this host
	alias		My Windows Server	; A longer name associated with the host
	address		172.16.20.131	; IP address of the host
	}###############################################################################
## SERVICE DEFINITIONS###############################################################################
# Create a service for monitoring the version of NSCLient++ that is installed
# Change the host_name to match the name of the host you defined above
define service{
	use			generic-service
	host_name		winserver
	service_description	NSClient++ Version
	check_command		check_nt!CLIENTVERSION
	}

# Create a service for monitoring the uptime of the server
# Change the host_name to match the name of the host you defined above
define service{
	use			generic-service
	host_name		winserver
	service_description	Uptime
	check_command		check_nt!UPTIME
	}

尝试将某些内容作为上面的输出。
该输出已被截断。
该IP地址必须是Windows IP地址。
我们可以使用另一个host_name值。

默认情况下,在Windows主机文件中,它没有用于检查ping的服务定义,因此我们可以在文件末尾添加以下服务。
它是Linux主机文件中提供的默认check_ping服务。

define service{
        use                             generic-service         ; Name of service template to use
        host_name                       winserver
        service_description             PING
	check_command			check_ping!100.0,20%!500.0,60%
        }

请记住,我们已经指出了nagios密码保护。
在Windows计算机上的NSClient ++配置文件中指定密码后,我们需要通过修改commands.cfg文件来修改现有的check_nt命令定义以包括该密码。
因此,打开文件并研究相应的行,如下所示:

# vim /usr/local/nagios/etc/objects/commands.cfg
define command{
			command_name	check_nt
			command_line	$USER1$/check_nt -H $HOSTADDRESS$-p 12489 -s PASSWORD -v $ARG1$$ARG2$
			}

我们将需要更改check_nt命令的定义以包含关键字“ -s <PASSWORD>”,其中<PASSWORD>是我们在NSClient ++安装期间在Windows主机(本例中为nagios)中指定的nagios密码。

如果在NSClient安装过程中未指定密码,则可以跳过此步骤。
如果已设置密码并想要取消密码,则可以在命令提示符下使用记事本编辑NSClient文件,如下所示

然后像下面这样注释密码行

目前,我们无需在command.cfg文件中输入密码,可以跳过此步骤。

检查nagios配置文件并重新启动服务

既然我们已经完成了Windows主机的定义,现在我们可以检查一下nagios是否不计算任何错误。
我们应该注意到,我们甚至没有在nagios主配置文件'/usr/local/nagios/etc/nagios.cfg'中添加指令,因为我们已经在前面指出的服务器目录中编辑了Windows文件。
如果没有创建该目录,我们应该取消注释指令“ cfg_file =/usr/local/nagios/etc/objects/windows.cfg”

现在我们可以检查文件错误

# /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg
Nagios Core 4.3.2
Copyright (c) 2009-present Nagios Core Development Team and Community Contributors
Copyright (c) 1999-2009 Ethan Galstad
Last Modified: 2016-05-09
License: GPL
Website: https://www.nagios.org
Reading configuration data...
   Read main config file okay...
   Read object config files okay...
Running pre-flight check on configuration data...
Checking objects...
	Checked 27 services.
	Checked 3 hosts.
	Checked 1 host groups.
	Checked 0 service groups.
	Checked 1 contacts.
	Checked 1 contact groups.
	Checked 25 commands.
	Checked 5 time periods.
	Checked 0 host escalations.
	Checked 0 service escalations.
Checking for circular paths...
	Checked 3 hosts
	Checked 0 service dependencies
	Checked 0 host dependencies
	Checked 5 timeperiods
Checking global event handlers...
Checking obsessive compulsive processor commands...
Checking misc settings...
Total Warnings: 0
Total Errors:   0
Things look okay - No serious problems were detected during the pre-flight check

我们可以看到我们没有任何错误,并且已检测到新主机。
现在我们有3位房东

# systemctl restart nagios

访问nagios Web界面

现在可以打开nagios仪表板页面,以查看我们的新主机及其流程。

我们可以看到我们已经添加了Windows主机。

如果我们查看服务,则可以看到我们添加的check_ping。
我们尚未启动资源管理器,这就是为什么我们可以看到有关它的重要消息的原因。

现在,我们在nagios仪表板上添加了两个新服务器。