当前位置: 首页 > 工具软件 > Nagios > 使用案例 >

Nagios

万俟财
2023-12-01

Nagios

一、监控概述

1、为什么要监控

产品生命周期:调研阶段-设计阶段-开发阶段-测试阶段-运营阶段

​ 随着业务的发展,锁提供的产品规模越来越大,功能越来越多,架构越来越复杂,除了通过开发手段来提高产品的质量,还需要在产品的生产运行过程中来维护以提高产品的质量,这就需要时刻掌握产品的运行过程中所产生的数据(包括硬件设备、系统性能、软件运行、趋势数据等),根据对产品业务的熟悉程度,设定一定的指标,当出现指标异常的时候,就需要采取一定的手段来保障产品的持续运营,这就是需要监控的原因。

​ 有监控可以最大限度的避免问题。

2、监控原理

  • 监控方式

    • 硬件层面

      IPMI:智慧平台管理接口,是一种工业表中用于采集硬件设备的各种物理健康状态数据,如温度、电压、风扇工作状态、电源等。

    • 软件层面

      agent 专用客户端,专用的软件的一种应用机制

      ssh 系统中常见的一种通信机制,但是并非所有。

      SNMP 简单网络管理协议,是工作在各种网络设备中的一种机制。

  • 监控的流程

    实时监控:

    数据采集——>数据整理——>实时分析——>结果输出——>决策——>警告/修复(处理)——>数据存储

    非实时监控:

    数据采集——>数据整理——>数据存储——>离线分析——>结果输出——>决策——>警告/修复(处理)——>数据存储

    数据采集:根据业务的特性,采取多种方式,进行对一些针对性的数据进行采集

    数据整理:对上报后的数据源进行收集、清晰、整理

    实时分析:对某些重要的核心的业务数据进行实时分析

    离线分析:对普通的数据、非紧急的业务数据进行存储,后续进行响应的分析。

    结果输出:将分析后的数据结果展现出来,供决策参考。

    问题决策:根据当前业务情况,人工或者自动方式对输出的结构进行分析,并判定下一步的行动(告警或者修复),同时将其决策记录保存下来,以便为后续决策提供依据。

3、监控工具

  • 系统命令

    所有的监控方式,其收集数据的根本都是通过系统命令来实现的。

    分类:观测、评测、调优(通过不同的命令及参数实现对不同资源的监控)

  • 开源软件

    • smokeping,一款监控网络状态和稳定性的开源软件,常用于IDC数据机房的网络状况监控,如时延,丢包率等

      网站:https://oss.oetiker.ch/smokeping/

    • Cacti,一套基于PHP、MySQL、SNMP及rrdtool等软件的网络流量监测解决方案

      网站:https://www.cacti.net/

    • Nagios,一款企业级监控系统,能够基于多种方式(尤其是插件)对各种硬件和软件进行监控。适合用户群为复杂IT环境的企业,尤其是中小型企业

      网站:https://www.nagios.org/

    • Zabbix,是一套整合了Cacti和Nagios优点的企业级开源运维平台,简单易用,可以满足中小型企业的任何需求

      网站:https://www.zabbix.org/

    • Prometheus,是当今最为强大的开源云监控工具之一,提供了本地可视化引擎,还提供了集成第三方工具的定制功能,并提供一个API,用于将数据提供给外部软件使用。它是中大型企业和云原生环境非常好的监控解决方案

      网站:https://prometheus.io/

    • 等等

  • 第三方软件

    如监控宝,听云,阿里云监控,华为云监控等等

二、Nagios简介及部署

1、Nagios简介

  • Nagios基础知识

    Nagios诞生于1999年,是一个流行的开源的监控软件,它可以自由的检测各种主机和服务资源,当监控对象发生异常或者异常恢复的时候还能提醒指定的用户。

    最新版的Nagios主要有三大部分组成:Nagios XI、Nagios Log Server、Nagios Fusion

    官方网站:https://www.nagios.org/

    GitHub地址:https://github.com/NagiosEntherprises

    插件网站:http://www.nagiosplugins.org/

  • Nagios特点

    • 主要功能

      主机资源:主机类型(操作系统、路由器、交换机等)、日常指标(CPU load、disk usage、system logs)、其他指标(温度、警告、流量)

      服务资源:网络协议(SMTP、pop3、HTTP、SNMP、FTP、SSH、ICMP等)、相关服务(系统服务、关联服务、应用服务、日志服务、数据服务、网络流量等)

      表现样式:本地脚本方式、远程脚本方式、ssh方式、图形方式、告警方式等

    • Nagios的优势

      整体:借助于各种监控方式来实现IT基础设施的复杂的管理

      细节:实现和维护简单、告警方式多样,投入成本低,各类资源对象的综合利用效率高

    • Nagios的劣势

      整体:IT基础设施系统庞大,Nagios不能容纳一切

      细节:监控资源依赖于大量的脚本,监控方式需要自己定制化

  • Nagios原理

    • 软件组成

      最新版本是由三大部分组成,但学习的目标就是Nagios XI,也就是企业级的网络监控

      对于Nagios软件来说,主要有两部分组成:

      Nagios core:是Nagios软件能正常运行的支撑部分、通用部分、也是核心部分,主要负责管理

      Nagios plugins:是Nagios软件实现监控各种主机、服务资源的功能性部分,可自定义开发(搜集资源)常见的通信方式有:ssh、nrpe(linux、类Unix系统专用的监控机制)、snmp、NSCA(让Nagios被动接受各种监控数据机制)、第三方|自定义

      实现对其他远程主机的监控时还要有Daemon

    • 安装组件

      服务端:安装nagios core和nagios plugins即可,web(基于LAMP的环境做的)会在安装nagios core时自动安装,若是需要将Nagios的数据信息保存到数据库还需要额外安装NDOUtils

      客户端:

      • NRPE方式监控:Linux环境,被监控主机安装nrpe软件,plugins;windows环境安装NSClinet++软件,plugins
      • SNMP方式监控:监控主机启用SNMP,被监控主机安装SNMP,plugins
      • NSCA方式监控:被监控主机安装nsca软件,监控主机开启nsca服务
      • SSH方式监控:监控主机启用ssh插件即可,被监控主机安装sshd服务,plugins

2、Nagios部署-基础环境准备

安装系统,按Tab键编辑配置通过给内核传递参数配置网卡(net.ifnames=0 biosdevname=0),编辑完成后,按Enter

  • 网络环境

    [root@localhost ~]# systemctl stop NetworkManager
    [root@localhost ~]# systemctl disable NetworkManager
    
  • 安全配置

    [root@localhost ~]# systemctl stop firewalld
    [root@localhost ~]# systemctl disable firewalld
    [root@localhost ~]# firewall-cmd --state
    not running
    [root@localhost ~]# vim /etc/sysconfig/selinux 
    将enforcing替换成disabled
    或者用sed -i 's#=enforcing#=disabled#' /etc/selinux/config
    [root@localhost ~]# getenforce 
    
  • 环境主机名规划

    [root@localhost ~]# vim /etc/hosts
    10.0.0.151 nagios.itcast.com nagios
    [root@localhost ~]# hostnamectl set-hostname nagios
    [root@localhost ~]# exec /bin/bash
    [root@nagios ~]# ping -c 1 nagios
    
  • 基础软件安装

    • 安装依赖软件

      [root@nagios ~]# yum -y install wget yum-plugin-priorities
      
    • 安装软件源

      [root@nagios ~]# yum -y install epel*
      [root@nagios ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
      
    • 源优先级配置

      [root@nagios ~]# cat /etc/yum/pluginconf.d/priorities.conf 
      [main]
      enabled = 1
      然后编辑相应的repo文件,在想用的配置文件下增加priority=1
      
    • 检查

      [root@nagios ~]# yum repolist
      [root@nagios ~]# yum clean all
      [root@nagios ~]# yum makecache fast
      [root@nagios ~]# yum update -y
      用yum upgrade 进行验证
      
    • 禁止内核升级

      [root@nagios ~]# vim /etc/yum.conf
      exclude=kernel*
      exclude=centos-release*
      
    • 安装系统基础软件

      [root@nagios ~]# yum groupinstall "Compatibility Libraries" "Console Internet Tools" "Development Tools" "Security Tools" "System Administration Tools" -y
      [root@nagios ~]# yum -y install vim lrzsz telnet curl net-tools tree bash-completion
      
    • 时间同步

      [root@nagios ~]# yum -y install ntpdate
      [root@nagios ~]# whereis ntpdate
      ntpdate: /usr/sbin/ntpdate /usr/share/man/man8/ntpdate.8.gz
      [root@nagios ~]# crontab -e
      * */10 * * * /usr/sbin/ntpdate timel.aliyun.com >> /dev/null 2>&1
      

3、Nagios部署-web环境

  • 基础依赖包

    yum -y install autoconf bison bzip2-devel cmake curl-devel freetype-devel gcc gcc-c++ gd gd-devel gettext glibc-common libpng libpng-devel libjpeg-devel libxml2 libxml2-devel libevent libevent-devel libicu-devel libtool make ncurses-devel net-snmp net-snmp-utils net-snmp-devel openssl
    
    最精简的软件为:gcc gcc-c++ glibc glibc-common wget unzip httpd php gd gd-devel perl postfix
    
  • 安装基本软件

    [root@nagios ~]# yum -y install httpd httpd-devel mariadb mariadb-server mariadb-devel mariadb-libs php
    这里虽然无需安装mysql,但最好安装,因为后端会涉及到nagios监控mysql
    
  • mysql配置

    启动mysql并设为开机自启
    [root@nagios ~]# systemctl start mariadb
    [root@nagios ~]# systemctl enable mariadb
    基础配置
    [root@nagios ~]# mysql_secure_installation 
    将密码设置为123456
    
    修改服务端字符集
    [mysqld]
    init_connect='SET collation_connection = utf8_unicode_ci'
    init_connect='SET NAMES utf8'
    character-set-server=utf8
    collation_server=utf8_unicode_ci
    skip-character-set-client-handshake
    修改客户端字符集
    [root@nagios ~]# vim /etc/my.cnf.d/client.cnf
    [client]
    default-character-set=utf8
    [root@nagios ~]# vim /etc/my.cnf.d/mysql-clients.cnf
    [mysql]
    default-character-set=utf8
    
  • 调试apache和php

    • 启动Apache

      [root@nagios ~]# systemctl start httpd
      [root@nagios ~]# systemctl enable httpd
      
    • 修改配置文件

      <IfModule dir_module>
          DirectoryIndex index.php index.html
      </IfModule>
      
      <IfModule mime_module>
      AddType application/x-httpd-php .php
      </IfModule>
      
    • 创建测试页面

      [root@nagios ~]# echo '<?php phpinfo(); ?>' > /var/www/html/index.php
      [root@nagios ~]# systemctl restart httpd
      
    • 测试php页面

      打开浏览器访问:http://10.0.0.151

  • 调试php&mysql

    • 安装相关软件

      [root@nagios ~]# yum -y install php-mysql php-gd php-ldap php-odbc php-pear php-xml php-xmlrpc php-mbstring php-snmp php-soap php-bcmath
      
    • 创建测试页面进行测试

      <?php
      $link=mysql_connect('localhost','root','123456');
      if ($link)
      echo "Successfuly";
      else
      echo "Faile";
      mysql_close();
      ?>
      在浏览器访问测试页面
      
    • 用户管理

      [root@nagios ~]# useradd -s /sbin/nologin nagios
      [root@nagios ~]# groupadd nagcmd  #安装nagios软件时自动生成
      [root@nagios ~]# usermod -a -G nagcmd nagios 
      [root@nagios ~]# usermod -a -G nagcmd apache 
      注意:apache是默认的http用户,要用来展示nagios界面,因此要加入打nagcmd用户组中,这个组是nagios内置的一个组名,它和nagios相关的其他功能权限密切相关
      
      设置http的启动用户为nagios
      [root@nagios ~]# vim /etc/httpd/conf/httpd.conf 
      User nagios
      Group nagios
      [root@nagios ~]# systemctl restart httpd
      

4、安装nagios

  • 准备工作目录

    [root@nagios ~]# mkdir /data/{server/nagios,soft} -p
    /data/server为nagios服务目录
    /data/soft为插件目录
    [root@nagios ~]# chown -R nagios.nagios /data
    
  • 编译安装

    从官网下载软件包
    [root@nagios soft]# tar -xvf nagios-4.4.6.tar.gz 
    解压后进入安装目录进行编译
    [root@nagios nagios-4.4.6]# ./configure --prefix=/data/server/nagios --with-gd-lib=/usr/lib --with-gd-inc=/usr/include --with-nagios-user=nagios --with-nagios-group=nagcmd --with-command-user=nagios --with-command-group=nagcmd
    
    注意:--with-gd-lib和--with-gd-inc是我吗的基础依赖库,必须提前安装好,后续nagios拓扑图需要用到
    
    编译安装
    [root@nagios nagios-4.4.6]# make all
    [root@nagios nagios-4.4.6]# make install
    安装控制脚本
    [root@nagios nagios-4.4.6]# make install-init
    调配置文件的访问权限
    主要是用来配置nagios的目录结构的整体访问权限
    [root@nagios nagios-4.4.6]# make install-commandmode
    安装配置信息
    该步主要是将nagios示例配置文件安装到指定路径下
    [root@nagios nagios-4.4.6]# make install-config
    部署网站配置
    在httpd配置文件目录下生成一个有关nagios的配置文件
    若是不执行此步,后续访问nagios时会报错404
    [root@nagios nagios-4.4.6]# make install-webconf
    部署web页面格式
    [root@nagios nagios-4.4.6]# make install-exfoliation
    
  • 环境变量配置

    [root@nagios nagios-4.4.6]# vim /etc/profile.d/nagios.sh   #文件在profile.d目录下会在系统启动时自动执行
    # nagios env set
    export NAGIOS_HOME=/data/server/nagios
    export PATH=$NAGIOS_HOME/bin:$NAGIOS_HOME/libexec:$PATH
    [root@nagios nagios-4.4.6]# chmod +x /etc/profile.d/nagios.sh 
    [root@nagios nagios-4.4.6]# source /etc/profile.d/nagios.sh 
    
  • nagios环境测试

    [root@nagios nagios-4.4.6]# nagios --version
    

5、安装插件

  • 使用安装包默认的插件

    默认的插件在libexec目录下
    [root@nagios nagios-4.4.6]# cp -R /data/soft/nagios-4.4.6/contrib/eventhandlers/ /data/server/nagios/libexec/
    [root@nagios nagios]# chown -R nagios.nagios /data/server/nagios/libexec/eventhandlers/
    
  • 使用专用的插件

    插件网站:http://www.nagiosplugins.org/
    在官网下载插件安装包然后解压(插件版本与nagios版本关联不大)
    [root@nagios soft]# tar -xvf nagios-plugins-2.3.3.tar.gz 
    编译
    [root@nagios nagios-plugins-2.3.3]# ./configure --prefix=/data/server/nagios --with-nagios-user=nagios --with-nagios-group=nagcmd --enable-perl-modules --enable-redhat-pthread-workaround
    编译安装
    [root@nagios nagios-plugins-2.3.3]# make
    [root@nagios nagios-plugins-2.3.3]# make install
    [root@nagios libexec]# chown -R nagios.nagcmd /data/server/nagios
    

6、启动监控服务

  • 配置web

    安装完nagios后,他会自动在http的conf.d目录下生成nagios配置文件/etc/httpd/conf.d/nagios.conf

    一般情况下要让nagios的web监控界面必须经过授权才能访问,在nagios.conf文件中也增加验证配置,验证信息如下:

    
    ScriptAlias /nagios/cgi-bin "/data/server/nagios/sbin"
    
    <Directory "/data/server/nagios/sbin">
    ......
    
             AuthUserFile /data/server/nagios/etc/htpasswd.users
             Require valid-user
    
    
  • 权限管理

    配置web管理界面,创建用户名和密码
    [root@nagios ~]# htpasswd -cb /data/server/nagios/etc/htpasswd.users nagiosadmin nagiosadmin
    Adding password for user nagiosadmin
    [root@nagios ~]# cat /data/server/nagios/etc/htpasswd.users 
    nagiosadmin:$apr1$KMp5qcyG$zWAby7ufJ/ZcammW0WWRH0
    
  • 启动nagios

    [root@nagios ~]# systemctl start nagios
    [root@nagios ~]# systemctl enable nagios
    浏览器访问http://10.0.0.151/nagios
    
  • 界面介绍

    Nagios的访问页面主要有两部分组成:菜单栏和详情栏

    菜单栏:

    主要显示 Nagios的各种功能作用,主要由四部分组成:全局信息、当前状态、统计报告和系统管理

    详情栏:

    当我们选择左侧菜单栏的指定功能时候,用于显示相应的详情信息。

三、本地监控

1、目录结构及配置文件

  • 目录结构

    [root@nagios ~]# tree /data/server/nagios/ -L 1
    /data/server/nagios/
    ├── bin				# Nagios 可执行程序所在目录	
    ├── etc				# Nagios 配置文件目录
    ├── include			# 依赖的文件目录,默认是空目录
    ├── libexec			# Nagios 外部插件存放目录
    ├── sbin				# Nagios cgi 文件所在目录, 也就是执行外部 命令所需要文件所在的目录
    ├── share				# Nagios 网页存放路径
    └── var				# Nagios 日志文件、Lock 等文件所在的目录
    
    

    注意:

    var目录下还有四个常见的子目录:archives-日志归档目录、rrd-图形文件目录、rw-外部命令文件目录、spool-检查报告目录

  • 配置文件

    [root@nagios ~]# tree /data/server/nagios/etc/
    /data/server/nagios/etc/
    ├── cgi.cfg						# 控制 CGI 访问的配置文件
    ├── htpasswd.users				# 认证文件
    ├── nagios.cfg					# 主配置文件
    ├── objects						# 资源对象
    │   ├── commands.cfg					# 命令资源
    │   ├── contacts.cfg					# 联系人资源
    │   ├── localhost.cfg				# 本地主机资源
    │   ├── printer.cfg					# 打印机资源
    │   ├── switch.cfg					# 路由、交换机资源
    │   ├── templates.cfg				# 模板资源
    │   ├── timeperiods.cfg				# 时间段资源
    │   └── windows.cfg					# windows资源
    └── resource.cfg					# 全局资源配置文件
    注意:
    Nagios的配置文件主要有三个:cgi.cfg、nagios.cfg、resource.cfg
    Nagios的资源对象默认有八个:命令、联系人、本地主机、打印机、交换机、模板、时段、windows
    Nagios默认的资源文件是可以自由定制的,不一定必须是这8个,我们可以在该objects目录下随意定制,所有的文件都可以单独拆分,但一定要在主配置文件 nagios.cfg 中加载使用。
    

2、配置详解

  • 核心配置文件

    nagios.cfg

    权限相关
    nagios_user				服务的用户
    nagios_group			服务的用户组
    
    关键指令:
    log_file				日志文件
    cfg_file				外置配置文件
    cfg_dir					外置配置目录
    resource_file			全局变量文件
    status_file				状态数据文件
    command_file			检测命令、权限文件
    
    
  • 全局变量配置文件

    resource.cfg

    在最新版的4.4.6中,它默认支持256个全局变量,默认情况下,该文件只设置了一个全局变量

    [root@nagios nagios]# egrep -v '^$|#' /data/server/nagios/etc/resource.cfg
    $USER1$=/data/server/nagios/libexec
    

    常见的内置变量

    主机宏
    $HOSTNAME$  		主机名					$HOSTADDRESS$  			主机地址
    $HOSTDISPLAYNAME$	主机全名					$HOSTSTATE$				主机状态
    $HOSTGROUPNAMES$	主机组名					$LISTHOSTSTATE$			上次检查主机状态
    $LASTHOSTCHECK$		上次主机检查时间戳
    服务宏
    $SERVICESTATE$ 		服务状态描述				$SERVICEDESC$   			服务描述信息  
    $SERVICEGROUPNAMES$	服务组名称
    联系人宏
    $CONTACTNAME$   		联系人名称				$CONTACTALIAS$			联系人全名
    $CONTACTEMAIL$		联系人邮件				$CONTACTGROUPNAMES$		联系人组信息
    通知宏
    $NOTIFICATIONTYPE$ 	通知信息
    日期/时间宏
    $LONGDATETIME$  	日志时间戳				
    文件宏
    $LOGFILE$  			日志文件位置				$MAINCONFIGFILE$  		主配置文件位置
    其他宏
    $ADMINEMAIL$  		管理员邮件地址			$ARGn$  					第n个参数
    
  • 接口配置文件

    cgi.cfg

    目标:web页面相关信息

    内容:核心配置文件,web认证信息

    常见的指令
    main_config_file							主配置文件
    physical_html_path							web界面的绝对路径
    url_html_path								web界面的url关键字
    authorized_for_xxx							相关认证用户
    

3、核心资源

  • 命令资源文件

    commands.cfg

    配置样式:

    # "命令"对象,用于描述如何对指定目标对象进行状态检测
    define command {
        command_name    check_local_disk
        command_line    $USER1$/check_disk -w $ARG1$ -c $ARG2$ -p $ARG3$
    }
    

    配置详解:

    配置框架:define command { … }

    这个文件中只有两个配置项command_name(命令名)和command_line(命令内容)

    command_name 是全局唯一的,不允许重名的

    command_line 在编写命令的时候,尽量都用变量来表示,如果涉及到系统命令,尽量用绝对路径,这里定义好的命令可以在其他资源对象文件中使用,主要在localhost.cfg中的service使用

    注意:

    command_line 里面用到的脚本文件必须可执行

    命令示例:-w 3000.0,80% -c 5000.0,100% -p 5

    逗号后面的80%和100% 用于表示相应的临界值,-w即"WARNING"状态,-c即"CRITICAL"状态

    -p 5 说明每次探测发送5个数据包

    依赖关系:

    该文件用到了 resource.cfg 文件中定义的内容

  • 本机资源文件

    localhost.cfg

    配置示例:

    # "主机"指的是被监控的机器,可是物理主机,也可以是虚拟设备
    define host {
        use                     	linux-server   
        host_name               	localhost
        alias                   	localhost
        address                 	127.0.0.1
    }
    
    # "主机组"由多个主机对象组成,members属性用于设定多个主机,彼此间使用逗号隔开
    define hostgroup {
        hostgroup_name          	linux-servers  
        alias                   	Linux Servers  
        members                 	localhost      
    }
    
    # "服务"就是指定"主机"所提供的功能或资源对象,如mysql服务、存储资源或CPU负载等。
    define service {
        use                     	local-service  
        host_name               	localhost
        service_description     	PING
        check_command           check_ping!100.0,20%!500.0,60%
    }
    

    配置详解:

    主机信息配置框架: define host { … }

    主机组信息配置框架: define hostgroup { … }

    服务信息配置框架: define service { … }

    host和hostgroup中的名称必须唯一

    service中的use所指定的模板信息必须存在,

    service_description 不要求全局唯一,但是必须在某台主机上的服务名称是唯一的

    service中的check_command中的命令必须是commands.cfg定义的,该命令所使用的的参数使用"!%“来括住,定义的command如果有三个参数($ARGS)那么就在连续写三个”!%"

    注意:

    只有host配置定义好后,才能定义hostgroup

    只有host和command定义好后,才能定义service

    依赖关系:

    该文件使用到了 commands.cfg 文件中定义好的命令

    隐藏框架:

    在localhosts.cfg文件中工作使用过程中,还会存在一种服务组信息框架,样式如下:

    # "服务组"由多个服务对象组成
    define servicegroup{
         servicegroup_name  	webservices
         alias 				All services   
         members            host,service,host2,service2,... 
    }
    

4、简单案例

我们从 案例需求、需求分析、命令资源文件、目标资源文件、加载配置、效果验证、内容梳理 七个方面来学习。

案例需求

我们尝试做一个监控存活主机的案例,nagios默认监控的localhost,我们就使用localhost的主机ip来进行检测一下。

需求分析

1 检测命令配置

2 目标主机配置

3 配置文件生效

4 测试效果

命令资源文件

在nagios的默认command.cfg文件中已经有了一个检查主机存活状态的命令,我们模仿一个命令

define command {

    command_name    check_host_alive
    command_line    $USER1$/check_ping -H $HOSTADDRESS$ -w $ARG1$ -c $ARG2$ -p 5
}

目标资源文件

编写主机+服务资源文件

[root@nagios nagios]# vim etc/objects/hosts.cfg
define host {
    use                     linux-server
    host_name               nagios.itcast.com
    alias                   nagios.itcast.com
    address                 10.0.0.151
}

define hostgroup {
    hostgroup_name          nagios-servers
    alias                   Nagios Servers
    members                 nagios.itcast.com
}

define service {
    use                     local-service
    host_name               nagios.itcast.com
    service_description     host_alive
    check_command        check_host_alive!100.0,20%!500.0,60%
}

加载配置文件

编辑nagios的主配置文件,将我们刚才设置的配置文件加载到nagios管理中

[root@nagios nagios]# vim etc/nagios.cfg 
cfg_file=/data/server/nagios/etc/objects/hosts.cfg
检查配置文件是否生效
[root@nagios nagios]# nagios -v etc/nagios.cfg 
Total Warnings: 0
Total Errors:   0

重启nagios服务,检查效果

监控的流程:

1 定义命令资源文件 – 服务检查项的检测命令

2 定义目标资源文件 – 主机、主机组、服务

3 加载目标资源文件 – 在nagios主配置文件导入我们定义好的资源文件、并进行相关的语法检查

4 测试监控案例效果 – 通过浏览器方式来检查我们刚才操作的内容是否生效

资源定义文件:

资源定义文件彼此间是有关联和依赖关系的,在我们刚才的简单案例中就出现了三处依赖:

服务资源和命令资源的依赖关系

命令资源和插件文件的依赖关系

监控资源文件和nagios主文件之间的依赖关系

虽然我们的简单案例中的依赖数量有限,但是我们通过这一点也可以明确的感觉到,在实际的工作中,这些依赖的程度绝对会远远超出我们的想象。

所以,为了之后我们的工作正常稳定运行,我们在编写文件的过程中,不但要确保本资源的重要属性是正确的,还必须保证我们依赖的文件内容是ok的。

5、监控mysql

案例需求

我们自定义监控一个mysql服务,然后将本机内部已经存在的服务划归到两个不同的server组中

检查mysql服务的专用脚本是 /data/server/nagios/libexec/check_mysql,执行方式

[root@nagios libexec]# check_mysql -H 127.0.0.1 -P 3306 -u root -p 123456
Uptime: 171795  Threads: 1  Questions: 6  Slow queries: 0  Opens: 0  Flush tables: 2  Open tables: 26  Queries per second avg: 0.000|Connections=12c;;; Open_files=21;;; Open_tables=26;;; Qcache_free_memory=0;;; Qcache_hits=0c;;; Qcache_inserts=0c;;; Qcache_lowmem_prunes=0c;;; Qcache_not_cached=0c;;; Qcache_queries_in_cache=0;;; Queries=7c;;; Questions=6c;;; Table_locks_waited=0c;;; Threads_connected=1;;; Threads_running=1;;; Uptime=171795c;;;

注意:

mysql的专用检测插件是 check_mysql,帮助信息,可以直接使用 check_mysql --help来查看

需求分析

1 检测命令配置

2 目标主机配置

3 配置文件生效

4 测试效果

命令资源文件

在nagios的默认command.cfg文件中已经有了一个检查主机存活状态的命令,我们模仿一个命令

[root@nagios nagios]# vim etc/objects/commands.cfg 
define command {

    command_name    check_mariadb
    command_line    $USER1$/check_mysql -H $HOSTADDRESS$ -P $ARG1$ -u $ARG2$ -p $ARG3$
}

目标资源文件

定义服务资源文件

我们将服务相关的 配置从hosts.cfg文件中剥离出去,单独创建一个services.cfg文件。

[root@nagios nagios]# vim etc/objects/services.cfg
define service {
    use                     local-service
    host_name               nagios.itcast.com
    service_description     check_mariadb
    check_command           check_mariadb!3306%!root%!123456%
}

define servicegroup{
     servicegroup_name          app-services
     alias                      App-services
     members                    nagios.itcast.com,check_mariadb
}

define servicegroup{
     servicegroup_name          host-services
     alias                      Host-services   
     members               nagios.itcast.com,host_alive
}

注意:

servicegroup 的 members的内容服务列表,内容格式是:主机名,服务名。

如果多个服务在一起,格式就是: 主机名1,服务名1,主机名2,服务名2,主机名3,服务名3,…

加载配置文件

编辑nagios的主配置文件,将我们刚才设置的配置文件加载到nagios管理中

[root@nagios nagios]# vim etc/nagios.cfg 
cfg_file=/data/server/nagios/etc/objects/services.cfg
检查配置文件是否生效
[root@nagios nagios]# nagios -v etc/nagios.cfg 

重启nagios服务,检查效果

6、原理详解

监控原理

Nagios 软件在部署的时候,其实包含两部分:服务端和客户端。服务端部署的机器我们称之为监控中心(Server),用于管理各种收集到的监控数据;被监控的主机或服务资源我们称之为被监控端(Agent),用于获取各种资源的具体数据。Server和Agent彼此间通过一个专用的方式进行通信,这个通信方式由NRPE软件软件来实现。

Agent端通过各种方式(主要是插件)获取指定的资源的状态数据,然后通过专用的通信方式传输给Server端,Server端内部维护一个队列用于接受这些监控的状态数据,并保证它们可以按顺序的处理下去,如果被处理的监控状态数据出现问题或者恢复正常,Server段会根据内部的配置属性进行处理(报警或者自己处理)。所有的处理结果信息都会在一个Web界面上展示。

处理的结果信息根据监控资源对象的不同主要包含两类:服务通知样式和主机通知样式:

服务(6):w-warn警告,u-unknown未知,c-critical紧急,r-recover|ok恢复,f-flapping波动,s-scheduled调度

主机(5):d-down停止,u-unreachable未到达,r-up正常,f-flapping波动,s-scheduled调度

注意:

具体信息见 nagios.cfg文件的"SET SERVICE/HOST STATUS"部分

原理详解

根据监控数据的获取方式不同,Nagios的监控主要有两种方式:主动监控和被动监控。主动动监控就是服务端指挥插件来获取相应数据并返回给服务端,被动监控就是客户端使用插件来获取相应数据然后传输给服务端。

监控原理
组成:服务端 客户端
流程:
1 客户端收集数据
2 服务端接受数据
3 服务端整理分析数据
4 服务端展示数据
方法: 报警、图形、等
处理的结果信息根据监控资源对象的不同主要包含两类:服务通知样式和主机通知样式
服务(6):w-warn警告,u-unknown未知,c-critical紧急,r-recover|ok恢复,f-flapping波动,s-scheduled调度
主机(5):d-down停止,u-unreachable未到达,r-up正常,f-flapping波动,s-scheduled调度
注意:
这些内容都在我们的nagios配置文件中可以定义的。
原理详解
分类:
主动监控
服务端,指挥客户端去收集数据,然后返回
被动监控
客户端主动收集数据,然后传输给服务端。
主动监控:
核心:
基于本地/data/server/nagios/libexec目录下面的插件去获取相关的数据。
其他监控插件:
check_ping 、check_mysql 、check_http、check_tcp、

7、http监控

案例需求

我们使用check_http插件以http的方式来,监控一个http服务,然后将其划归到App-services组中

check_http的模块文件在 /data/server/nagios/libexec/ 目录下,其帮助信息如下:

[root@nagios libexec]# check_http --help
...
Usage:
 check_http -H <vhost> | -I <IP-address> [-u <uri>] [-p <port>]

[root@nagios libexec]# check_http -I 10.0.0.151
HTTP OK: HTTP/1.1 200 OK - 59034 bytes in 0.003 second response time |time=0.002534s;;;0.000000 size=59034B;;;0

-H 指定的是 /etc/hosts文件中ip对应的主机名解析记录

-u 指定的是一条uri的地址,比如"/index.html"

需求分析

1 检测命令配置

2 目标主机配置

3 配置文件生效

4 测试效果

命令资源文件

在nagios的默认command.cfg文件中已经有了一个检查主机存活状态的命令,我们模仿一个命令


define command {

    command_name    check_http_alive
    command_line    $USER1$/check_http -I $ARG1$ -p $ARG2$
}

目标资源文件

定义服务资源文件,在services.cfg文件中添加http,并将这个服务加入到app服务组中

define service {
    use                     local-service
    host_name               nagios.itcast.com
    service_description     check_http_alive
    check_command           check_http_alive!10.0.0.151!80
}

define servicegroup{
     servicegroup_name          app-services
     alias                      App-services
     members                    nagios.itcast.com,check_mariadb,nagios.itcast.com,check_http_alive
}

加载配置文件

检查nagios的主配置文件,保证我们刚才设置的配置文件被nagios管理

检查配置文件是否生效

[root@nagios nagios]# nagios -v etc/nagios.cfg 

重启nagios服务

域名监控

案例需求

将检查的方式更改为域名方式

检查命令提示:check_http -H 域名

[root@nagios libexec]# check_http -H nagios.itcast.com
HTTP OK: HTTP/1.1 200 OK - 59307 bytes in 0.004 second response time |time=0.003761s;;;0.000000 size=59307B;;;0

基本步骤不变,依次更改配置文件

命令资源文件

[root@nagios nagios]# vim etc/objects/commands.cfg 
define command {

    command_name    check_http_domain
    command_line    $USER1$/check_http -H $ARG1$
}

目标资源文件

[root@nagios nagios]# vim etc/objects/services.cfg 
define service {
    use                     local-service
    host_name               nagios.itcast.com
    service_description     check_apache_domain
    check_command           check_http_domain!nagios.itcast.com
}

define servicegroup{
     servicegroup_name          app-services
     alias                      App-services
     members                    nagios.itcast.com,check_mariadb,nagios.itcast.com,check_http_alive,nagios.itcast.com,check_apache_domain
}

检查配置文件是否生效

重启nagios

uri监控

案例需求

将检查的方式更改为uri方式

检查命令提示:check_http -H 域名 -u /path/to/uri

[root@nagios libexec]# check_http -H nagios.itcast.com -u /index.php
HTTP OK: HTTP/1.1 200 OK - 59334 bytes in 0.004 second response time |time=0.003654s;;;0.000000 size=59334B;;;0

注意:

如果是包含特殊字符的uri地址,我们应该使用 “/path/to/uri” 形式

基本步骤不变,依次更改配置文件

命令资源文件

define command {

    command_name    check_http_uri
    command_line    $USER1$/check_http -H $ARG1$ -u $ARG2$
}

目标资源文件

define service {
    use                     local-service
    host_name               nagios.itcast.com
    service_description     check_apache_uri    check_command           check_http_uri!nagios.itcast.com!/index.php
}   
define servicegroup{
     servicegroup_name          app-services
     alias                      App-services
     members                    nagios.itcast.com,check_mariadb,nagios.itcast.com,check_http_alive,nagios.itcast.com,check_apache_domain,nagios.itcast.com,check_apache_uri
}

检查配置文件是否生效

重启nagios

8、告警配置

联系人资源文件 contacts.cfg

配置样式:

我们以contacts.cfg文件默认的内容为例

# "联系人"对象用于定义指定nagios警告时候的通知对象信息。
define contact {
    contact_name          	nagiosadmin
    use                     	generic-contact
    alias                   	Nagios Admin
    email                   	nagios@localhost  #******
}

# "联系人组"由多个联系人对象构成
define contactgroup {
    contactgroup_name       	admins
    alias                   	Nagios Administrators
    members                 	nagiosadmin
}

配置详解:
联系人配置框架:define contact { ... }
联系人组配置框架:define contactgroup { ... }
contact_name 和 contactgroup_name 表示的是名称缩写,而且必须全局唯一,alias 表示的是全称
use 表示的是联系人基本信息所采用的模板样式,重复的信息可以继承
email	联系人的专用通信地址
members	表示有多少人在同一个组内,组员之间使用逗号隔开

依赖关系:
该文件用到了 templates.cfg 文件中定义的内容

模板资源文件 templates.cfg

配置示例:

我们以templates.cfg文件默认的内容为例

# "联系人"对象用于定义指定nagios警告时候的通知对象的通用信息。
define contact {
    name                            generic-contact         
    service_notification_period     24x7      			# timeperiods.cfg中定义好的规格          
    host_notification_period        24x7 					# 同上                   
    service_notification_options    w,u,c,r,f,s      	# 服务的通知样式     
    host_notification_options       d,u,r,f,s         	# 主机的通知样式      
    service_notification_commands   notify-service-by-email 	# 服务的检测命令   ******
    host_notification_commands      notify-host-by-email   		# 主机的检测命令   ******
    register                        0                       
}

# "主机"对象用于定义指定主机目标的通用属性信息。
define host {
    name                            generic-host
    notifications_enabled           1           
    event_handler_enabled           1           
    flap_detection_enabled          1           
    process_perf_data               1           
    retain_status_information       1           
    retain_nonstatus_information    1           
    notification_period             24x7       			# timeperiods.cfg中定义好的规格       
    register                        0           
}

# "服务"对象用于定义指定服务资源通用的监控属性。
define service {
    name                            generic-service
    active_checks_enabled           1              
    passive_checks_enabled          1              
    parallelize_check               1              
    obsess_over_service             1              
    check_freshness                 0              
    notifications_enabled           1              
    event_handler_enabled           1              
    flap_detection_enabled          1              
    process_perf_data               1              
    retain_status_information       1              
    retain_nonstatus_information    1              
    is_volatile                     0              
    check_period                    24x7             		# timeperiods.cfg中定义好的规格    ******
    max_check_attempts              3           			# 最大检查次数   ******
    check_interval                  10             			# 检查间隔
    retry_interval                  2              
    contact_groups                  admins         			# contacts.cfg中定义好的规格
    notification_options            w,u,c,r        
    notification_interval           60             #******
    notification_period             24x7       			# timeperiods.cfg中定义好的规格    *****      
    register                        0              
}


配置详解:
联系人信息配置框架: define contact { ... }
主机信息配置框架: define host { ... }
服务信息配置框架: define service { ... }
name表示模板的名称,必须是全局唯一的,不能有重复的内容
check_period	表示默认的检查间隔
注意:
在模板中配置的一般都是通用的|共用的|基础的属性信息
服务通知样式:w-warn警告,u-unknown未知,c-critical紧急,r-recover|ok恢复,f-flapping波动,s-scheduled调度
主机通知样式:d-down停止,u-unreachable未到达,r-up正常,f-flapping波动,s-scheduled调度
register   0  是一个模板的标识,如果没有该字段,就表明该模板是一个继承的模板
依赖关系:
该文件用到了 contacts.cfg、timeperiods.cfg、commands.cfg 三个文件中定义的内容
check_period 和 notification_period 指定的名称是模板文件中定义好的规格

注意:
如果涉及到经常变动的内容,就不要放到模板文件中。

隐藏框架

在模板文件中还有一种继承时候用到的一种模板框架,格式如下

# host模板继承:继承一般在对象定义文件中使用Use继承
define host{
       use                     	generic-server
       host_name               localhost      
       alias                   	localhost      
       address                 	127.0.0.1      
       contact_groups         linux-admins  
}

注意:

一个对象在定义时可以继承多个模板,use指定的后面多写几个模板名即可,彼此间用逗号隔开即可

时段资源文件 timeperiods.cfg

配置示例:

我们以timeperiods.cfg文件默认的内容为例

# "时段"用于定义某"操作"执行或暂停的时间间隔
define timeperiod {
    name                    24x7
    timeperiod_name         24x7
    alias                   24 Hours A Day, 7 Days A Week

    sunday                  00:00-24:00
    monday                  00:00-24:00
    tuesday                 00:00-24:00
    wednesday               00:00-24:00
    thursday                00:00-24:00
    friday                  00:00-24:00
    saturday                00:00-24:00
}


配置详解:
时段属性配置框架:define timeperiod { ... }
这里面配置的都是一些时间段的格式属性

依赖关系:

该文件没有依赖其他文件

告警流程

contacts.cfg – templates.cfg – (timeperiods.cfg + commands.cfg)

收集信息 services.cfg 文件调用 commands.cfg 检测命令
报警机制 contacts.cfg 文件调用 templates.cfg的generic-contact模板中的 notify-service-by-email 和 notify-host-by-email
发送警告commands.cfg文件中的邮件发送命令将信息发送给 contacts.cfg 文件中的 email

9、邮件告警

在nagios监控服务器上想要使用告警功能,可以结合linux系统自带的sendmail服务,需对系统的sendmail进行配置,也就是说,在nagios告警的时候,不仅仅需要,开启nagios配置文件中相应的属性配置,命令资源必须正确,还需要底层的sendmail服务正常。

需求分析

1 配置系统sendmail服务

2 配置报警命令资源

3 配置nagios联系人

4 综合测试

部署sendmail

安装sendmail并启动

[root@nagios nagios]# yum install mailx sendmail -y
[root@nagios nagios]# systemctl start sendmail
[root@nagios nagios]# systemctl enable sendmail

权限配置

为了避免在某些情况下,由于用户权限相关的原因,导致在发送邮件的时候出现问题应该给邮件专用的目录添加权限

sendmail 默认一般只让root使用,非root用户无法访问 /var/spool/mqueue和/var/spool/clientmqueue/

[root@nagios nagios]# chmod +x /var/spool/mqueue -R
[root@nagios nagios]# chmod +x /var/spool/clientmqueue -R

发件信息配置

vfjkehdhmkxmcide
[root@nagios nagios]# vim /etc/mail.rc 
set from=3330332775@qq.com
set smtp=smtp.qq.com
set smtp-auth-user=3330332775@qq.com
set smtp-auth-password=vfjkehdhmkxmcide   #邮箱的smtp授权码
set smtp-auth=login

重启服务进行测试

[root@nagios nagios]# systemctl restart sendmail
[root@nagios nagios]# echo "hello word" | mail -s "test" 3330332775@qq.com
前往邮箱查看

配置命令资源

修改命令资源文件内容

默认的配置中用的是sendmail命令,但是测试不成功,我需要修改一下,将默认的/usr/sbin/sendmail更改为/usr/bin/mail

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/bin/mail -s "** $NOTIFICATIONTYPE$ Host Alert: $HOSTNAME$ is $HOSTSTATE$ **" $CONTACTEMAIL$
}



define command {

    command_name    notify-service-by-email
    command_line    /usr/bin/printf "%b" "***** Nagios *****\n\nNotification Type: $NOTIFICATIONTYPE$\n\nService: $SERVICEDESC$\nHost: $HOSTALIAS$\nAddress: $HOSTADDRESS$\nState: $SERVICESTATE$\n\nDate/Time: $LONGDATETIME$\n\nAdditional Info:\n\n$SERVICEOUTPUT$\n" | /usr/bin/mail -s "** $NOTIFICATIONTYPE$ Service Alert: $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$ **" $CONTACTEMAIL$
}

联系人配置

修改nagios的联系人资源配置文件,修改为我们自己能接收到邮件的地址

define contact {

    contact_name            nagiosadmin             ; Short name of user
    use                     generic-contact         ; Inherit default values from generic-contact template (defined above)
    alias                   Nagios Admin            ; Full name of user
    email                   3330332775@qq.com ; <<***** CHANGE THIS TO YOUR EMAIL ADDRESS ******
}

注意:

如果需要配置多个邮箱的话,可以直接写多个邮箱地址,彼此间用空格隔开就可以了

邮箱地址一定要正确,提前测试应该成功

加载配置文件

配置文件中已加载

检查配置文件是否生效

重启nagios服务

检查效果

我们可以基于手工或者触发配置失败来,模拟故障。

触发配置:点开任意一个Serveice界面,然后点击右侧"Send custom service notification"

手工配置:将某个服务临时关闭,查看效果

浏览器打开邮箱网页后,稍等一会,就可以看到邮件通知效果

10、其他配置

打印机资源文件 printer.cfg

配置示例:

我们以printer.cfg文件默认的内容为例

define host {
    use                     generic-printer      
    host_name               hplj2605dn           
    alias                   HP LaserJet 2605dn   
    address                 192.168.1.30         
    hostgroups              network-printers     
}

define hostgroup {
    hostgroup_name          network-printers     
    alias                   Network Printers     
}

define service {
    use                     generic-service      
    host_name               hplj2605dn           
    service_description     Printer Status       
    check_command           check_hpjd!-C public 
    check_interval          10                   
    retry_interval          1                    
}


配置详解:
主机信息配置框架: define host { ... }
主机组信息配置框架: define hostgroup { ... }
服务信息配置框架: define service { ... }

依赖关系:
该文件用到了 commands.cfg、templates.cfg 两个文件中定义的内容

交换机资源文件 switch.cfg

配置示例:

我们以switch.cfg文件默认的内容为例

define host {
    use                     generic-switch                
    host_name               linksys-srw224p               
    alias                   Linksys SRW224P Switch        
    address                 192.168.1.253                 
    hostgroups              switches                      
}

define hostgroup {
    hostgroup_name          switches                      
    alias                   Network Switches              
}

define service {
    use                     generic-service               
    host_name               linksys-srw224p               
    service_description     PING                          
    check_command           check_ping!200.0,20%!600.0,60%
    check_interval          5                             
    retry_interval          1                             
}


配置详解:
主机信息配置框架: define host { ... }
主机组信息配置框架: define hostgroup { ... }
服务信息配置框架: define service { ... }

依赖关系:
该文件用到了 commands.cfg、templates.cfg 两个文件中定义的内容

windows资源文件 windows.cfg

配置示例:

我们以windows.cfg文件默认的内容为例

define host {
    use                     windows-server          
    host_name               winserver               
    alias                   My Windows Server       
    address                 192.168.1.2             
}

define hostgroup {
    hostgroup_name          windows-servers         
    alias                   Windows Servers         
}

define service {
    use                     generic-service
    host_name               winserver
    service_description     NSClient++ Version
    check_command           check_nt!CLIENTVERSION
}

配置详解:
主机信息配置框架: define host { ... }
主机组信息配置框架: define hostgroup { ... }
服务信息配置框架: define service { ... }

依赖关系:
该文件用到了 commands.cfg、templates.cfg 两个文件中定义的内容

11、配置角色

配置角色

根据我们刚才对配置文件和资源对象文件的学习,我们知道,nagios要做一个监控动作,涉及到相互关联着的七种角色,虽然他们分散在八个不同的资源对象文件中,但是我们可以找到他们之间的关联关系。

默认角色:

host、hostgroup、service、context、contactgroup、timeperiod、command

隐藏角色:

servicegroup、hostdependency、servicedependency

依赖资源

在学习资源对象文件的过程中,我们已经知道了这些资源对象之间是有相互依赖的关系的,为了更好的描述他们之间的依赖关系,我们使用两个名词来描述他们之间的依赖关系:

master|父对象:被依赖的主机或服务

dependent|子对象:依赖于master的资源对象

由于依赖关系主要出现在主机和服务中,所以有两种框架专门来描述他们,示例如下:

# 主机资源依赖关系
define hostdependency{
    dependent_host_name             	backuphost    
    host_name                       	backuphost    
    dependency_period               	nginxproxy      	# 依赖的主机    
    execution_failure_criteria      	c,u           
    notification_failure_criteria   	c,u,w         
}

# 服务资源依赖关系
define servicedependency{
       host_name                       		nginxproxy   
       service_description             	nginxproxy         
       dependent_hostgroup_name        	webservers 
       dependent_service_description   	webservice    
       execution_failure_criteria      	c,u           
       notification_failure_criteria   	c,u,w         
}

角色分类

站在监控业务流程的角度,我们将这些角色可以分为以下四类:

目标:定义哪些主机|主机组、服务可以进行监控

host-主机、hostgroup-主机组、service-服务、servicegroup-服务组

方法:定义哪些命令可以用于监控目标

command-命令

时间:定义时间段,用于监控目标的时候,设置合适的频率

timeperiod-监控时间

反馈:定义联系人|联系人组,用户获取信息后的反馈目标。

contact-联系人、contactgroup-联系人组

配置流程

根据我们对资源对象文件内部的对象间关系的学习,我们可以梳理出nagios的配置步骤:

1 定义监控对象的命令

2 定义监控的目标

3 定义监控动作的时间段

4 定义监控反馈的联系人

四、远程监控

1、被动原理

基本环境:
服务端 nagios core + check_nrpe
客户端 nrpe + nagios_plugins

流程原理:
1 服务端启动服务,周期性和客户端通信
2 服务端 check_nrep根据服务端的指示与客户端进行通信
3 nrep接受信息后,调用相关插件获取数据
4 插件获取数据后,返回给nrpe
5 nrpe接受的信息返回给服务端
6 服务端按顺序依次处理

2、准备工作

案例分析

  1. 服务端的 Nagios 会运行check_nrpe 这个插件,告诉它要检查什么

  2. check_nrpe 插件采用SSL方式连接到远程主机的NRPE进程

  3. 远程主机的 NRPE 进程会找到相应的Nagios 插件来执行检查;

  4. 远程主机的 NRPE 进程将检查的结果原路返回给服务端的 check_nrpe 插件,再转交给nagios做处理。

注意:

NRPE 进程需要 Nagios 插件安装在远程的Linux主机上。

服务端也需要安装 nrpe软件,因为我们在服务端需要check_nrpe插件

修改主机名,并修改两台主机的hosts文件

10.0.0.151 nagios.itcast.com nagios
10.0.0.152 agent.itcast.com agent

两台主机做好时间同步

服务端安装插件

获取nrpe软件

https://www.nagios.org/downloads/nagios-core-addons/

创建标准目录后,然后下载nrpe软件

安装nrpe

[root@nagios soft]# tar -xvf nrpe-4.0.2.tar.gz 
[root@nagios soft]# cd nrpe-4.0.2/
[root@nagios nrpe-4.0.2]# ./configure --prefix=/data/server/nagios --with-nagios-user=nagios --with-nagios-group=nagcmd
[root@nagios nrpe-4.0.2]# make all
[root@nagios nrpe-4.0.2]# make install-plugin

服务端只需要安装插件即可,不需要安装其他操作

3、远程主机部署

准备工作

获取软件

获取nrpe软件

https://www.nagios.org/downloads/nagios-core-addons/

创建标准目录后,然后下载nrpe软件

[root@agent ~]# mkdir /data/{server/nagios,softs} -p

用户权限配置

Nagios需要有专用的用户来进行管理

Nagios外部相关命令的使用,需要专用的用户组

[root@agent ~]# useradd -s /sbin/nologin nagios
[root@agent ~]# groupadd nagcmd
[root@agent ~]# usermod -a -G nagcmd nagios
[root@agent ~]# chown -R nagios.nagios -R /data/server

安装基础依赖软件

[root@agent ~]# yum install -y net-snmp xinetd perl-devel perl-CPAN openssl-devel gcc gcc-c++

注意:

xinetd 和 openssl-devel是最重要的

插件安装

获取插件

安装插件

插件版本与nagios版本的关联并不大

插件网站:http://www.nagiosplugins.org/
在官网下载插件安装包然后解压(插件版本与nagios版本关联不大)
[root@agent soft]# tar -xvf nagios-plugins-2.3.3.tar.gz 
编译
[root@agent nagios-plugins-2.3.3]# ./configure --prefix=/data/server/nagios --with-nagios-user=nagios --with-nagios-group=nagcmd --enable-perl-modules --enable-redhat-pthread-workaround
编译安装
[root@agent nagios-plugins-2.3.3]# make
[root@agent nagios-plugins-2.3.3]# make install

部署nrpe

安装nrpe

获取nrpe软件

https://www.nagios.org/downloads/nagios-core-addons/

安装nrpe

[root@agent softs]# tar -xvf nrpe-4.0.2.tar.gz 
[root@agent nrpe-4.0.2]# ./configure --prefix=/data/server/nagios --with-nagios-user=nagios --with-nagios-group=nagcmd
[root@agent nrpe-4.0.2]# make all
[root@agent nrpe-4.0.2]# make install-plugin
[root@agent nrpe-4.0.2]# make install-daemon
[root@agent nrpe-4.0.2]# make install-config
[root@agent nrpe-4.0.2]# make install-inetd

权限配置
[root@agent nagios]# chown nagios.nagios -R /data/server/nagios

启动nrpe

修改nrpe服务配置文件

[root@agent nagios]# vim /etc/xinetd.d/nrpe 
service nrpe
{
    disable         = no
    socket_type     = stream
    port            = 5666
    wait            = no
    user            = nagios
    group           = nagios
    server          = /data/server/nagios/bin/nrpe
    server_args     = -c /data/server/nagios/etc/nrpe.cfg --inetd
    only_from       = 127.0.0.1 10.0.0.151
    log_on_success  =
}

注意:

将 disable 后面的yes更改为no

在 only_from 增加nagios服务端主机ip,使用空格隔开

核心命令:nrpe -c /data/server/nagios/etc/nrpe.cfg -d

修改services文件

[root@agent nagios]# vim /etc/services 
nrpe            5666/tcp      nrpe      #nrpe service

启动服务

[root@agent nagios]# systemctl start xinetd.service 
[root@agent nagios]# systemctl enable xinetd

环境变量

nrpe环境变量

[root@agent nagios]# vim /etc/profile.d/nrpe.sh
# nrpe env set
export NRPE_HOME=/data/server/nagios
export PATH=$NRPE_HOME/bin:$NRPE_HOME/libexec:$PATH
[root@agent nagios]# source /etc/profile.d/nrpe.sh
[root@agent ~]# chmod +x /etc/profile.d/nrpe.sh 

4、命令详解

命令简介

查看帮助信息

[root@nagios nagios]# check_nrpe
Usage: check_nrpe -H <host> [-2] [-3] [-4] [-6] [-n] [-u] [-V] [-l] [-d <dhopt>]
       [-P <size>] [-S <ssl version>]  [-L <cipherlist>] [-C <clientcert>]
       [-K <key>] [-A <ca-certificate>] [-s <logopts>] [-b <bindaddr>]
       [-f <cfg-file>] [-p <port>] [-t <interval>:<state>] [-g <log-file>]
       [-c <command>] [-E] [-D] [-a <arglist...>]

注意:

在帮助信息中,比较重要的两个参数是:-H 和 -c

nrpe功能测试,检查nrpe服务端信息

[root@nagios nagios]# check_nrpe -H 10.0.0.152
NRPE v4.0.2

使用详解

在安装插件的过程中,执行./configure 的时候都做了SSL 的配置信息,然后在被监控端使用xinet的方式将nrpe服务以守护进程的形式启动起来了

NRPE管理插件详解

NRPE配置文件

NRPE管理nagios plugins是通过配置文件的方式来进行的,该配置文件是/data/server/nagios/etc/nrpe.cfg

[root@agent libexec]# egrep -vn '^$|^#' /data/server/nagios/etc/nrpe.cfg 
17:log_facility=daemon
34:debug=0
43:pid_file=/data/server/nagios/var/nrpe.pid
52:server_port=5666
79:nrpe_user=nagios
89:nrpe_group=nagios
106:allowed_hosts=127.0.0.1,::1
122:dont_blame_nrpe=0
140:allow_bash_command_substitution=0
176:command_timeout=60
187:connection_timeout=300
275:disable_syslog=0
300:command[check_users]=/data/server/nagios/libexec/check_users -w 5 -c 10
301:command[check_load]=/data/server/nagios/libexec/check_load -r -w .15,.10,.05 -c .30,.25,.20
302:command[check_hda1]=/data/server/nagios/libexec/check_disk -w 20% -c 10% -p /dev/hda1
303:command[check_zombie_procs]=/data/server/nagios/libexec/check_procs -w 5 -c 10 -s Z
304:command[check_total_procs]=/data/server/nagios/libexec/check_procs -w 150 -c 200

可以看到:

NRPE就是通过command的指令来管理各种各样的插件的

allowed_hosts是一个非常重要的属性

command指令详解

指令样式:

command[check_users]=/data/server/nagios/libexec/check_users -w 5 -c 10

指令格式:

command[命令名称]=插件路径 选项1 参数1 选项2 参数2 …

check_nrpe实践

命令格式:

check_nrpe -H “被监控主机ip” -c “nrpe管理的命令”

注意:

-c 后面接的监控命令必须是nrpe.cfg 文件中定义的,其他的都不能用

当检测成功后,这才表明客户端的配置都做好了

命令示例:

[root@nagios nagios]# check_nrpe -H 10.0.0.152 -c check_users
USERS OK - 2 users currently logged in |users=2;5;10;0
[root@nagios nagios]# check_nrpe -H 10.0.0.152 -c check_usersadd
NRPE: Command 'check_usersadd' not defined

常见问题

1 agent端nrpe服务未开启

2 iptables控制

3 后端脚本无法使用

5、nrpe实践

案例需求

需求目标

我们将远程主机加入到当前的nagios的管理中,然后采用nrpe的方式对远程主机进行监控管理,基于远程主机的管理的插件,获取相应的信息,然后传输回在监控主机,并在监控主机的web页面上进行展示。

需求分析:

1 服务端和客户端环境正常

2 客户端检测命令

3 服务端资源配置

4 服务端配置文件

5 综合测试

nrpe定制命令

获取主机存活状态

获取主机存活状态,我们可以基于check_ping插件来测试,check_ping插件的使用格式如下:

check_ping -H <host_address> -w <wrta>,<wpl>% -c <crta>,<cpl>% [-p packets] [-t timeout] [-4|-6]
命令详解:
-H 指定测试的主机
-w 指的是warning状态的条件,<wrta>个包<wpl>%比例失败,则属于WARNING状态,否则OK
-c 指的是critical状态的条件,<crta>个包<cpl>%比例失败,则属于CRITICAL状态,否则是WARNING
-p 指定测试数据包个数
-t 指定超时时间

测试示例:
[root@agent libexec]# check_ping -H 10.0.0.152 -w 10,20% -c 30,50% -p 4 -t 2
PING OK - Packet loss = 0%, RTA = 0.05 ms|rta=0.054000ms;10.000000;30.000000;0.000000 pl=0%;20;50;0

定制nrpe命令

被监控端编辑nrpe的配置文件

[root@agent nagios]# vim etc/nrpe.cfg 
command[check_agent_alive]=/data/server/nagios/libexec/check_ping -H 10.0.0.152 -w 10,20% -c 30,50% -p 4 -t 2

监控端check_ping检查效果

[root@nagios nagios]# check_nrpe -H 10.0.0.152 -c check_agent_alive
PING OK - Packet loss = 0%, RTA = 0.04 ms|rta=0.042000ms;10.000000;30.000000;0.000000 pl=0%;20;50;0

命令资源文件

在nagios的默认command.cfg文件中已经有了一个检查主机存活状态的命令,我们模仿一个命令

define command {

    command_name    check_agent_alive
    command_line    $USER1$/check_nrpe -H $ARG1$ -c check_agent_alive
}

目标资源文件

编写主机资源文件

[root@nagios nagios]# vim etc/objects/hosts.cfg 
define host {
    use                     linux-server
    host_name               agent.itcast.com
    alias                   agent.itcast.com
    address                 10.0.0.152
}
define hostgroup {
    hostgroup_name          nagios-servers
    alias                   Nagios Servers
    members                 nagios.itcast.com,agent.itcast.com
}

定义服务资源文件

define service {
    use                     local-service
    host_name               agent.itcast.com
    service_description     check_agent_alive
    check_command           check_agent_alive!10.0.0.152
}

define servicegroup{
     servicegroup_name          host-services
     alias                      Host-services
     members                    nagios.itcast.com,host_alive,agent.itcast.com,check_agent_alive
}

加载配置文件

确保nagios的主配置文件,已经加载将我们刚才设置的配置文件

vim /data/server/nagios/etc/nagios.cfg
cfg_file=/data/server/nagios/etc/objects/hosts.cfg
cfg_file=/data/server/nagios/etc/objects/services.cfg

检查配置文件是否生效

重启nagios服务

打开浏览器检查

6、插件开发

所有的监控都是在别人提供好的监控插件的基础上来进行的,而生产业务时千变万化的,所以我们肯定需要在某些特定时刻自己开发一套脚本,实现定制化的监控。接下来我们就好好的学习一下nagios的监控插件的开发。

需求分析

根据我们对模块插件的了解,nagios的监控插件其实就是一个个的脚本,我们只需要按照nrpe的监控流程使用相应的编程语言实现就可以了。

根据我们对Nagios的展示页面了解,其实只有Status和Stutus information两部分信息是来源于插件信息,其他的输出信息都来源于我们各自的资源定义文件。

其实在nagios中有一个shell脚本编写的插件样例:/data/server/nagios/libexec/utils.sh,我们可以分析一下这个脚本,梳理一下nagios的插件脚本的核心部分,然后按照规律写出一个符合自己业务场景的脚本。

#! /bin/sh

STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3
STATE_DEPENDENT=4
......
check_range() {
        local v range yes no err decimal start end cmp match
        v="$1"
        range="$2"

        # whether to raise an alert or not
        yes=0
        no=1
        err=2

        # regex to match a decimal number
        decimal="-?([0-9]+\.?[0-9]*|[0-9]*\.[0-9]+)"

        # compare numbers (including decimals), returning true/false
        cmp() { awk "BEGIN{ if ($1) exit(0); exit(1)}"; }
......

通过上面的脚本示例,可以知道,其实自定义插件脚本需要两部分核心内容:插件的退出状态码和信息输出。退出状态码可以被Nagios主程序接受,作为判断被监控服务状态的依据,而信息输出可以被Nagios主程序作为被监控系统服务状态的补充说明,并显示在管理页面中。

脚本开发

客户端脚本/data/server/nagios/libexec/check_sendmail.sh

#!/bin/bash

#设置状态返回码
STATE_OK=0
STATE_CRITICAL=2

#获取sendmail服务信息
SEND_MAIL=`netstat -anplt |grep 25|wc -l`

#判断流程
main(){
        if [ $SEND_MAIL -ge 1 ]
        then
                echo "OK Sendmail is working!"
                exit $STATE_OK
        else
                echo "CRITICAL Sendmail is not working!"
                exit $STATE_CRITICAL
        fi
}
#函数执行
main

修改权限并检查

[root@agent nagios]# chmod +x libexec/check_sendmail.sh 
[root@agent nagios]# chown nagios.nagcmd libexec/check_sendmail.sh 
[root@agent nagios]# bash libexec/check_sendmail.sh 
OK Sendmail is working!

NRPE集成

[root@agent nagios]# vim etc/nrpe.cfg 
command[check_sendmail]=/data/server/nagios/libexec/check_sendmail.sh

在服务器端检查
[root@nagios ~]# check_nrpe -H 10.0.0.152 -c check_sendmail
OK Sendmail is working!

资源对象定义

命令资源文件

在nagios的默认command.cfg文件中已经有了一个检查主机存活状态的命令,我们模仿一个命令

define command {

    command_name    check_agent_sendmail
    command_line    $USER1$/check_nrpe -H $ARG1$ -c check_sendmail
}

编写主机资源文件

之前编写过

定义服务资源文件

编辑服务资源专用services.cfg文件

define service {
    use                     local-service
    host_name               agent.itcast.com
    service_description     check_sendmail    check_command           check_agent_sendmail!10.0.0.152
}
define servicegroup{
     servicegroup_name          host-services
     alias                      Host-services
     members                    nagios.itcast.com,host_alive,agent.itcast.com,check_agent_alive,agent.itcast.com,check_sendmail
}

确保nagios的主配置文件,已经加载将我们刚才设置的配置文件

检查配置文件是否生效

重启nagios服务

浏览器打开nagios网页后,点击左侧Current Status项下面的相关子菜单,查看效果

 类似资料:

相关阅读

相关文章

相关问答