产品生命周期:调研阶段-设计阶段-开发阶段-测试阶段-运营阶段
随着业务的发展,锁提供的产品规模越来越大,功能越来越多,架构越来越复杂,除了通过开发手段来提高产品的质量,还需要在产品的生产运行过程中来维护以提高产品的质量,这就需要时刻掌握产品的运行过程中所产生的数据(包括硬件设备、系统性能、软件运行、趋势数据等),根据对产品业务的熟悉程度,设定一定的指标,当出现指标异常的时候,就需要采取一定的手段来保障产品的持续运营,这就是需要监控的原因。
有监控可以最大限度的避免问题。
监控方式
硬件层面
IPMI:智慧平台管理接口,是一种工业表中用于采集硬件设备的各种物理健康状态数据,如温度、电压、风扇工作状态、电源等。
软件层面
agent 专用客户端,专用的软件的一种应用机制
ssh 系统中常见的一种通信机制,但是并非所有。
SNMP 简单网络管理协议,是工作在各种网络设备中的一种机制。
监控的流程
实时监控:
数据采集——>数据整理——>实时分析——>结果输出——>决策——>警告/修复(处理)——>数据存储
非实时监控:
数据采集——>数据整理——>数据存储——>离线分析——>结果输出——>决策——>警告/修复(处理)——>数据存储
数据采集:根据业务的特性,采取多种方式,进行对一些针对性的数据进行采集
数据整理:对上报后的数据源进行收集、清晰、整理
实时分析:对某些重要的核心的业务数据进行实时分析
离线分析:对普通的数据、非紧急的业务数据进行存储,后续进行响应的分析。
结果输出:将分析后的数据结果展现出来,供决策参考。
问题决策:根据当前业务情况,人工或者自动方式对输出的结构进行分析,并判定下一步的行动(告警或者修复),同时将其决策记录保存下来,以便为后续决策提供依据。
系统命令
所有的监控方式,其收集数据的根本都是通过系统命令来实现的。
分类:观测、评测、调优(通过不同的命令及参数实现对不同资源的监控)
开源软件
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基础知识
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
客户端:
安装系统,按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
基础依赖包
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
准备工作目录
[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
使用安装包默认的插件
默认的插件在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
配置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的各种功能作用,主要由四部分组成:全局信息、当前状态、统计报告和系统管理
详情栏:
当我们选择左侧菜单栏的指定功能时候,用于显示相应的详情信息。
目录结构
[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 中加载使用。
核心配置文件
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 相关认证用户
命令资源文件
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,...
}
我们从 案例需求、需求分析、命令资源文件、目标资源文件、加载配置、效果验证、内容梳理 七个方面来学习。
案例需求
我们尝试做一个监控存活主机的案例,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的。
案例需求
我们自定义监控一个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服务,检查效果
监控原理
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、
案例需求
我们使用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
联系人资源文件 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
在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"
手工配置:将某个服务临时关闭,查看效果
浏览器打开邮箱网页后,稍等一会,就可以看到邮件通知效果
打印机资源文件 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 两个文件中定义的内容
配置角色
根据我们刚才对配置文件和资源对象文件的学习,我们知道,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 定义监控反馈的联系人
基本环境:
服务端 nagios core + check_nrpe
客户端 nrpe + nagios_plugins
流程原理:
1 服务端启动服务,周期性和客户端通信
2 服务端 check_nrep根据服务端的指示与客户端进行通信
3 nrep接受信息后,调用相关插件获取数据
4 插件获取数据后,返回给nrpe
5 nrpe接受的信息返回给服务端
6 服务端按顺序依次处理
案例分析
服务端的 Nagios 会运行check_nrpe 这个插件,告诉它要检查什么
check_nrpe 插件采用SSL方式连接到远程主机的NRPE进程
远程主机的 NRPE 进程会找到相应的Nagios 插件来执行检查;
远程主机的 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
服务端只需要安装插件即可,不需要安装其他操作
准备工作
获取软件
获取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
命令简介
查看帮助信息
[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 后端脚本无法使用
案例需求
需求目标
我们将远程主机加入到当前的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服务
打开浏览器检查
所有的监控都是在别人提供好的监控插件的基础上来进行的,而生产业务时千变万化的,所以我们肯定需要在某些特定时刻自己开发一套脚本,实现定制化的监控。接下来我们就好好的学习一下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项下面的相关子菜单,查看效果