Zabbix3.4入门教程

Linux下常用的系统监控软件有 Nagios、Cacti、Zabbix、Monit 等,这些开源的软件可以帮助我们更好的管理机器,在第一时间内发现问题,并及时发送告警,通知系统维护人员

Zabbix简介

Alexei Vladishev创建了Zabbix项目,当前处于活跃开发状态,Zabbix SIA提供支持

  • Zabbix是一个企业级的、开源的、分布式的监控套件

  • Zabbix可以监控网络和服务的监控状况。Zabbix 利用灵活的告警机制,允许用户对事件发送基于 Email 的告警,这样可以保证快速的对问题作出相应。Zabbix 可以利用存储数据提供杰出的报告及图形化方式,这一特性将帮助用户完成容量规划

  • Zabbix支持 polling 和 trapping 两种方式,所有的 Zabbix 报告都可以通过配置参数在 WEB 前端进行访问,Web 前端将帮助你在任何区域都能够迅速获得你的网络及服务状况,Zabbix 可以通过尽可能的配置来扮演监控你的 IT 基础框架的角色,而不管你是来自于小型组织还是大规模的公司

  • Zabbix是零成本的. 因为 Zabbix 编写和发布基于 GPL V2 协议,意味着源代码是免费发布的

  • Zabbix公司也提供商业化的技术支持.

Zabbix的功能

  • 应用监控:数据库/SSH/Apache/Nginx等应用程序的监控。

  • 服务器监控:CPU,内存,SWAP,磁盘空间,网卡流量的监控等.

  • 网络设备监控:支持Cisco, Juniper, 3Com等网络设备,网络设备通过SNMP(SNMP (v1,v2,v3) devices)协议进行监控。

  • 自定义监控:对于Zabbix无法满足的监控,可以添加自定义监控。

Zabbix的特性

  • 数据收集

    • 可用性及性能检测
    • 支持SNMP(trapping及polling)、IPMI、JMX监控
    • 自定义检测
    • 自定义间隔收集收据
    • server/proxy/agents吸能
  • 灵活的阀值定义

    • 允许灵活地自定义问题阀值,Zabbix中称为触发器(trigger), 存储在后端数据库中
  • 高级告警配置

    • 可以自定义告警升级(escalation)、接收者及告警方式
    • 告警信息可以配置并允许使用宏(macro)变量
    • 通过远程命令实行自动化动作(action)
  • 实时绘图

    • 通过内置的绘图方法实现监控数据实时绘图
  • 扩展的图形化显示

    • 允许自定义创建多监控项视图
    • 网络拓扑(network maps)
    • 自定义的面板(screen)和slide shows,并允许在dashboard页面显示
    • 报告
    • 高等级(商业)监控资源
  • 历史数据存储

    • 数据存储在数据库中
    • 历史数据可配置
    • 内置数据清理机制
  • 配置简单

    • 主机通过添加监控设备方式添加
    • 一次配置,终生监控(译者注:除非调整或删除)
    • 监控设备允许使用模板
    • 支持多种语言,包括中文
  • 模板使用

    • 模板中可以添加组监控
    • 模板允许继承
    • 系统自带多种监控模版
  • 网络自动发现

    • 自动发现网络设备
    • agent自动注册
    • 自动发现文件系统、网卡设备、SNMP OID等
  • 快速的web接口

    • web前端采用php编写
    • 访问无障碍
    • 你想怎么做就能做么做
    • 审计日志
  • Zabbix API

    • Zabbix API提供程序级别的访问接口,第三方程序可以很快接入
  • 权限系统

    • 安全的权限认证
    • 用户可以限制允许维护的列表
  • 全特性、agent易扩展

    • 在监控目标上部署
    • 支持Linux及Windows
  • 二进制守护进程

    • C开发,高性能,低内存消耗
    • 易移植
  • 具备应对复杂环境情况

    • 通过Zabbix proxy可以非常容易的创建远程监控
    • 支持分布式部署和WEB集中管理

Zabbix的优缺点

  • 优点

    • 安装配置简单,支持多种语言,包括中文。
    • 系统自带多种监控模板,可以直接使用。
    • 支持分布式部署和WEB集中管理(通过WEB页面设置或查看报警结果)。
    • 自动化功能,自动发现,自动注册主机,自动添加模板,自动添加分组
    • 支持自定义监控
    • 触发器,报警条件有多重判断机制
    • 支持多种监控方式,agent,snmp,ipmi,jmx
  • 缺点

    • 需要在被监控机器上面安装agent
    • 配置信息都存储在数据库里面,数据库是整个监控平台的瓶颈

Zabbix的组件

默认情况下,zabbix 包含5个程序:zabbix_agentdzabbix_getzabbix_senderzabbix_serverzabbix_proxy、可选程序 zabbix_java_gateway (需要另外安装),以及 web 前端组件和数据存储系统

  • zabbix_agentd:被监控端守护进程,监控本地资源和应用,将收集数据(CPU负载、内存、硬盘使用情况等)汇报给Zabbix Server。zabbix_agentd 并不是必须的,因为zabbix系统支持众多的监控数据采集方法,通过被监控设备代理采集监控数据只是其中的一种方法。

  • zabbix_get:zabbix工具,单独使用的命令,通常在server或proxy端执行,用于获取被监控端数据,多用于排错

  • zabbix_sender:zabbix工具,单独使用的命令,发送数据给server或proxy端,通常用于耗时较长的check,并且与trapper配合使用。生产环境中,个别消耗时间较长的check经常导致zabbix超时,于是我们在脚本执行完后,使用sender主动提交数据。

  • zabbix_server:服务端守护进程,zabbix_agentdzabbix_getzabbix_senderzabbix_proxyzabbix_java_gateway的数据最终都提交到server 端。zabbix_server 负责所有监控设备和监控项目配置、数据的存储与报表的生成和展示、报警的发送等。(数据不都是主动提交给server,多数情况下都是server主动去获取数据)

  • zabbix_proxy: zabbix代理守护进程,功能和 server 类似。唯一不同的是它只是一个中转站,需要把收集到的数据 提交/被提交 到 server 端。一般跨机房、地区的环境需要用到 proxy。可以减轻 Zabbix Server 的压力

  • zabbix_java_gateway:Java网关,zabbix2.0之后引入的一个功能。类似与agentd,但只用于Java方面。需要特别注意的是,它只能主动去获取数据,而不能被动获取数据。它的数据最终会提交给server或proxy。

  • Web前端组件:通过Web界面进行管理和维护操作

  • 数据存储系统:所有被监控主机和被监控项目的配置信息以及系统所采集的所有监控数据都存储在数据库中

Zabbix环境需求

软硬件需求

内存和磁盘

基本需求:128M内存、256M硬盘。硬盘需要考虑的问题:监控条目越多、历史记录保留时间越久数据库将会越大。100台server,做基本的CPU、内存、硬盘、网卡流量等监控,建议硬盘空间80GB

CPU

由Zabbix数据库使用情况而定,如果监控条目越多,选择的CPU应该越好

其他硬件

如果有必要的话,可准备GSM短信猫

硬件配置样例

Name Platform CPU/Memory Database Monitored hosts
Small CentOS Virtual Appliance MySQL InnoDB 100
Medium CentOS 2 CPU cores/2GB MySQL InnoDB 500
Large RedHat Enterprise Linux 4 CPU cores/8GB RAID10 MySQL InnoDB or PostgreSQL >1000
Very large RedHat Enterprise Linux 8 CPU cores/16GB Fast RAID10 MySQL InnoDB or PostgreSQL >10000

数据库硬盘容量计算

每秒处理的数据量

这里的每秒只是一个平均值,例如:3000个监控项,均为60秒刷新一次,那么平均每秒有50(3000/60)个数据要处理。也就是说每秒有50条数据要存储到MySQL(或其他数据库)中。

历史记录保存时间

一般情况下,zabbix监控项值都要存储到数据库中,并且保留一段时间。假如一个数据需要保存30天,而且每秒有50个值要保存,这30天要存储129 600 000(300 * 24小时 * 3600秒 * 50)个值
一条记录需要多少容量:容量由当前使用的数据库引擎和存储的数据类型(浮点型、整型、字符型等)共同决定。通常,一条记录需要占用大约50个字节,这个案例中129 600 000个记录大约需要(129 600 000 * 50)6.5GB的硬盘空间

趋势数据保存时间

什么是趋势数据?当查看一周或一月的图标,图表上看到的 MAX / MIN / AVG / COUNT / 都是取自趋势数据,趋势数据一小时获取一次。通常,一条趋势数据大约占用128字节,如果需要保存5年的趋势数据,3000个监控项每年需要2.4GB(3000 个 * 24小时 * 365天 * 128字节),5年共16.8GB。

事件记录保存时间

报警、警告、恢复等事件。一个事件大概占用130个字节,通常情况下不会有太多的事件,除非运维做的很糟糕,或者运维要求太严格,把阈值调的很低。如果每秒有一个事件发生,那么一年事件记录占用的数据空间为: (1天 * 365天 * 24小时 * 3600秒 * 130字节) 大约4.1G空间。

数据库空间计算公式

  • zabbix配置占用:固定大小,一般 < 10MB
  • 历史数据:天数 *(监控项总数 / 更新频率)* 24小时 * 3600秒 * 50字节
  • 趋势数据:天数 *(监控项总数 / 3600)* 24 小时 * 3600秒 * 128 字节
  • 事件数据:天数 * 事件个数(大概值)* 24 小时 * 3600 秒 * 130 字节

安装 Zabbix

这里使用了编写好的 shell 脚本,基于 CentOS 7.x 版本的系统进行安装的,并且使用的是 rpm 包安装方式。另外安装服务器端的同时也应该安装客户端,因为服务器端到自己本身的监控也应该配置

需要说一下,MariaDB 数据库管理系统是 MySQL 的一个分支,主要由开源社区在维护,采用 GPL 授权许可。

开发这个分支的原因是:甲骨文公司收购了 MySQL 后,有 将MySQL 闭源的潜在风险,因此社区采用分支的方式来避开这个风险。
MariaDB 的目的是完全兼容 MySQL,包括API和命令行,使之能轻松成为 MySQL 的代替品。

准备工作

配置系统基础环境

1
2
3
4
5
6
7
8
9
10
11
12
13
# 关闭防火墙:
systemctl stop firewalld

# 禁止掉防火墙开机自启:
systemctl disable firewalld

# 关闭selinux:

setenforce 0
# 临时关闭

sed -ri 's/(^SELINUX=).*/\1disabled/' /etc/sysconfig/selinux /etc/selinux/config
# 永久关闭

脚本安装服务器端

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#!/bin/bash

if test -d /tmp/zabbix_IS_ok ;then
echo ''
echo 'Zabbix already configured , unable to run again'
echo ''
echo "You can access http://$(hostname -I | awk '{print $1}')/zabbix"
exit 3
else
# Check network
repo_URL="repo.zabbix.com"
http_code=$(curl -s --connect-timeout 10 --max-time 20 -o /dev/null -w %{http_code} ${repo_URL})
if [[ ${http_code} -ne 200 ]];then
echo "URL ${repo_URL} is unreachable , please check your network"
exit 5
else
mkdir -p /tmp/zabbix_IS_ok
fi
fi

# 在这里定义数据库的密码
# --------------------------------------------------
zabbix_DBPpassword='zabbix'
# --------------------------------------------------

# Install Repository with MySQL database
rpm -ivh http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm

# Install Zabbix server, frontend, agent, get
yum -y install zabbix-server-mysql zabbix-web-mysql zabbix-get

# Install Mysql's branch mariadb
yum -y install mariadb-server
for cmd in start enable status;do systemctl ${cmd} mariadb.service; done

# Create initial database
mysql -e 'create database zabbix character set utf8 collate utf8_bin;'
mysql -e 'grant all privileges on zabbix.* to zabbix@localhost identified by ''"'"${zabbix_DBPpassword}"'"'';'

# Import initial schema and data. You will be prompted to enter your newly created password.
zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p"${zabbix_DBPpassword}" zabbix

# Configure the database for Zabbix server.Edit file /etc/zabbix/zabbix_server.conf
sed -ri.origin "/^# *DBPassword=/aDBPassword=${zabbix_DBPpassword}" /etc/zabbix/zabbix_server.conf


# Configure PHP for Zabbix frontend. Edit file /etc/httpd/conf.d/zabbix.conf, uncomment and set the right timezone for you.
sed -ri.origin '/# php_value date.timezone/a\\tphp_value date.timezone Asia/Shanghai' /etc/httpd/conf.d/zabbix.conf

# Install fonts
yum -y install wqy-microhei-fonts
"cp" /usr/share/fonts/wqy-microhei/wqy-microhei.ttc /usr/share/fonts/dejavu/DejaVuSans.ttf

# Start and enable services
for s in zabbix-server httpd ;do
systemctl start ${s}.service
systemctl enable ${s}.service
done

# Print messages
echo "You can access http://$(hostname -I | awk '{print $1}')/zabbix"

脚本安装客户端

  • 要让 zabbix 查到主机名需要编辑 /etc/hosts 文件
1
2
hostName=$(hostname);
fgrep "${hostName}" /etc/hosts || echo "客户端的IP地址 ${hostName}" >> /etc/hosts
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
#!/bin/bash

# 在这里定义服务器端的 IP 地址
# --------------------------------------------------
Zabbix_Server_IP='192.168.127.157'
# --------------------------------------------------

if test -d /tmp/zabbix_agent_is_ok ;then
echo ''
echo 'Zabbix agent already configured , unable to run again'
echo ''
exit 3
else
# Check network
repo_URL="repo.zabbix.com"
http_code=$(curl -s --connect-timeout 10 --max-time 20 -o /dev/null -w %{http_code} ${repo_URL})
if [[ ${http_code} -ne 200 ]];then
echo "URL ${repo_URL} is unreachable , please check your network"
exit 5
else
mkdir -p /tmp/zabbix_agent_is_ok
fi
fi

# Install Repository
rpm -ivh http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm

# Install Zabbix agent, sender
yum -y install zabbix-agent zabbix-sender

# Configure the Server, ServerActive, Hostname for Zabbix agent. Edit file /etc/zabbix/zabbix_server.conf
sed -ri.origin -e "s#^(Server)=.*#\1=${Zabbix_Server_IP}#" -e "s#^(ServerActive)=.*#\1=${Zabbix_Server_IP}#" -e "/^Hostname=/s@^@# @" /etc/zabbix/zabbix_agentd.conf

# Create UserParameter
echo 'UserParameter=login.user,who | wc -l' >> /etc/zabbix/zabbix_agentd.d/userparameter_login.conf

# Start services
for cmd in start enable status;do systemctl ${cmd} zabbix-agent.service; done

连通性检查

服务器端安装了 zabbix-get 工具便可以进行到客户端的测试

1
2
3
4
[root@ZabbixServer ~]# zabbix_get --host 192.168.127.155 --port 10050 --key "system.cpu.load[all,avg1]" 
0.000000
[root@ZabbixServer ~]# zabbix_get --host 192.168.127.157 --port 10050 --key "system.cpu.load[all,avg1]"
0.010000

注意事项

注意

如果服务器端配置的 IP 地址有多个,需要配置源地址 SourceIP=。因为默认情况下服务器端会从默认出口的第一个 IP 地址作为源地址建立 session ,如果客户端配置的 Server= 是服务器端的其他 IP 就会出现连接被拒绝的情况。例如:

  • 在服务器端配置有两个 IP 地址 192.168.127.156192.168.127.157 ,默认情况下会监听所有的地址
  • 在客户端配置的服务器端的 IP 为 Server=192.168.127.157
  • 可能出现服务器端是以 192.168.127.156 作为源地址去客户端获取数据,而客户端允许的服务器为 192.168.127.157 。这种情况查看客户端的日志 /var/log/zabbix/zabbix_agentd.log 就会有如下记录:
1
2894:20180515:145944.712 failed to accept an incoming connection: connection from "192.168.127.156" rejected, allowed hosts: "192.168.127.157"

另外,在多 IP 环境中的服务器端进行到本机客户端测试的时候要注意指定的 IP 应该和 /etc/zabbix/zabbix_agentd.conf 中的 Server= 的地址相同,否则会提示配置错误:

1
2
3
4
5
[root@ZabbixServer ~]# zabbix_get --host 192.168.127.156 --port 10050 -k "system.cpu.load[all,avg1]" 
zabbix_get [22225]: Check access restrictions in Zabbix agent configuration

[root@ZabbixServer ~]# zabbix_get --host 192.168.127.157 --port 10050 -k "system.cpu.load[all,avg1]"
0.000000

建议

  • 为了避免这种情况的发生,我们应该在服务器端上配置 SourceIP= ,在客户端上配置 Server= ,并且配置相同的 IP 地址

其他

  • 在客户端的配置中 Hostname= 并不是必须的,因此脚本配置过程中会将此行注释

  • 服务器端存在的同时也可以作为Client 端,在使用 zabbix-get 的时候指定的 host

Web端的操作

安装web管理页面

  • 访问 http://192.168.127.157/zabbix

  • 接下来进行环境需求检查,正常情况下都是 OK 状态,否则查看具体的报错信息进行不同的解决

  • 配置数据库,没有特殊需要则输入数据库密码即可

  • 配置 zabbix 细节性的信息,HostPort 保持默认不变即可,Name 进行自定义配置

  • 查看摘要信息,没有异常情况则进行下一步

  • 完成安装

  • 进入登录页面, 默认账号 Admin ,密码 zabbix ,注意要区分大小写

  • 中文环境、主题选择以及 web 前端页面报警:登录成功后,点击页面右上角的用户头像,进入用户配置
    • 语言和主题选择:User 标签下的 Language 下拉菜单选择 Chinese (zh_CN) ,在 Theme 下拉菜单选择 Dark
    • 前端页面启用声音报警:Messaging 标签下,勾选 Frontend messaging ,并将 Trigger severity 下不同严重级别都勾选上
    • 最后点击 Update 即可

修改主机信息

使用客户端安装脚本在服务器端安装之后,便可以将服务器端同时也作为客户端。

  • 依次点击 配置 => 主机 => Zabbix server

  • 配置服务端的信息

    • 主机名称: 一般和服务器的主机名保持一致,这是 zabbix_server 程序用的,也可以根据实际情况自定义
  • 可见名称: 显示在 web 网页上的名称,呈现给我们来看的
  • agent 代理程序的接口:

    • IP地址:客户端的 IP 地址,对于服务端来说虽然客户端也是自己,但这里不建议不使用 127.0.0.1 而是使用物理网卡上的地址
    • DNS名称 :可以进行 DNS 解析的域名,如果环境允许的话推荐使用 DNS 作为接口。如果这里配置了 www.test.com ,那么当客户端因为迁移或其他原因,导致 IP 地址发生了变更,就不需要在 web 端修改主机的 IP 了
  • 启用状态:用来配置该主机是否要进行监控

添加新的主机

在要被监控的服务器上安装客户端之后,便可以在 web 页面添加并监控了

  • 依次点击 配置 => 主机 => 创建主机

  • 然后进行链接模板,自带模板 Template OS Linux 提供CPU、内存、磁盘、网卡等常规监控,只要新加主机关联此模板,就可自动添加这些监控项

  • 添加成功后将会列出来

查看数据

  • 依次点击 监测中 => 最新数据

  • 使用过滤器过滤出相应的主机后则可以列出监控的条目,并且可以查看最新的数据

查看图形

  • 依次点击 监测中 => 图形 ,选择相应的主机和图形即可展现出来

添自定义监控

实际生产环境中,可能不是所有监控数据都能通过zabbix自带的内建 key 监控,有时候也需要自定义 key 来监控,我们先以监控系统登录用户数做个示范。

自定义参数

1
UserParameter=<key>,<shell command>
  • 示例
1
2
UserParameter=login.user,who | wc -l
UserParameter=login.user,/bin/bash /server/scripts/login.sh
  • 创建自定义参数
1
echo 'UserParameter=login.user,who | wc -l' >> /etc/zabbix/zabbix_agentd.d/userparameter_login.conf
  • 创建参数后需要重启服务
1
systemctl restart zabbix-agent
  • 服务器端进行测试
1
2
[root@ZabbixServer ~]# zabbix_get --host 192.168.127.155 --port 10050 --key login.user
2

web端添加监控

创建自定义模板

  • 为了不改变系统原有的模板,可以创建自己定义的一个模板
  • 依次点击 配置 => 模板 => 创建模板

  • 点击添加之后,使用过滤器即可看到创建出来的模板

创建应用集

  • 应用集可以看作是目录或文件夹,其作用是给监控项分类
  • 依次点击 应用集 => 创建应用集

创建监控项

  • 监控项指的是具体监控哪一项数据
  • 依次点击 监控项 => 创建监控项

创建监控项的时候,要注意选择上应用集

创建触发器

  • 触发器的作用是当监控项获取到的值达到一定条件时就触发相应的操作,比如邮件报警,或者远程执行命令
  • 依次点击 触发器 => 创建触发器

创建图形

  • 以图形的方式展示出来监控信息
  • 依次点击 图形 => 创建图形

主机关联模板

  • 一个主机可以关联多个模板
  • 依次点击 配置 => 主机,点击要关联的主机名称并进入 模板 标签页面关联模板并更新

查看监控的图形

条件触发测试

  • 开启多个终端来增加登录用户数,并查看图形的趋势变化以及仪表板上的问题显示

自定义脚本报警媒介

  • 仅仅靠web端的页面展示或声音告警并不能很好的通知维护人员,因此需要报警平台或者第三方客户端来更方便更及时地通知别人,系统自带的媒介类型可能对于我们来说不太适用,因此可以进行自定义
  • 使用自定义脚本媒介后 zabbix 将会传递信息给脚本,脚本接收参数后进行相应的处理

使用下面的方式可以看到自定义脚本的配置目录

1
2
[root@ZabbixServer ~]# egrep -i ^alertscripts /etc/zabbix/zabbix_server.conf
AlertScriptsPath=/usr/lib/zabbix/alertscripts

使用Email

传送门 = > 官方参考链接

  • 大致步骤:
    • 在 zabbix 服务器端配置邮件发送脚本,修改zabbix服务端配置文件
    • 在 zabbix 前端控制台进行相关设置

邮件和脚本配置

  • 安装软件包 mailx,为了避免脚本发送出现乱码最好同时装上 dos2unix
1
yum -y install mailx dos2unix
  • 注册并设置邮箱,网易邮箱配置比较简单

  • 服务器端 mail 配置 /etc/mail.rc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 指定的邮件发送人smtp-auth-user和smtp-auth-password分别进行用户名和密码的验证;
set from=***********@163.com

# 指定使用的邮件服务器
set smtp=smtp.163.com

# 认证发送人
set smtp-auth-user=**********@163.com

# 认证发送人密码或客户端授权密码
set smtp-auth-password=**********

# 认证方式
set smtp-auth=login
  • 邮件发送测试,并查看收件人是否成功收到邮件
1
echo "Test mail" | mail -s "hello" 收件人@xxxx.com
  • 编写 zabbix 发送邮件的脚本 /usr/local/etc/alertscripts/sendmail.sh
1
2
3
4
5
6
7
8
9
#!/bin/bash
export LANG=en_US.UTF-8

to=$1
subject=$2
echo "$3" > /tmp/zabbix_mailbody

dos2unix /tmp/zabbix_mailbody
mail -s "$subject" "$to" < /tmp/zabbix_mailbody
  • 修改脚本属主属组和权限
1
2
chown -R zabbix.zabbix /usr/lib/zabbix/alertscripts/
chmod +x /usr/lib/zabbix/alertscripts/sendmail.sh

web端报警媒介配置

  • 创建自定义邮件脚本媒介:依次打开 管理 => 报警媒介类型 => Email ,将其禁用然后 创建媒体类型 进行自定义,并且注意需要指定传递给邮件发送脚本的参数: 邮件接收方 {ALERT.SENDTO} 、邮件标题 {ALERT.SUBJECT} 、邮件内容 {ALERT.MESSAGE}

  • 设置用户报警媒介:依次打开 管理 => 用户 => Admin ,然后打开 报警媒介 标签,添加脚本并配置收件人邮件地址、什么时候使用

配置相关的动作

这个是针对触发器设定的,当监控项的数据达到一定的条件就会使触发器执行设定好的动作,一个动作可以针对多个触发器设定,当他们满则条件时都会执行相应的动作。因为我们用的是邮件报警,所以当发生故障,触发器被触发时 zabbix 给相关用户的邮箱发送邮件,当故障恢复后还会发送恢复邮件,这样就可以把机器及业务的运行状态及时的监控起来

  • 创建动作

  • 动作名称和条件:条件是针对动作何时执行,可以多个条件并存或者任意存在,还可以编写相关的逻辑进行判断

  • 操作配置

  • 恢复操作配置

  • 触发测试:以登录用户为例,多个终端登录被监控机后测试触发器和动作,在仪表板将会显示对应的问题和动作状态。当故障恢复后会执行相应的恢复动作

使用Slack

简介

Slack 是一款 聊天群组 + 大规模工具集成 + 文件整合 + 统一搜索 的软件,整合了电子邮件、短信、Google Drives、Twitter、Trello、Asana、GitHub 等 65 种工具和服务,可以把各种碎片化的企业沟通和协作集中到一起

要注意的是,Slack 的通信已 被墙 导致在大陆无法正常使用,并且账号注册也有一定的限制,因此如果条件不允许请量力而行

slack配置

  • 创建 workspace

  • 完成一系列的内容填写之后,创建一个 channnel 用来给 zabbix 发送告警信息,还可以根据不同部门添加不同的 channnel

  • 创建公共的 channel

  • 客户端效果图

  • 在 zabbix 服务器端配置脚本 /usr/local/etc/alertscripts/slack.sh
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
44
45
46
47
48
49
50
#!/bin/bash

# Example
# bash slack.sh '#zabbix-alert' PROBLEM 'Oh no! Something is wrong!'

# Slack incoming web-hook URL and user name
#url='CHANGEME' # example: https://hook.bearychat.com/XXX/zabbix/XXXXXXXXXXXXXXXXXXXXXXX
url=''
# ---------------------------
# 复制相应的webhook的URL
# ---------------------------

username='Zabbix'

## Values received by this script:
# To = $1 (Slack channel or user to send the message to, specified in the Zabbix web interface; "@username" or "#channel")
# Subject = $2 (usually either PROBLEM or RECOVERY/OK)
# Message = $3 (whatever message the Zabbix action sends, preferably something like "Zabbix server is unreachable for 5 minutes - Zabbix server (127.0.0.1)")

# Get the Slack channel or user ($1) and Zabbix subject ($2 - hopefully either PROBLEM or RECOVERY/OK)
to="$1"
subject="$2"

# Change message emoji depending on the subject - smile (RECOVERY/OK), frowning (PROBLEM), or ghost (for everything else)
recoversub='^RECOVER(Y|ED)?$'
if [[ "$subject" =~ ${recoversub} ]]; then
emoji=':smile:'
elif [ "$subject" == 'OK' ]; then
emoji=':smile:'
elif [ "$subject" == 'PROBLEM' ]; then
emoji=':frowning:'
else
emoji=':ghost:'
fi

# The message that we want to send to Slack is the "subject" value ($2 / $subject - that we got earlier)
# followed by the message that Zabbix actually sent us ($3)
message="${subject}: $3"

# Build our JSON payload and send it as a POST request to the Slack incoming web-hook URL
payload="payload={\"channel\": \"${to//\"/\\\"}\", \"username\": \"${username//\"/\\\"}\", \"text\": \"${message//\"/\\\"}\", \"icon_emoji\": \"${emoji}\"}"
curl -m 5 --data-urlencode "${payload}" $url -A 'zabbix-slack-alertscript / https://github.com/ericoc/zabbix-slack-alertscript'

# --------------------------------------------------
# 调试内容,可以方便地知道zabbix传入的参数,前两条需要root在命令行执行
# --------------------------------------------------
#touch /tmp/zabbix.log
#chown zabbix:zabbix /tmp/zabbix.log
#echo ''"$payload"'' >| /tmp/zabbix.log
#echo "$@" >> /tmp/zabbix.log
  • 修改脚本属主属组和权限
1
chmod +x /usr/lib/zabbix/alertscripts/slack.sh
  • 命令行调试
1
bash slack.sh '#zabbix-alert' PROBLEM 'Oh no! Something is wrong!'
  • 效果图

web端报警媒介配置

  • 创建自定义邮件脚本媒介:依次打开 管理 => 报警媒介类型 => 创建媒体类型 进行自定义,并且注意需要指定传递给 Slack 发送脚本的参数: 接收方 {ALERT.SENDTO} 、标题 {ALERT.SUBJECT} 、内容 {ALERT.MESSAGE}

  • 设置用户报警媒介:依次打开 管理 => 用户 => Admin ,然后打开 报警媒介 标签,添加脚本并配置收件人的 channel 、什么时候使用

配置相关的动作

  • 创建动作

  • 操作配置

  • 恢复操作配置

  • 触发测试:以登录用户为例,测试效果

使用倍洽

倍洽(BearyChat)与 Slack 类似,zabbix 结合 倍洽 进行自定义媒介的方式可参照 Slack 的配置

官网:https://bearychat.com/

机器人配置教程:https://bearychat.com/integrations/zabbix

用到的脚本和 Slack 的类似,但是传入的参数需要删除 #,在 zabbix 的 web 端的收件人和 Slack 相同都需要加 #,例如 #zabbix-alert

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
44
45
46
47
48
49
50
51
52
53
#!/bin/bash

# Example
# 需要注意的是这里传给脚本的第一个参数如果带 # 则无法发送成功
# bash bearychat.sh 'zabbix-alert' PROBLEM 'Oh no! Something is wrong!'

# BearyChat zabbix web-hook URL
#url='CHANGEME' # example: https://hook.bearychat.com/XXX/zabbix/XXXXXXXXXXXXXXXXXXXXXXX
url=''
# ---------------------------
# 复制相应的webhook的URL
# ---------------------------

## Values received by this script:
# To = $1 (Slack channel or user to send the message to, specified in the Zabbix web interface; "@username" or "#channel")
# Subject = $2 (usually either PROBLEM or RECOVERY)
# Message = $3 (whatever message the Zabbix action sends, preferably something like "Zabbix server is unreachable for 5 minutes - Zabbix server (127.0.0.1)")

# Get the Slack channel or user ($1) and Zabbix subject ($2 - hopefully either PROBLEM or RECOVERY)
#to="${1}"
# --------------------------------------------------
# 将原始的修改为以下去除#的形式
# --------------------------------------------------
to=$(echo ${1} | sed -r 's@#@@')
STATUS="$2"

# Change message emoji depending on the subject - smile (RECOVERY), frowning (PROBLEM), or ghost (for everything else)
recoversub='^RECOVER(Y|ED)?$'
if [[ "$STATUS" =~ ${recoversub} ]]; then
emoji=':smile:'
elif [ "$STATUS" == 'PROBLEM' ]; then
#emoji=':frowning:'
emoji=':red_circle:'
else
#emoji=':ghost:'
emoji=':large_blue_circle:'
fi

# The message that we want to send to Slack is the "subject" value ($2 / $subject - that we got earlier)
# followed by the message that Zabbix actually sent us ($3)
message="${STATUS} \n$3"

# Build our JSON payload and send it as a POST request to the BearyChat incoming web-hook URL
payload="payload={\"channel\": \"${to//\"/\\\"}\", \"text\": \"${emoji} ${message//\"/\\\"}\"}"
curl -m 5 --data-urlencode "${payload}" $url -A 'zabbix-bearychat-alertscript / https://github.com/ericoc/zabbix-bearychat-alertscript'

# --------------------------------------------------
# 调试内容,可以方便地知道zabbix传入的参数,前两条需要root在命令行执行
# --------------------------------------------------
#touch /tmp/zabbix.log
#chown zabbix:zabbix /tmp/zabbix.log
#echo ''"$payload"'' >| /tmp/zabbix.log
#echo "$@" >>/tmp/zabbix.log

服务监控

监控ssh服务

假设生产线上的 Linux 主机的 ssh 服务端口有默认的 22 ,以及自定义的 9022 ,因此需要两个监控项

  • 在自定义模板中创建应用集,也可以使用系统自带模板 Template App SSH Service

  • 创建监控项

  • 点击创建监控项,创建默认端口的监控项

  • 再次创建监控项,创建 9022 端口的监控项

  • 创建触发器

  • 点击进入表达式构造器,添加 9022 端口ssh服务的表达式

  • 条件表达式,只要有一个端口正常我们就认为服务运行正常,因此所有端口都没有运行就认为ssh服务故障

  • 在被监控机做触发测试,可以将ssh服务端口换成其他的,并且只监听一个端口,注意不要被防火墙踢出

监控nginx状态

发现

网络发现

概述

Zabbix提供了有效和非常灵活的网络自动发现功能,当网络发现正确设置后你可以:

  • 加快Zabbix部署
  • 简化管理
  • 无需过多管理就能在快速变化的环境中使用Zabbix

Zabbix网络发现基于以下信息:

  • IP范围
  • 可用的外部服务(FTP,SSH,WEB,POP3,IMAP,TCP等)
  • 来自 zabbix agent 的信息(仅支持未加密模式)
  • 来自 snmp agent 的信息

发现

Zabbix定期扫描网络发现规则中定义的IP范围,并为每个规则单独配置检查的频次。

请注意,一个发现规则始终由单一发现进程处理,IP范围主机不会被分拆到多个发现进程处理。

每个规则中都定义了一组需要检测的服务。

动作

zabbix 所有 动作 都是基于发现事件,例如:

  • 发送通知
  • 添加/删除主机
  • 启用/禁用主机
  • 添加主机到组
  • 从组中删除主机
  • 将主机链接到模板/从模板中取消链接
  • 执行远程脚本命令

基于事件的网络发现动作, 可以根据设备类型、IP地址、状态、运行时间/停机时间等进行配置,查看动作操作和 条件页面。

配置网络发现规则

参考链接:https://www.zabbix.com/documentation/3.4/zh/manual/discovery/network_discovery/rule

例如我们设置IP段为 124.160.121.64/27115.231.107.98-115.231.107.126 的网络发现规则:

  • 配置 => 自动发现 =>创建发现规则(或在自动发现规则名称上编辑现有规则) => 编辑自动发现规则属性

  • 设备唯一性准则:

    • IP地址 - 使用 IP 地址作为设备唯一性标识,不处理多IP设备。如果具有相同IP的设备已经存在,则将认为已经发现,并且不会添加新的主机。
    • 发现检查类型 - 使用 SNMP 或者 Zabbix agent 的 check 作为唯一标识。
  • 选择事件源并创建动作

  • 定义名称和触发条件

  • 定义操作

  • 查看已发现的设备

监测中 => 自动发现

自动注册

概述

活动的Zabbix agent可以自动注册到服务器进行监控,这种方式无需在服务器上手动配置它们

当以前未知的active agent要求检查时,会发生自动注册。

该功能可能非常方便自动监控新的Cloud节点。一旦在Cloud Zabbix中有一个新节点,Zabbix将自动启动主机监控,并进行性能和可用性数据的收集。

Active agent自动注册还支持对被添加的主机进行被动检查的监控。当active agent要求检查时,提供它配置文件中定义的“ListenIP”或“ListenPort”配置参数,这些参数将发送到服务器。(如果指定了多个IP地址,则第一个将被发送到服务器。)

服务器在添加新的自动注册主机时,使用接收到的IP地址和端口配置agent。如果没有接收到IP地址值,则使用传入连接的IP地址。如果没有接收到端口值,则使用10050。

客户端指定服务器

在使用客户端安装脚本进行安装时已经包含了相关的配置,下面是详细的说明

在客户端的配置文件 /etc/zabbix/zabbix_agentd.conf 中指定服务器

1
ServerActive=10.0.0.1

如果你没有在配置文件 /etc/zabbix/zabbix_agentd.conf 中特别定义了 Hostname,则服务器将使用 agent 的系统主机名命名主机。Linux 中的系统主机名可以通过运行 hostname 命令获得。修改配置后需要重启 agent

active agent自动注册动作

当服务器从 agent 收到自动注册请求时,它会调用一个动作。事件源“自动注册”的操作必须配置为 agent 自动注册

  • 在 Zabbix 页面,转到 配置 => 动作,选择 自动注册 为事件源,然后单击 创建操作
    • 动作选项卡,定义 Action 名称
    • 操作选项卡中,添加添加主机添加到主机组(例如,发现的主机),链接到模板

自动发现(LLD)

概述

自动发现(low-level discovery)提供了一种在计算机上为不同实体自动创建监控项,触发器和图形的方法。例如, Zabbix 可以在你的机器上自动开始监控文件系统或网络接口,而无需为每个文件系统或网络接口手动创建监控项。此外,可以配置 Zabbix 根据定期执行发现后的得到实际结果,来移除不需要的监控项。

在Zabbix中,支持六种类型的发现项目

  • 系统文件的发现;
  • 网络接口的发现;
  • CPU和CPU内核的发现
  • SNMP OID的发现
  • 使用ODBC SQL查询的发现
  • Windows服务的发现

用户可以自己定义发现类型,只要它们遵循特定的JSON协议

发现过程的一般架构如下:

  • 用户在“配置”→“模板”→“发现”列中创建一个发现规则。发现规则包括(1)发现必要实体(例如,文件系统或网络接口)的项目和(2)应该根据该项目的值创建的监控项,触发器和图形的原型

    • 发现必要实体的项目就像其他地方所看到的常规项目:服务器向该项目的值询问 Zabbix agent(或者该项目的任何类型的设置),agent 以文本值进行响应。区别在于 agent 响应的值应该包含特定 JSON 格式的发现实体的列表。这种格式的自定义检查者发现的细节才是最重要的,因为返回值必须包含 宏<=>值 对,例如:
1
项目 `net.if.discovery` 可能会返回两对键值:`{#IFNAME} <=> lo` 和 `{#IFNAME} <=> eth0`
  • 这些宏用于名称,键值和其他原型字段中,然后用接收到的值为每个发现的实体创建实际的监控项,触发器,图形甚至主机

  • 当服务器接收到发现项目的值时,它会查看宏→值对,每对都根据原型生成实际监控项,触发器和图形。在上面的“net.if.discovery”示例中,服务器将生成环路接口“lo”的一组监控项,触发器和图表,另一组用于界面“eth0”。

以下部分将详细说明上述过程,并作为一个指导上述类型的所有发现。最后一节描述了发现项目的JSON格式,并给出了文件系统发现实现的Perl脚本的示例。

配置示例

办公室的网关上需要针对大量 url 做监控,来保证基本网络的正常访问。要求 url 状态异常则报警

  • 创建自定义脚本
1
2
mkdir -pv /usr/lib/zabbix/scripts
vim /usr/lib/zabbix/scripts/web_site_code_status.sh
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
44
45
#!/bin/bash

UrlFile="/usr/lib/zabbix/scripts/url.txt"
IFS=$'\n'

web_site_discovery () {
lines_number=$(egrep -v "^(#|$)" ${UrlFile} | wc -l )

echo -e '{'
echo -e '\t"data":['

while read the_mark the_url the_proxyip the_other;do
(( lines_number -= 1 ))
if [ ${lines_number} -ne 0 ] ; then
echo -e '\t\t{"{#SITENAME}":"'"${the_mark} ${the_url}"'","{#PROXYIP}":"'"${the_proxyip}"'"},'
else
echo -e '\t\t{"{#SITENAME}":"'"${the_mark} ${the_url}"'","{#PROXYIP}":"'"${the_proxyip}"'"}'

echo -e '\t]'
echo -e '}'
fi
done < <(egrep -v "^(#|$)" ${UrlFile})
}

web_site_code () {
if [ "$3" == "" ]; then
/usr/local/bin/curl -s --connect-timeout 10 -m 20 -o /dev/null -w %{http_code} "$2"
elif echo $3 |grep ':' &>/dev/null ; then
/usr/local/bin/curl -s --connect-timeout 10 -m 20 -o /dev/null -w %{http_code} "$2" -x $3
else
/usr/local/bin/curl -s --connect-timeout 10 -m 20 -o /dev/null -w %{http_code} "$2" -x $3:80
fi
}

case "$1" in
web_site_discovery)
$1
;;
web_site_code)
$1 $2 $3 $4
;;
*)
echo "Usage : $0 { web_site_discovery | web_site_code [URL]}"
;;
esac
1
chmod +x /usr/lib/zabbix/scripts/web_site_code_status.sh
  • 配置域名列表
1
vim /usr/lib/zabbix/scripts/url.txt
1
2
3
4
腾讯 www.qq.com
百度 www.baidu.com
新浪 www.sina.com.cn
test www.test.cn
  • 配置客户端自定义参数
1
vim /etc/zabbix/zabbix_agentd.d/web_site_discovery.conf
1
2
UserParameter=web.site.discovery,/usr/lib/zabbix/scripts/web_site_code_status.sh web_site_discovery
UserParameter=web.site.code[*],/usr/lib/zabbix/scripts/web_site_code_status.sh web_site_code $1 $2 $3
  • 重启客户端服务
1
systemctl restart zabbix-agent
  • 服务器端键值测试
1
2
3
4
5
6
7
8
9
10
11
12
[root@ZabbixServer ~]#  zabbix_get --host 124.160.121.82 --port 10050 -k web.site.discovery
{
"data":[
{"{#SITENAME}":"腾讯 www.qq.com ","{#PROXYIP}":""},
{"{#SITENAME}":"百度 www.baidu.com ","{#PROXYIP}":""},
{"{#SITENAME}":"新浪 www.sina.com.cn ","{#PROXYIP}":""},
{"{#SITENAME}":"test www.test.cn ","{#PROXYIP}":""}
]
}

[root@ZabbixServer ~]# zabbix_get --host 124.160.121.82 --port 10050 -k web.site.code["腾讯 www.qq.com "]
200
  • 为了方便管理,专门针对这个功能创建一个自定义模板和应用集,下面是创建完成的应用集显示

  • 创建自动发现规则

  • 创建监控项原型

  • 创建触发器原型

  • 构造表达式

  • 主机关联模板

  • 很快就会发现监控项自动生成

有钱任性,请我吃包辣条
0%