以下监控系统内容很多都淘汰了,现在大多都用Prometheus了

监控系统

介绍

规模带来的挑战

  • 每当系统规模扩大10倍,原有的技术栈则需要替代
  • 更多系统、设备、应用的数量,不同的部署地点、不同的业务需求
  • 系统问题不能及时得到反馈,响应处理不及时(被动响应)
  • 设备服务间存在复杂的依赖关系,问题定位困难(这是分层带来的困扰)
    • 网络问题造成应用无法访问
    • 数据库问题造成应用无法访问
    • 资源抢占造成后台进程系统杀掉
  • 来自用户的问题反馈通常存在误导因素
  • 系统缺乏统一的监控告警机制、失控
  • 需要统一的监控系统,能自动告警、问题处理

监控系统介绍

可以周期性的检查系统、服务是否可用

日常使用的监控系统

  • Nagios
  • Zabbix
  • Manageengine
  • Solarwind

监控技术

  • 第一类:基于客户端
    • 适用于通用操作系统,需要在被监视设备上安装监控程序
  • 第二类:基于SNMP协议
    • 普遍使用、硬件设备
    • 私有的协议扩展

nagios介绍

Nagios是插件式的结构,它本身没有任何监控功能,所有的监控都是通过插件进行的,因此其是高度模块化和富于弹性的。

nagios是开源的系统监控工具

  • 自动监视系统运行状态
  • 发现问题及时通知相关人
  • 支持客户端和SNMP兼容设备

支持的两类监控对象

  • Host:物理的、虚拟的、网络设备、打印机等(可分组划分)
  • Service:系统功能(系统服务、资源占用CPU、内存、存储)
  • Service至少关联到一个Host

检查结果的4种状态

  • OK
  • Warning
  • Critical
  • Unknown
  • 具体的性能按需定义为以上状态

基于插件的系统框架

  • nagios将要检查什么,以及warning、critical的标准交给插件
  • 所有检查工作由插件完成,并分析检查结果
  • 内建插件主要由C语言开发(需要编译安装)
  • 不支持的检查功能可自行开发插件

清晰的对象定义系统

  • Commands:插件之上的抽象层,将类似的操作分组处理
  • Time periods:应该或不应该执行监控操作的时间跨度,可以定义某个时间不做监控
  • Hosts / Groups:一个或是一组主机(一个主机可以属于多个组)
  • Services:主机上需要监视的具体功能和资源(CPU、存储、web服务)
  • Contacts / Groups:联系人
  • Notifications:不同等级事件、时间通知谁什么内容
    • 何时以何种方式通知谁,具体什么信息
    • 不是严格意义的对象,是其他对象的集合
  • Escalations:通知升级,告警持续一定时间后升级

Nagios是一个依赖系统

  • 系统和服务依赖网络设备
  • 服务之间互相依赖,被依赖的服务故障时,依赖它的服务不再检查和告警

计划宕机

  • 维护性宕机调度时nagios不发告警
  • 也可以通知计划宕机维护

软硬状态

  • 为避免随机和临时性故障告警,Nagios状态区分软硬状态
  • 当前与之前检测状态不同时故障为软状态,相同则为硬状态,这是怕网络状态抖动,要连续检测多次有问题,才置为硬状态。

Nagios

Nagios安装

自动安装

ubuntu官方库包含Nagios3.X版本

1
sudo apt install nagios3 nagios-plugins

nagios官方最新版4,需要手动编译安装,Nagios3和4相当于python2和3的版本差异,Nagios3和4的版本都是独立发展的。

提供了web访问方式

编译安装

需要的依赖软件包

C编译器、C语言开发库、OpenSSL实现web加密访问、MySQL存储历史数据、PHP、SNMP、图形组件

1
sudo apt install -y wget gcc make binutils cpp libpq-dev libmysqlclient-dev libssl1.0.0 libssl-dev pkg-config libgd-dev libgd-tools perl libperl-dev libnet-snmp-perl snmp apache2 apache2-utils libapache2-mod-php unzip tar gzip php php-gd

创建目录结构

1
2
3
4
5
sudo mkdir /opt/nagios         # 二进制、插件、程序安装目录

sudo mkdir /var/nagios # 存放状态数据(历史数据)

sudo mkdir /etc/nagios # 配置文件目录(安装过程生成)

创建用户和组账号

1
2
3
4
5
sudo groupadd nagios       # 后台进程运行账号
sudo groupadd nagioscmd # 与后台进程通信的账号(web)
sudo useradd -g nagios -G nagioscmd -d /opt/nagios nagios # 建立账号,并加入组

sudo usermod -G nagioscmd www-data # web需要与nagios通信,web账号加入到nagioscmd组

文件系统权限

1
chown nagios:nagios /opt/nagios /etc/nagios /var/nagios

下载源码

1
2
3
4
5
6
wget https://assets.nagios.com/downloads/nagioscore/releases/nagios-4.4.5.tar.gz

wget https://nagios-plugins.org/download/nagios-plugins-2.3.1.tar.gz

tar -zxvf nagios-4.4.5.tar.gz
tar -zxvf nagios-plugins-2.3.1.tar.gz

编译安装nagios

1
2
3
4
5
6
7
8
9
10
11
cd cd nagios-4.4.5/

./configure --prefix=/opt/nagios --sysconfdir=/etc/nagios --localstatedir=/var/nagios --libexecdir=/opt/nagios/plugins --with-command-group=nagioscmd # 配置

make all # 编译

make install # 安装

make install-init # 创建系统服务文件
make install-commandmode # 安装扩展命令
make install-config # 安装例子配置文件

验证配置文件

1
su -c '/opt/nagios/bin/nagios -v /etc/nagios/nagios.cfg'    # 验证例子文件

编译安装插件

1
2
3
4
5
6
7
cd ../nagios-plugins-2.3.1/

sh configure --prefix=/opt/nagios --sysconfdir=/etc/nagios --localstatedir=/var/nagios --libexecdir=/opt/nagios/plugins

make all

make install

创建站点配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
cd /etc/apache2/conf-available/
vi nagios.conf
# 写入如下配置

ScriptAlias /nagios/cgi-bin /opt/nagios/sbin
Alias /nagios /opt/nagios/share
<Location "/nagios">
AuthName "Nagios Access"
AuthType Basic
AuthUserFile /etc/nagios/htpasswd.users
require valid-user
</Location>
<Directory "/opt/nagios/share">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Require all granted
Order allow,deny
Allow from all
</Directory>
<Directory "/opt/nagios/sbin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Require all granted
Order allow,deny
Allow from all
</Directory>

加载模块并启动站点

1
2
3
a2enmod cgi
a2enmod auth_basic
a2enconf nagios

设置web登录密码

1
2
3
4
5
htpasswd -c /etc/nagios/htpasswd.users nagiosadmin  # 创建基本账号身份认证密码,将nagiosadmin账号密码存入/etc/nagios/htpasswd.users目录下

# 重启服务
systemctl restart apache2
systemctl restart nagios

web访问

http://192.168.1.104/nagios

Nagios配置

配置文件

1
2
3
4
5
6
7
8
/etc/nagios        # 存放配置文件的目录

/etc/nagios/nagios.cfg # 主配置文件,启动时加载,是其他配置的入口
# 建议将cfg_file默认的配置注释掉

cfg_file # 单个的对象定义文件
cfg_dir # 资源文件
resource_file # 类型、功能、业务(易于统一开关)

目录结构

1
2
3
cd /etc/nagios

mkdir commands timeperiods contacts contactgroups hosts hostgroups services servicegroups templates

修改主配置文件

1
2
3
4
5
6
7
8
9
10
11
12
vi /etc/nagios/nagios.cfg
# 添加配置

cfg_dir=/etc/nagios/commands
cfg_dir=/etc/nagios/timeperiods
cfg_dir=/etc/nagios/contacts
cfg_dir=/etc/nagios/contactgroups
cfg_dir=/etc/nagios/hosts
cfg_dir=/etc/nagios/hostgroups
cfg_dir=/etc/nagios/services
cfg_dir=/etc/nagios/servicegroups
cfg_dir=/etc/nagios/templates

监控体系架构

nagios启动过程中要读取主配置文件,主配置文件中我们指定了其他的具体要监视的那些配置文件中的目录。

而具体监视的是什么呢?首先要定义主机,所有的服务都不能脱离主机单独存在,而主机是监视的开始,只有有了一个定义好的对象主机,才能对主机上的服务资源进行监控。

nagios系统要求一个主机至少定义一个服务。

如何检查呢?在command.cfg文件中定义检查指令,通过插件来完成检查。在command.cfg中还定义了检查完了如何处置的步骤,可以发邮件给负责人或者直接操作。

监控过程中会涉及到各种宏,在资源文件中定义宏。

nagios宏

介绍

可以在资源文件中定义256个宏,这些宏可以在Host中调用Host里面的属性。一方面可以在资源文件中手工定义,另一方面Host、Service、Contact这些对象,nagios会默认的生成对应的宏。

举例:

1
2
3
4
5
6
7
8
9
10
11
vi /etc/nagios/objects/localhost.cfg

# 以下拿host举例,定义了一个host
define host {

use linux-server

host_name localhost
alias localhost
address 127.0.0.1
}
  • 这里用host_name主机名来区分,人为定义的用来区分这台主机是用来干什么用的。
  • alias是别名、描述名,可以写一段描述,更加清晰的描述这台主机是干什么用的
  • address是主机IP地址。

nagios系统会针对不同类型的对象(Host、Service、Contact)不同的属性会自动生成对应的宏。

1
2
3
4
5
# 一旦定义好了主机对象,就是上面举的例子,会生成对应的宏,如下所示

$HOSTHOST_NAME$
$HOSTALIAS$
$HOSTADDRESS$

如果你觉得系统自带的定义host对象的属性字段不够用,可以自定义属性字段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
define host {

use linux-server

host_name localhost
alias localhost
address 127.0.0.1
_MAC 00:11:22:33:44:55
}

# 这里人工的定义了MAC字段,以_ 开头,针对自定义属性字段,也会生成一个对应的宏
$_HOSTMAC$


# 也可以以两个下划线开头__
__MAC
$_HOST_MAC$
举例使用宏
1
2
3
4
5
6
7
8
9
10
11
12
define host{
host_name somemachine
address 10.0.0.1
check_command check-host-alive # 检查主机是否存活
}
define command{
command_name check-host-ssh # 调用command文件命令
command_line $USER1$/check_ssh -H $HOSTADDRESS$ # 具体的命令,使用默认的resource文件里面定义的USER1,$USER1$指的就是/opt/nagios/plugins/目录,$HOSTADDRESS$ 就是指的是定义的主机对象的address属性。$USER1$/check_ssh -H $HOSTADDRESS$这条命令就是/opt/nagios/plugins/check_ssh -H IP地址

}

/opt/nagios/plugins/check_ssh -H 10.0.0.1
常用内建的宏(全局变量)

读取其他对象的宏

宏不但对象自身能读取相应的宏,还能引用其他对象的宏。

1
$CONTACTEMAIL:jdoe$      # jdoe的邮件地址,不是当前联系人。
资源文件权限
1
chmod 600 /etc/nagios/resource.cfg       # 内涵机密信息,应避免被web服务读取内容

HOST

定义一个host对象

怎么描述被监视对象
  • 短名 short name
  • 描述名 descriptive name
  • 地址 / 主机名
  • 何时以及如何监视
  • 故障时联系人
  • 检查频率 / 重试次数
  • 如何发出告警
  • ……
定义主机范例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
cd /etc/nagios/hosts      # 主机都放在host目录下
vi linuxserver.cfg
# 编写如下配置

define host{
host_name linuxbox01 # 短名
hostgroups linuxservers # 主机组
alias Linux Server # 描述名
address 10.0.2.15
check_command check-host-alive # 事先在command
check_interval 5 # 检查间隔5分钟
retry_interval 1 # 不正常,此时是软宕机状态,重试间隔1分钟检查一次
max_check_attempts 3 # 如果连着3次检查都是宕机状态,这时候才是硬宕机状态,判定真的宕机了
check_period 24x7 # 全天时间都在检查
contact_groups linux-admins # 告警联系人组
notification_interval 10 # 发送告警时间间隔,10分钟发一次
notification_period 24x7 # 全天告警
notification_options d,u,r # 告警状态
parents SW01
}

一般情况下不会定义这么多的内容,通常会将这些写在模板上。

  • notification_options

    • d:DOWN 系统当机了
    • u:UNREACHABLE,不可达
    • r:GroupRecovery,系统已经恢复正常了
    • f:starts and stops flapping 系统在up到down来回摆动的状态
    • s:scheduled downtime starts or ends 由于系统维护升级,计划之内将系统下线,这不是系统故障,是主动关机。
  • 默认假设host状态是UP

  • parents ,通常是服务器上连的交换机、路由器等网络设备,如果parent处于down的状态,host状态为unreachable,就不再执行检测。

Host Group

每个host可以同时属于多个group,把多个具有一定相似性的主机加入同一个组里面,进行统一的管理、监控,可以提高效率。

1
2
3
4
5
6
7
8
9
10
cd /etc/nagios/hostgroup
vi linuxserversgroup.cfg
# 编写配置

define hostgroup{
hostgroup_name linux-servers
alias Linux servers
members server01,server02
hostgroup_members group01,group02 # 可以将组加入到组里面。可以做一个组层级上的管理
}

Service

监控一台主机是否存活并不是我们最关心的事,从业务角度讲我们更关心系统服务、资源占用、业务是否正常。操作系统本身不会出太大问题

  • NFS、FTP服务、存储空间、CPU负载
  • Service永远绑定于一个运行状态的HOST
  • 每个一个HOST至少要定义一个Service
  • 通过唯一的描述名标识
  • 定义何时、如何进行检查
  • 定义告警方式
  • 文件放在/etc/nagios/serivces/目录下,一般命名:<host>-<service>.cfg
定义Service范例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
cd /etc/nagios/services
vi services.cfg
# 编写配置

define service{
host_name localhost.srv1 #<hostgroup_name>
service_description www # 唯一标识
check_command check_http # command命令
check_interval 10 # 每隔10分钟检查一次
check_period 24x7 # 在什么时间范围内检查
retry_interval 1 # 出现故障,再隔1分钟检查一次
max_check_attempts 3 # 重复查3次都是故障,告警
notification_interval 30 # 每隔30分钟发一次告警
notification_period 24x7
notification_options w,c,u,r # 与host的options的类似
contact_groups web_admins # 联系人
}

notification_options

  • w:Warning
  • u:unknown
  • c:Critical
  • r:recovery(ok)
  • f:starts / stops flapping 一下好一下坏
  • s:scheduled downtime starts / ends
排除检查主机
1
2
3
4
5
6
define service{
hostgroup_name linux-servers
host_name !srv01,srv02 # 惊叹号!排除主机srv02、srv02,不检查
service_description SSH
……
}
Service group

Service Group成员是多个 <host>, <service>

1
2
3
4
5
6
7
# 创建组,明确哪一个服务是一个组的
define servicegroup{
servicegroup_name databaseservices
alias All services related to database
members srv01,mysql,srv01,pgsql,aix01,db2
}
# srv01下的mysql服务、srv01下的pgsql服务、aix01下的db2服务三个服务

另一定义组的方式

1
2
3
4
5
6
7
8
9
10
11
12
# 先创建组,里面是空的,在创建服务的时候,再明确添加到组
define servicegroup{
servicegroup_name databaseservices
alias All services related to database
}

define service{
host_name linuxbox01
service_description mysql
check_command check_ssh
servicegroups databaseservices
}

主机、主机组、服务、服务组在使用过程中互相调用的过程:

先定义主机H01、H02、H03、H04、H05、H06、H07、H08,按照不同的归类属性给主机分组,当要对这些主机、主机组来进行服务的监控时,一般都会创建服务,把主机组绑定到服务里,根据你进一步管理的需求,可以给服务进行分组。

Command

  • 如何检查Host / Service
  • 如何问题告警 / 事务处理
  • 有两个参数:名称、命令行
  • 命令执行插件或自定义命令
  • 命令行会使用宏、参数等
定义command

无参数的

1
2
3
4
5
6
7
8
9
10
11
define command{
command_name check-host-alive
command_line $USER1$/chcek_ping -H $HOSTADDRESS$ -w 3000.0,80% -c 5000.0,100% -p 5 # 在USER1插件目录下执行check_ping命令,-H参数ping目标主机,-w参数当丢包达到80% Warning,-c当丢包到达100% Critical。
}

# host定义时
define host{
host_name somemachine
address 10.0.0.1
check_command check-host-alive
}

带参数定义command

1
2
3
4
5
6
7
8
9
10
11
define command{
command_name check-host-alive
command_line $USER1$/chcek_ping -H $HOSTADDRESS$ -w $ARG1$ -c $ARG2$ -p 5 # 在USER1插件目录下执行check_ping命令,后面跟参数变量。
}

# host定义
define host{
host_name somemachine
address 10.0.0.1
check_command check-host-alive-limits!3000.0%,80%!5000.0,100%
}

针对不同主机设置不同的参数

Time period

定义时间区段

执行检查、告警的时间区段

1
2
3
4
5
6
7
8
9
10
define timeperiod{
timeperiod_name workinghours
alias Working Hours,from Monday to Friday
monday 09:00-17:00
tuesday 09:00-17:00
wednesday 09:00-17:00
thursday 09:00-17:00
friday 09:00-17:00
exclude first-mondays # 每个月的第一个星期一不监控
}
日期格式优先级

按照时间颗粒度排序,优先级从高到低:

1
2
3
4
5
YYYY-MM-DD            # 具体日期 2019-01-01
July 4 # 每年指定日期
day 14 # 每月指定日期
Monday 1 April # 具体月指定星期(4月第一个星期一)】
Monday # 每个星期一
1
2
3
4
5
6
define timeperiod{
timeperiod_name weekends
alias Weekends all day long
saturday 00:00-24:00
sunday 00:00-24:00
}

Contact

定义联系人
1
2
3
4
5
6
7
8
9
10
11
12
define contact{
contact_name zs
alias zhang san
email zs@lab.com
contactgroups admins,nagiosadmin
host_notification_period workinghours #主机什么时间发告警
service_notification_period workinghours #服务什么时候发告警
host_notification_options d,u,r
service_notification_options w,u,c,r
host_notification_commands notify-host-by-email # 事先在command定义好
service_notification_commands notify-service-by-email
}
告警状态

host_notification_options:

  • d : DOWN
  • u : UNREACHABLE
  • r : Recovery (UP)
  • f : starts / stops Flapping
  • s : Scheduled downtime starts / ends
  • n : Not receive any notifications 不接收任何的告警

service_notification_commands:

  • w : WARNING
  • u : UNKNOWN
  • c : CRITICAL
  • r : Recovery (OK)
  • f : the service starts and stops flapping
  • n : the person will not receive any service notifications
Contact Group

指定时间联系指定人群,硬件问题联系硬件管理员,服务问题联系系统管理员

1
2
3
4
5
6
define contactgroup{
contactgroup_name linux-admins
alias Linux Administrators
members jdoe,smith
contactgroup_members
}

验证配置文件

  • 重启服务、系统前验证配置,避免nagios服务宕机
1
/opt/nagios/bin/nagios -v /etc/nagios/nagios.cfg

模板和继承

  • 定义新对象时可重用模板定义的参数,简化管理
  • 不加register的模板对象将被视为普通对象进行监控
  • 通过use指令调用模板定义对象
  • 定义对象时可使用多个模板。按模板先后顺序确定优先级
  • 模板可层级继承调用,定义新的模板,模板里面定义模板
定义模板
1
2
3
4
5
6
7
8
9
10
11
12
define host{
name generic-server
check_command check-host-alive
check_interval 5
retry_interval 1
max_check_attempts 5
check_period 24x7
notification_interval 30
notification_period 24x7
notification_options d,u,r
register 0
}
继承
1
2
3
4
5
6
7
define host{
use generic-server
host_name linuxbox01
alias Linux Server 01
address 10.0.1.2
contact_groups linux-admins
}

nagios的web界面

  • 查看性能、故障、状态、历史信息
  • 支持修改部分设置
  • 显示状态、报告、系统

Nagios Exchange(社区站点)

安装Nagiosgraph

Nagiosgraph性能图示

介绍

  • 基于RRDtool实现历史数据的图形化显示,曲线图表的形式展示。
  • 由perl语言编写

下载安装

安装依赖包

1
sudo apt install -y libcgi-pm-perl librrds-perl libgd-gd2-perl rrdtool perl libgd-perl

下载源码安装

1
2
3
4
5
6
7
8
9
curl -sSL https://sourceforge.net/projects/nagiosgraph/files/latest/download | tar xzv

cd nagiosgraph-1.5.2/

perl install.pl

Modify the Nagios configuration? [n] y
Modify the Apache configuration? [n] y
Path of Apache configuration directory? /etc/apache2/sites-enabled

修改站点配置文件

1
2
3
4
5
vi /etc/apache2/sites-enabled/nagiosgraph.conf

# 修改配置
替换: Allow from all --> Require all granted
删除: order allow,deny

重启服务:

1
2
systemctl restart apache2.service
systecmtl restart nagios.service

访问测试

http://192.168.1.104/nagiosgraph/cgi-bin/show.cgi

集成nagiosgraph

将nagios图表集中到nagios主web页面

1
2
3
4
5
6
7
8
9
10
11
vi /etc/nagios/objects/templates.cfg

define service {
name local-service
use generic-service
max_check_attempts 4
check_interval 5
retry_interval 1
action_url /nagiosgraph/cgi-bin/show.cgi?host=$HOSTNAME$&service=$SERVICEDESC$&geom=1000x200
register 0
}

重启服务

1
2
systemctl restart apache2
systemctl restart nagios.service

MRTG监控nagios的运行状态

安装配置

1
2
3
4
5
6
7
8
9
apt install mrtg

cp ~/nagios-4.4.5/sample-config/mrtg.cfg /etc/nagios/ # 拷贝配置文件

mkdir /opt/nagios/share/stats # 存放mrtg收集的数据

vi /etc/nagios/mrtg.cfg
# 编辑配置文件,在上面增加:
WorkDir: /opt/nagios/share/stats

起始运行

1
env LANG=C mrtg /etc/nagios/mrtg.cfg

创建页面文件

1
indexmaker /etc/nagios/mrtg.cfg --output=/opt/nagios/share/stats/index.html

周期运行

1
2
3
4
vi /etc/cron.d/nagiostats           # 创建后台进程的启动文件

# 如下的配置:每5分钟重复执行
*/5 * * * * root env LANG=C /usr/bin/mrtg /etc/nagios/mrtg.cfg

访问测试

http://192.168.1.104/nagios/stats/

起始页更改为Service

1
2
3
4
vi /opt/nagios/share/index.php

# 修改url
$url="cgi-bin/status.cgi?host=all&limit=0";

菜单

1
2
3
4
5
6
7
8
9
10
11
12
13
vi /opt/nagios/share/side.php

<div class="navsection">
<div class="navsectiontitle">External Tools</div>
<div class="navsectionlinks">
<ul class="navsectionlinks">
<li><a href="/nagios/stats" target="<?php echo $link_target;?>">Nagiostats</a>
</li>
<li><a href="/nagiosgraph/cgi-bin/show.cgi" target="<?php echo $link_target;?>">Nagiosgraph</a>
</li>
</ul>
</div>
</div>

SSH实现远程监控

介绍

  • 监视远程主机的CPU、内存、存储等
  • 利用SSH在远程主机上执行插件并返回结果以及退出代码
  • SSH是基于秘钥的身份认证
  • check_by_ssh插件建立SSH连接,指定主机名和具体执行的命令

Nagios client安装配置

1
2
3
4
5
6
7
8
9
10
11
apt -y install gcc make binutils cpp

wget https://nagios-plugins.org/download/nagios-plugins-2.3.1.tar.gz

cd ../nagios-plugins-2.3.1/

sh configure --prefix=/opt/nagios --sysconfdir=/etc/nagios --localstatedir=/var/nagios --libexecdir=/opt/nagios/plugins

make all

make install

Nagios Server生成密钥对

1
2
su -s /bin/bash nagios       # 使用nagios账号
ssh-keygen

Nagios client创建账号

1
2
3
4
useradd -d /opt/nagios nagios
chown nagios:nagios /opt/nagios
chmod 0700 /opt/nagios
passwd nagios

Nagios Server拷贝密钥

1
2
3
ssh-copy-id nagios@192.168.1.105

ssh -v nagios@192.168.1.105 # 测试是否可以连接

测试

1
2
3
4
/opt/nagios/plugins/check_by_ssh -H 192.168.1.105 -C "/opt/nagios/plugins/check_uptime"      # 调用插件验证是否可以连接

opt/nagios/plugins/check_by_ssh -H 192.168.1.105 -C
"/opt/nagios/plugins/check_disk -w 15% -c 60% -p '/'" # 检查磁盘使用量

nagios配置

将检查的指令写到配置文件中

1
2
3
4
5
6
7
8
9
10
11
12
define command{
command_name check_swap_by_ssh
command_line $USER1$/check_by_ssh -H $HOSTADDRESS$ -C "$USER1$/check_swap -w $ARG1$ -c $ARG2$"
}

define service{
use generic-service
host_name !localhost
hostgroup_name linux-servers
service_description SWAP
check_command check_swap_by_ssh
}

NPRE远程监控

介绍

nagios专用的客户端,安装在被监视的机子上。NRPE只适用于通用系统,在非通用操作系统上工作的硬件上的设备,无法安装NRPE,适用范围比较受限。

  • 客户端 / 服务器架构,通过check_nrpe插件、NRPE daemon
  • 通信支持加密(SSL over TCP)
  • 通信流量小于SSH,节省CPU资源
  • 只允许运行特定命令,不会造成任意指令执行,而SSH会。
  • 默认工作端口在 TCP 5666

NPRE安装

库安装:

1
2
3
sudo apt install nagios-nrpe-server       # 在被监视服务器上安装,安装完启动服务,侦听在5666端口上

sudo apt install nagios-nrpe-plugin # 在nagios监控的服务器上安装

编译安装

安装依赖包

1
sudo apt install gcc make binutils cpp pkg-config libc6-dev libssl-dev openssl

下载、编译、安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
wget https://sourceforge.net/projects/nagios/files/npre-2.15/nrpe-2.15.tar.gz
tar zxvf nrpe-2.15.tar.gz

cd nrpe-2.15.tar.gz
sh configure --sysconfdir=/etc/nagios --libexecdir=/opt/nagios/plugins --prefix=/opt/nagios --with-nrpe-group=nagios --with-nrpe-user=nagios --with-nagios-user=nagios --with-nagios-group=nagios --with-ssl-lib=/usr/lib/x86_64-linux-gnu --enable-ssl

make all

# nagios 服务器(NPRE客户端)
make install-plugin

# nagios客户端(NPRE服务端)
make install-daemon
mkdir /etc/nagios
make install-daemon-config

配置NRPE服务器

1
2
3
4
useradd -d /opt/nagios nagios
mkdir /opt/nagios
chown nagios:nagios /opt/nagios
passwd -l nagios

启动脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
vi /etc/init.d/nrpe
# 编写如下的 服务器启动文件
#!/bin/sh
is_running() {
pgrep -u nagios nrpe >/dev/null
}
case "$1" in
start)
echo -n "Starting NRPE: "
if ! is_running ; then
/opt/nagios/bin/nrpe -d -c /etc/nagios/nrpe.cfg
fi
echo "done."
;;
stop)
echo -n "Stopping NRPE: "
if is_running ; then
pkill -u nagios nrpe
sleep 1
pkill -u nagios -9 nrpe
fi
echo "done."
;;
restart)
$0 stop
sleep 2
$0 start
;;
status)
if is_running ; then
echo "NRPE is running"
exit 0
else
echo "NRPE is NOT running"
exit 1
fi
;;
esac


# 更改权限
chmod 0755 /etc/init.d/nrpe
update-rc.d nrpe

NRPE配置文件

1
2
3
4
5
6
7
8
9
vi /etc/nagios/nrpe.cfg
# 配置文件修改如下:

allowd_hosts=nagios服务器的ip地址
command[check_disk_sys]=/opt/nagios/plugins/check_disk -w 20% -c 60% -p /


# 重启服务
systemctl restart nagios-nrpe-server.service

手动测试

1
2
3
4
5
# 使用官方库安装:
/usr/lib/nagios/plugins/check_nrpe -H 192.168.2.52 -c check_load

# 自己编译安装
/opt/nagios/plugins/check_nrpe -H 192.168.2.52 -c check_users

配置nagios使用NRPE例子

1
2
3
4
define command{
command_name check_swap_nrpe
command_line $USER1$/check_nrpe -H "$HOSTADDRESS$" -c "chceck"
}

NRPE工作流程

在nagios server上,通过nagios的后台进程,将配置文件编写好,每隔多长时间就要调用哪个插件做什么样的检查。调用check_nrpe这个插件去和远端的计算机连接,连接NRPE demon后台进程,也就是连接到侦听在被监视服务器的5666端口。这样就有了一个隧道,通过这个隧道,发过来执行什么检查,最终还是使用被监视服务器的Nagios plugin插件进行检查。检查的结果通过NRPE的隧道返回给check_nrpe,然后返回给nagios进程。

SNMP实现远程监控

SNMP(Simple Network Management Protocol)

介绍

  • 工业标准,原则上所有设备厂商都支持
  • 适合非通用操作系统的硬件设备(无法安装插件、nrpe)
  • 统一的方法获取和设置设备参数
  • 标准的层次化信息分组访问方式,称为管理信息库
  • Management Information Base(MIB)
  • MIB定义可访问的属性,即标准OID对应关系
  • 厂商可自定义OID(不兼容)
  • OID(Object identifier)
  • 协议端口:UDP 161 / 162

SNMP基本信息

  • 被监视端运行agent进程侦听端口,监视端称为SNMP manager
  • get / set是从manager向agent的通信过程
  • trap是agent主动向manager通告信息的通信过程
  • 版本:v1、v2、v2c、v2u、v3
    • v1是基于IP / community(public / private)的安全机制
    • v2、v2c增加了getbulk(获取节点下的所有数据)、inform(trap——请求manager确认ACK)
    • v2u是基于用户的身份验证安全机制(但不包含v1、v2c其他安全机制,很少用)
  • v3改进的安全模型、认证、隐私、访问控制
  • 检查设备支持SNMP什么版本(proxy用于多版本之间的协调转换)

安装Net-SNMP工具包、MIB文件库(manager)

1
sudo apt install snmp snmp-mibs-downloader    # 监控端

安装SNMP Agent

1
2
3
4
5
sudo apt install snmpd        # 被监控端

vi /etc/snmp/snmpd.conf

# 修改ip / community,将默认的public改掉,如改为pub1

服务端命令

1
2
3
4
5
snmpget -v 2c -c pub1 192.168.2.2 .iso.org.dod.internet.mgmt.mib-2.system.sysName.0

snmpget -v 2c -c pub1 192.168.2.2 .1.3.6.1.2.1.1.5.0

snmpwalk -v 1 -c pub1 192.168.2.2 .1.3.6.1.2.1.1.5.0

监控windows系统

在Windows上安装SNMP Agent

1
snmpwalk -v 2c -c pub2 192.168.2.102

nagios基于snmp监控

利用nagios插件check_snmp

1
2
3
4
5
6
7
8
9
10
11
/opt/nagios/plugins/check_snmp -H 192.168.2.102 -P 2c -C pub2 -o SNMPv2-MIB::sysLocation.0 -s "cwz"    # -s参数精确匹配

/opt/nagios/plugins/check_snmp -H 192.168.2.2 -P 2c -C pub1 -o SNMPv2-MIB::sysContact.0 -r "@" # -r 参数 正则表达式匹配

/opt/nagios/plugins/check_snmp -H 192.168.2.102 -P 2c -C pub2 -o HOST-RESOURCES-MIB::hrSystemProcesses.0 -w 0:20 -c 0:30 # 查系统进程数

/opt/nagios/plugins/check_ifoperstatus -H 192.168.2.102 -C pub2 -k 65539 # 查索引值为65539的网卡

/opt/nagios/plugins/check_ifstatus -H 192.168.2.102 -v 2c -C pub2 -u 65539 # 也是查看网卡状态

route print # 查看目标网卡的索引值

nagios利用snmp查看结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
define command {
command_name check_snmp
command_line $USER1$/check_snmp -P 1 -H $HOSTADDRESS$ -o $ARG1$ $ARG2$
}

define service {
use generic-service
hostfroup_name snmp-aware
service_description Processes
check_command check_snmp!HOST-RESOURCES-MIB::hrSystemProcesses.0!-w 0:50 -c 0:100
}

define host {
use generic-host
host_name linuxbox01
address 10.0.0.1
_SNMPVERSION 2c
_SNMPCOMMUNITY public
}

define command {
command_name check_snmp
command_line $USER1$/check_snmp -H $HOSTADDRESS$ -o $ARF1$ -P $_HOSTSNMPVERSION$ -C $_HOSTSNMPCOMMUNITY$ $ARG2$
}

Zabbix监控

Zabbix介绍

Zabbix是最流行的开源的企业级的监控系统之一

  • 能监控网络设备、操作系统、应用程序等。
  • 支持Unix、Linux、Windows、MacOS平台

两种监控方式:

  • Agent。在被监视的服务器上安装agent程序,通过这个程序,由Zabbix服务器向安装了Zabbix客户端的机器发送各种控制性的指令。在使用agent的情况下,Zabbix和agent程序互相通信,获取监控的信息。
  • Agenless。在一些硬件设备不能安装应用程序,无法安装agent,可以使用agenless。

安装Zabbix服务器

IP地址:192.168.0.106

修改主机名:zab.lab.com

增加host解析

Zabbix基于图形化管理的web页面就是基于web的应用程序,所以要安装Apache、数据库、php,基于这个web环境,再去安装Zabbix的服务端的web程序。

安装Apache

1
2
3
4
5
6
7
8
9
10
11
12
13
sudo apt install apache2

sudo vim /etc/apache2/conf-enabled/security.conf
# 搜索ServerTokens,默认会返回主机头信息,这样做从安全角度上,会泄露一些系统信息。出于安全性的考虑,我们建议也是Zabbix官方建议我们安全设置采用Prod
ServerTokens Prod

sudo vi /etc/apache2/apache2.conf # 添加主机名,随便找个空加就可以了
ServerName zab.lab.com

sudo vi /etc/apache2/sites-enabled/000-default.conf # 修改管理员的邮件地址,可改可不改
ServerAdmin webmaster@lab.com

sudo systemctl restart apache2

安装php

1
2
3
4
5
6
7
8
9
10
11
12
sudo apt install php php-cgi libapache2-mod-php php-common php-pear php-mbstring

sudo a2enconf php7.2-cgi # 启动相应的模块

sudo systemctl reload apache2

sudo vi /etc/php/7.2/apache2/php.ini # 更改时区设置
date.timezone = "Asia/Shanghai"

sudo vi /var/www/html/index.php # 创建php页面,测试是否生效
# 插入如下测试代码:
<html><body><?php print "PHP Test", ?></body></html>

安装数据库

1
2
sudo apt install mariadb-server
mysql_secure_installation

给Zabbix创建数据库

1
2
3
4
5
6
7
CREATE DATABASE zabbix CHARACTER SET utf8 collate utf8_bin;

grant all privileges on zabbix.* to zabbix@'localhost' identified by 'password';

grant all privileges on zabbix.* to zabbix@'%' identified by 'password';

flush privileges;

安装Zabbix

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
wget https://repo.zabbix.com/zabbix/4.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_4.0-3+bionic_all.deb

sudo dpkg -i zabbix-release_4.0-3+bionic_all.deb

sudo apt update


# 安装Zabbix server,Web前端,agent
sudo apt install zabbix-server-mysql zabbix-frontend-php zabbix-agent


zcat /usr/share/doc/zabbix-server-mysql/create.sql.gz | mysql -uzabbix -p zabbix

sudo vi /etc/zabbix/zabbix_server.conf # 修改Zabbix配置文件,指定连接数据库的密码
DBPassword=password # 我设置的密码是password

sudo systemctl restart zabbix-server.service # 重启服务

配置agent,让agent程序能找到被监视服务器,通知状态到服务器上去

1
2
3
4
5
6
7
8
9
10
11
sudo vi /etc/zabbix/zabbix_agentd.conf
Hostname=zab.lab.com

sudo systemctl restart zabbix-agent.service
sudo systemctl enable zabbix-server.service

# 可以修改 允许哪些人能访问Zabbix控制台,管理web界面
sudo vi /etc/apache2/conf-enabled/zabbix.conf
Allow from all # 默认是所有,可以修改为企业内部内网网段的ip地址

sudo systemctl restart apache2

初始化:

用浏览器访问:http://zab.lab.com/zabbix/

然后点next

点击next

这样就完成了安装配置,就可以使用了

image.png

image.png

这样就可以添加被监视的机器了。

安装agent

准备一台被监视服务器,安装agent

IP地址:192.168.0.107

修改主机名:agent1.lab.com

修改host解析

安装:

1
2
3
4
5
6
7
8
9
wget https://repo.zabbix.com/zabbix/4.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_4.0-3+bionic_all.deb

sudo dpkg -i zabbix-release_4.0-3+bionic_all.deb

sudo apt update

sudo apt install zabbix-agent

# PSK(共享密钥) / CA 加密服务器与客户端之间的通信

配置:

1
2
3
4
5
6
7
8
9
sudo vi /etc/zabbix/zabbix_agentd.conf
# 修改配置文件
Server=zab.lab.com
ServerActive=zab.lab.com
Hostname=agent1.lab.com
TLSConnect=psk
TLSAccept=psk
TLSPSKIdentity=PSK 001 # id唯一
TLSPSKFile=/etc/zabbix/zabbix_agent.psk # 存放共享密钥的文件路径

出于安全考虑,共享密钥要足够的安全,够长、够够复杂。

1
2
openssl rand -hex 32 | sudo tee /etc/zabbix/zabbix_agent.psk
# 随机生成hex 32 的字符串,用这个共享密钥来加密Zabbix的通信

添加客户端

通过web界面来添加客户端

image.png

image.png

等待一会,agent1的数据就会被收集,展示在web界面上。