Zabbix监控系统使用基础
1. 监控系统简介
1.1 监控系统采取数据通道
- ssh/telnet
- agent:master/agent
- SNMP:Simple Network Management Protocol
- IPMI:Intelligent Platform Management Interface 智慧平台管理接口
- 原本是一种Interl架构的企业系统的周边设备所采用的一种工业标准
- IPMI也是一个开放的免费标准,使用者无需支付额外的费用即可使用此标准
- JMX:Java Management eXtension (Java管理扩展)
- 监控JVM虚拟机
1.2 存储系统
- 历史数据:每次采样的结果,保存时长较短
- 历史趋势数据:每小时的最大值、最小值、平均值、统计,聚合数据,保存时长较长周期内的数据
- 历史趋势数据包比历史数据小得多
1.3 SNMP协议简介
- SNMP(Simple Network Management Protocol)“简单网络管理协议”,用于网络管理的协议。SNMP用于网络设备的管理。
1)SNMP的工作方式
- 管理员需要向设备获取数据,所以SNMP提供了 “读”操作;
- 管理员需要向设备执行设置操作,所以SNMP提供了“写”操作;
- 设备需要在重要状况改变的时候,向管理员通报事件的发生,所以SNMP提供了 “Trap”操作
2)SNMP协议的版本
- v1,v2,v3
- v2:NMS ---> agent 明文udp
- v3:认证、加密、解密
3)SNMP协议在Linux上的实现
- net-snmp 程序包
4)SNMP的组件
- MIB:Management Information Base 管理信息库(每一个agent都有一个MIB库)
- 实现了能够定义双方可接受的监控组件以及监控组件中数据存储格式的一个组件
- 还能实现将每一个被管理对象的ID (OID)对应到名称的转换,OID如:1.3.6.1.2.1
- MIB视图:MIB库的子集;
- 授权:将某MIB视图与某Community绑定来实现
- SMI:MIB表示符号
- SNMP协议本身
1.4 SNMP的工作模式
1)工作模式
- NMS端向agent端采集数据(NMS表示监控节点)
- agent端向NMS端报告数据
- NMS请求agent修改配置
2)可发起的操作
- NMS端:
- Get(获取数据)
- GetNext(获取多个下一个参数)
- Set(修改配置)
- Trap(等着捕获每一个被监控端主动发来的数据)
- agent端:
- Response返回一个或多个参数值
3)端口:UDP
- NMS:162/UDP
- agent:161/UDP
2. 各种监控软件的对比
2.1 常见的监控软件
1)Cacti
- Cacti 是一套基于 PHP、MySQL、SNMP 及 RRD Tool 开发的监测图形分析工具
- Cacti 是使用轮询的方式由主服务器向设备发送数据请求来获取设备上状态数据信息的,如果设备不断增多,这个轮询的过程就非常的耗时,轮询的结果就不能即时的反应设备的状态了
- Cacti 监控关注的是对数据的展示,却不关注数据异常后的反馈。如果凌晨 3 点的时候设备的某个数据出现异常,除非监控人员在屏幕前发现这个异常变化,否则是没有任何报警机制能够让我们道出现了异常。
2)Nagios
-
Nagios 是一款开源的免费网络监控报警服务,能有效监控 Windows、Linux 和 Unix 的主机状态,交换机、路由器和防火墙等网络设置,打印机、网络投影、网络摄像等设备。在系统或服务状态异常时发出邮件或短信报警第一时间通知运维人员,在状态恢复后发出正常的邮件或短信通知。Nagios 有完善的插件功能,可以方便的根据应用服务扩展功能
-
Nagios 已经可以支持由数万台服务器或上千台网络设备组成的云技术平台的监控,它可以充分发挥自动化运维技术特点在设备和人力资源减少成本。只是 Nagios 无法将多个相同应用集群的数据集合起来,也不能监控到集群中特殊节点的迁移和恢复。
3)Ganglia
-
Ganglia 是 UC Berkeley 发起的一个开源集群监视项目,设计用于测量数以千计的节点。Ganglia 的核心包含 gmond、gmetad 以及一个 Web 前端。
-
主要是用来监控系统性能,如:CPU 、内存、硬盘利用率, I/O 负载、网络流量情况等,通过曲线很容易见到每个节点的工作状态,对合理调整、分配系统资源,提高系统整体 性能起到重要作用,目前是监控HADOOP 的官方推荐服务。
4)Zabbix
-
Zabbix 是一个基于 WEB 界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。zabbix 能监视各种网络参数,保证服务器系统的安全运营;并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题。
-
Zabbix 是由 Alexei Vladishev 创建,目前由 Zabbix SIA 在持续开发和支持。
-
Zabbix 是一个企业级的分布式开源监控方案。
-
-
Zabbix 使用灵活的通知机制,允许用户为几乎任何事件配置基于邮件的告警。这样可以快速反馈服务器的问题。基于已存储的数据,Zabbix提供了出色的报告和数据可视化功能。这些功能使得Zabbix成为容量规划的理想方案。
-
Zabbix 支持主动轮询和被动捕获。
-
Zabbix所有的报告、统计信息和配置参数都可以通过基于Web的前端页面进行访问。基于Web的前端页面可以确保您从任何方面评估您的网络状态和服务器的健康性。
-
Zabbix是免费的。Zabbix是根据GPL通用公共许可证第2版编写和发行的。这意味着它的源代码都是免费发行的,可供公众任意使用
2.2 监控软件的优缺点
-
-
nagios 一般情况下如果需要图形可以和 cacti 配合使用
-
cacti 的监控是轮询监控,效率低,图形相对 nagios 比较好看
-
zabbix 和 nagios 因为是并发监控,对 cpu 的要求更高
-
zabbix 在性能和功能上都强大很多
-
zabbix 的图形相当漂亮
-
支持多种监控方式 zabbix-agent snmp 等等
-
支持分布式监控,能监控的 agent 非常多
-
zabbix 有图形的 web 配置界面,配置简洁
-
1)软件基本架构图示
- zabbix-server(C语言研发)
- OS:zabbix-agent(C语言研发)
- zabbix-web:GUI,用于实现zabbix设定和展示(PHP研发)
- zabbix-proxy:分布式监控环境中的专用组件
- zabbix-database:MySQL、PGSQL、Oracle、DB2
2)基本逻辑架构
3.2 Zabbix监控方式
1)被动模式
- 被动检测,相对于agent而言
- server向agent请求获取配置的各监控项相关的数据,agent接受请求,获取数据并响应给server
2)主动模式
- 主动检测,相对于agent而言,agent向server请求与自己相关监控项配置,主动的将server配置的监控项相关的数据发送给server
- 主动监控能极大的节约监控server的资源
3.3 Zabbix的常用术语
1)主机(host)
- 要监控的网络设备,可由IP或DNS名称指定
2)主机组(host group)
- 主机的逻辑容器,可以包含主机和模板,但同一个组内的主机和模板不能互相链接
- 主机组通常在给用户或用户组指派监控权限时使用
3)监控项(item)
- 一个特定监控指标的相关的数据,这些数据来自于被监控对象
- 对于item是zabbix进行数据搜集的核心,没有item,将没有数据
- 相对某监控对象来说,每个item都由“key”来进行标识
4)触发器(trigger)
- 一个表达式,用于评估某监控对象的某特定item所接收到的数据是否在合理范围内,即阈值
- 接收到的数据量大于阈值时,触发器状态将从“OK”转变为“Problem”
- 当数据量再次回归到合理范围内时,其状态将从“Problem”转换回“OK”
5)事件(event)
- 即发生的一个值得关注的事情,例如触发器的状态转变,新的agent或重新上线的agent的自动注册等
6)动作(action)
- 指对特定事件事先定义的处理方法,通过包含操作(如发送通知)和条件(何时执行操作)
7)报警升级(escalation)
- 发送报警或执行远程命令的自定义方案,如每隔5分钟发送一次警报,共发送5次等
8)媒介(media)
- 发送通知的手段或通道,如Email、Jabber或SMS等
9)通知(notification)
- 通过选定的媒介向用户发送的有关某事件的信息
10)远程命令(remote command)
- 预定义的命令,可在被监控主机处于某特定条件下时自动执行
11)模板(template)
- 用于快速定义被监控主机的预设条目集合,通常包含了item、trigger、graph、screen、application以及low-level discovery rule
- 模板可以直接链接至单个主机
12)应用(application)
- 一组item的集合
13)web场景(web scennaria)
- 用于检测web站点可用性的一个或多个HTTP请求
14)前端(frontent)
- zabbix的web接口
15)Zabbix API
- Zabbix API允许使用JSON RPC协议来创建(JSON RPC是一个无状态且轻量级的远程过程调用(RPC)传送协议,其传递内容透过JSON为主)、更新和获取Zabbix对象(如主机、监控项、图形和其他)信息或执行任何其他的自定义的任务
16)Zabbix proxy
- 一个帮助Zabbix Server搜集数据,分担Zabbix Server的负载的程序
- Zabbix Proxy是一个可以从一个或多个受监控设备收集监控数据,并将信息发送到Zabbix server的进程,基本上是代表server工作的。所有收集的的数据都在本地进行缓存,然后传送到proxy所属的Zabbix server
- 部署proxy是可选的,但是它非常有益于分散单个Zabbix server的负载。如果只有proxy收集数据,server上的进程就会减少CPU消耗和磁盘I/O负载
- Zabbix proxy需要使用独立的数据库
4. Zabbix的安装
4.1 安装Zabbix
1)安装zabbix源后安装Zabbix
rpm -Uvh https://repo.zabbix.com/zabbix/4.0/rhel/7/x86_64/zabbix-release-4.0-1.el7.noarch.rpm yum repolist # 更新yum仓库 # 因天朝防火墙的缘故,zabbix官方的源会受到影响,需要将zabbix官方源换成国内源,这里安装的是zabbix4.0 baseurl=http://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/4.0/rhel/7/$basearch/
yum -y install epel-release.noarch yum -y install zabbix-agent zabbix-get zabbix-sender zabbix-server-mysql zabbix-web zabbix-web-mysql
2)安装并设置数据库
- 安装好MySQL(或者MariaDB)后修改配置文件,然后重启数据库
[mysqld] skip_name_resolve = ON # 跳过主机名解析 innodb_file_per_table = ON # 开启独立表空间 innodb_buffer_pool_size = 256M # 缓存池大小 max_connections = 2000 # 最大连接数 log-bin = master-log # 开启二进制日志
- 创建数据库并授权账号
MariaDB [(none)]> create database zabbix character set utf8 collate utf8_bin; # 创建zabbix数据库 MariaDB [(none)]> grant all on zabbix.* to 'zbxuser'@'10.0.0.%' identified by 'woshiniba'; MariaDB [(none)]> flush privileges;
3)导入Zabbix服务表
gzip -d /usr/share/doc/zabbix-server-mysql-3.2.6/create.sql.gz # 这里包含了生成表的各种脚本
# 这个文件在zabbix-server-mysql生成的文件中
mysql -uzbxuser -h10.0.0.201 -p zabbix < create.sql # 导入sql文件生成表
4.2 配置Server端
- zabbix_server默认监听的端口:10051
- zabbix_agent默认监听的端口:10050
1)修改server端的配置文件 /etc/zabbix/zabbix_server.conf
vim zabbix_server.conf ListenPort=10051 # 默认监听端口 SourceIP=192.168.37.111 # 发采样数据请求的IP
2)设置日志
- 日志的存放位置 LogFile
- 默认日志存放在 LogFile=/var/log/zabbix/zabbix_server.log 中
- 默认用文件来记录日志,也可以发送给rsyslog日志记录系统
- 日志的滚动 LogFileSize
- 默认值为1,表示滚动,设置为0表示不滚动
- 当数据特别多的时候,可以设置为1,然后在Maximum size of log file in MB 设置当数据文件最大到多少时自动滚动
- LogFileSize=128
- 表示当文件到达128M时就自动滚动,如果设置为0就表示不滚动
- 日志的级别 DebugLevel
- 一共有6个级别,默认值为3,DebugLevel=3
- 0表示输出最少的信息,5表示输出最详细的信息
3)数据库相关的配置项
DBHost=192.168.37.111 # 数据库对外的主机 DBName=zabbix # 数据库名称 DBUser=zbxuser # 数据库用户 DBPassword=woshiniba # 数据库密码 DBPort=3306 # 数据库启动端口
4)启动服务并确认
# 启动zabbix服务 systemctl start zabbix-server.service # 查看端口以确认服务启动成功 [root@server zabbix]# ss -nutl |grep 10051 tcp LISTEN 0 128 *:10051 *:* tcp LISTEN 0 128 :::10051 :::*
4.3 配置 web GUI
- 先好构建好LAMP环境
yum install -y httpd php php-mysql php-mbstring php-gd php-bcmath php-ldap php-xml
1)查找 web GUI的配置文件
rpm -ql zabbix-web | less /etc/httpd/conf.d/zabbix.conf /etc/zabbix/web /etc/zabbix/web/maintenance.inc.php /etc/zabbix/web/zabbix.conf.php /usr/share/doc/zabbix-web-3.2.6 /usr/share/doc/zabbix-web-3.2.6/AUTHORS /usr/share/doc/zabbix-web-3.2.6/COPYING /usr/share/doc/zabbix-web-3.2.6/ChangeLog /usr/share/doc/zabbix-web-3.2.6/NEWS /usr/share/doc/zabbix-web-3.2.6/README
2)编辑配置文件
/etc/httpd/conf.d/zabbix.conf 这个配置文件就是做映射的文件
Alias /zabbix /usr/share/zabbix # 访问的时候要在主机后加上/zabbix来访问服务
3)设置时区
时区是一定要设置的,上面时区设置被注释掉是因为,在php的配置文件中设置时区,如果在php的配置文件中设置时区,则对所有的php服务均生效,如果在zabbix.conf中设置时区,则仅对zabbix服务有效,所以,在php配置文件中设置时区:
[root@hgzero ~]# vim /etc/php.ini [Date] ; Defines the default timezone used by the date functions ; http://php.net/date.timezone date.timezone = Asia/Shanghai
4)启动httpd服务
systemctl start httpd
systemctl enable httpd
4.4 浏览器访问并进行初始化设置
访问 http://10.0.0.202/zabbix 即可进入配置页面,接下来一路下一步即可,如果遇到初始化过程中部分内容出现失败,则可以到 /etc/php.ini 文件中将对应的配置项修改成符合要求的大小即可。
若连接不上数据库,则可以去查看zabbix的日志文件 /var/log/zabbix/zabbix_server.log 找到问题所在。
zabbix管理页面的默认登录用户和密码分别为:
- 用户名:Admin
- 密码:zabbix
4.5 配置agent端
1)安装对应的包
- 要在被监控的主机上安装好agent,设置好server,并添加到server端,然后将其纳入监控系统中
- agent端安装上 zabbix-agent 和 zabbix-sender包即可
yum install zabbix-agent zabbix-sender -y
2)修改配置文件
- 对配置文件做一个备份后,之后再修改配置文件
cd /etc/zabbix/
cp zabbix_agentd.conf{,.bak}
- 对于配置文件的配置段的解释:
- 需要修改以下配置项:
Server=127.0.0.1,10.0.0.202 # 指明服务器是谁,这里其实做的是基于IP地址的授权表示允许哪些地址来获取数据,这里可以指定多个地址 ListenPort=10050 # 自己监听的端口 ListenIP=0.0.0.0 # 自己监听的地址,0.0.0.0表示本机所有地址 StartAgents=3 # 启动几个Agent进程 ServerActive=127.0.0.1,10.0.0.202 # 主动监控时,将数据主动发往哪台服务器,也可以指定多个地址 Hostname=node1.hgzerowzh.com # 自己能被server端识别的名称,要全局唯一
# 注意,当本机既是server又是agent时,不要将以上的127.0.0.1去掉,否则无法获取数据
3)启动服务
systemctl start zabbix-agent.service
ss -ntul |grep 10050
4.6 zabbix产生的数据
- 配置数据
- 历史数据:50Bytes
- 历史趋势数据:128Bytes
- 事件数据:130Bytes
5. zabbix的监控过程详解
5.1 修改密码&中文版
5.2 创建主机及主机组
1)定义一个主机组
2)添加主机
5.3 定义监控项
任何一个被监控项(item),如果想要能够被监控,一定要在zabbix-server端定义了能够连接至zabbix-agent端,并且能够通过命令获取信息;或者在agent端定义了能够让server端获取命令;一般都是内建的命令,都对应的有其名字,称之为key。
- key值可以使用命令手动的来获取:
[root@c7_node_02 ~]# zabbix_get -s 10.0.0.201 -p 10050 -k "system.cpu.intr"
1)定义Application应用集
- 应用集一般配合监控项使用,是多个同类型的监控项的分类目录
2)定义一个不带参数的监控项
- 监控项存储的值:
- - As is: 不对数据做任何处理(存储的为原始值)
- - Delta:(simple change)(变化),本次采样减去前一次采样的值的结果
- - Delta:(speed per second)(速率),本次采样减去前一次采样的值,再除以经过的时长
3)定义一个带参数的监控项
- 参数
- [] 表示需要参数,里面的值即为参数
- <> 为不可省略的
- if 表示是接口名
- <mode> 表示是哪种模式,包括但不限于:packet(包)、bytes(字节)、errors(错误)、dropped(丢包)、overuns等等
- 通过命令行来查看:
[root@c7_node_02 ~]# zabbix_get -s 10.0.0.201 -p 10050 -k "net.if.in[ens33,packets]"
- 注意:
- 每个key背后都应该有一个命令或者脚本来负责实现数据收集,此命令或脚本可调用传递给key的参数,调用方式为 $1,$2 ...
- 在zabbix中定义item时调用某key,还需要额外定义数据采集频率、历史数据的保存时长等
- 每个Item key的官方文档(zabbix 4.0)
5.4 Zabbix可视化
- zabbix可以通过graph、screen、map等来自定义数据的可视化图形
1)定义图Graphs
2)定义聚合图形(Screens)
- 屏幕Screen用于集中展示多个数据源的相关信息,可实现快速浏览关注的信息
- screen就是一个图表,在创建时可以指定其行数和列数,而后在每个格子中指定要展示的内容
3)幻灯片展示(Slide shows)
- 如果有多个聚合图形想要按顺序展示,就可以定义一个幻灯片
- 这样打开以后显示的是图片1,30s以后会自动切换为图片2,这样就可以实现幻灯片展示,就不需要去手动切换了
4)定义拓扑图(Maps)
- 在拓扑图中,可以定义成一个负责的网络连接图,可以使用一台主机来连接另一台主机,这样就可以查看出到底是哪个链接出了问题
5.5 触发器trigger
5.5.1 触发器简介
当采集的值定义完了以后,就可以定义触发器:
- 触发器:界定某特定的item采集到的数据的非合理区间或非合理状态,通常为逻辑表达式
- 逻辑表达式(阈值):通常用于定义数据的不合理区间
- OK(不符合条件):正常状态
- PROBLEM(符合条件):非正常状态
评定采样数值是否为合理区间的方法:根据最后N次的平均值来判定结果,这个最后N次通常有两种定义方式:
- 最近N分钟所得结果的平均值
- 最近N次所得结果的平均值
触发器存在可调用的函数:
nodata() # 是否采集到数据,采集不到则为异常 last() # 最近几次 date() # 时间,返回当前的时间,格式YYYYMMDD time() # 返回当前的时间,HHMMSS格式的当前时间。 now() # 返回距离Epoch(1970年1月1日00:00:00UTC)时间的秒数 dayofmonth() # 返回当前是本月的第几天
注意:能用数值保存的就不要使用字符串
5.5.2 触发器表达式
1)触发器表达式格式
{<server>:<key>.<function>(<parameter>)}<operator><constant> # server:主机名称
# key:主机上关系的相应监控项的key
# function:评估采集到的数据是否在合理范围内时所使用的函数,其评估过程可以根据采取的数据、当前时间及其它因素进行 # 目前所支持的函数有avg、count、change、date、dayofweek、delta、diff、iregexp、last、max、min、nodata、now、sum等 # parameter:函数参数;大多数数值函数可以接受秒数为其参数,而如果在数值参数之前使用“#”做为前缀,则表示为最近几次的取值, # 如sum(300)表示300秒内所有取值之和,而sum(#10)则表示最近10次取值之和 # 此外,avg、count、last、min和max还支持使用第二个参数,用于完 成时间限定;例如,max(1h,7d)将返回一周之前的最大值
2)表达式所支持的运算符及功能
5.5.3 定义触发器
1)进入触发器定义页面
- Configuration ——> Hosts ——> 选择主机 ——> Triggers ——> create trigger
2)定义触发器
- 表达式可以直接点击右侧的添加,然后定义自己所需的内容,即可自动生成
然后去看对应监控项的graph图,里面就有了一根线,就是定义的值,超过线的即为异常状态。但是现在即使超过了这根线,仅仅会产生一个触发器事件而不会做其他任何操作,因此,需要去定义一个动作(action)。
5.5.4 触发器的依赖关系
触发器之间可能会存在依赖关系的,一旦某一个触发器被触发了,那么依赖这个触发器的其余触发器都不需要再报警了。
多台主机是通过交换机的网络连接线来实现监控的,如果交换机出了故障,那么主机自然也无法继续被监控,那么这些主机统统都会报警,但是实际上只需要交换机报警就可以了。为了解决这样的问题,就需要定义触发器之间的依赖关系,当交换机挂掉时,只有交换机自己报警就可以了,其他的主机就不需要再报警了。这样,也有利于判断真正的故障所在。
zabbix不能直接定义主机间的依赖关系,其依赖关系仅能够通过触发器来定义。
- 触发器可以有多级依赖:
5.6 动作action
5.6.1 简介
需要去基于一个对应的事件为条件来指明该做什么事,一般就是执行远程命令或者发警报
告警升级机制:当发现问题的时候,一般是先执行一个远程操作命令,如果能够解决问题,就会发一个恢复操作的讯息给接收人,如果问题依然存在,则会执行发警报的操作,一般默认的报警接收人是当前系统中的zabbix账户,所以当有人需要收到警报操作的话,则需要把它加入我们的定义之中。
每一个用户也应该有一个接受告警信息的方式,即媒介,就像接收短信是需要有手机号一样。对于一个媒介来说,每一个用户都有一个统一的或者不同的接收告警信息的端点,称之为目标地或者目的地。
所以,为了能够发告警信息:1.要事先定义一个媒介;2.还要定义这个媒介上用户接收消息的端点(在用户上,我们也称之为用户的媒介)
5.6.2 定义一个媒介(media)
- 发告警邮件到网易邮箱:
- 首先要登录网易163邮箱开启SMTP服务并添加授权密码
- 如果使用SSL/TLS方式进行验证,则SMTP的端口要改成994
- 定义用户接收的媒介类型
- 一个用户可以添加多个接收的媒介类型
5.6.3 定义动作action(发送message)
- 动作是在某些特定条件下触发的,比如,某个触发器被触发了,就会触发动作
5.6.4 定义动作action(执行远程命令)
因为执行远程命令时,是zabbix-server端控制在zabbix-agent上执行的,相当于在子进程中执行,所以需要sudo来临时拥有管理员权限执行该操作,因此,需要在虚拟机上进行编辑配置文件使zabbix用户能够临时拥有管理员权限
需要进行两项操作:
- 在zabbix-agent端修改sudo配置文件使zabbix用户能够临时拥有管理员权限
- 在zabbix-agent端修改zabbix配置文件使其允许接收远程命令
[root@node1 ~]# visudo ## Allow root to run any commands anywhere root ALL=(ALL) ALL zabbix ALL=(ALL) NOPASSWD: ALL # 添加的一行,表示不需要输入密码 [root@node1 ~]# vim /etc/zabbix/zabbix_agentd.conf EnableRemoteCommands=1 # 允许接收远程命令 LogRemoteCommands=1 # 把接收的远程命令记入日志 [root@node1 ~]# systemctl restart zabbix-agent.service
- 注意:
- 远程命令不支持主动模式(active模式)的agent
- 不支持代理模式
- 命令长度不得超过255个字符
- 远程命令可以使用宏
- zabbix-server仅执行命令,而不关心命令是否执行成功
- 提示:
- 在填写命令时,前面要加上sudo,否则不能正常执行
- 要在visudo中注释 Defaults requiretty
5.6.5 自定义告警脚本
1)定义脚本的位置
在 /etc/zabbix/zabbix_server.conf 文件中定义了这个位置
- AlertScriptsPath=/usr/lib/zabbix/alertscripts
在这个目录下装入的脚本需要重启zabbix-server才会被读取
脚本中可使用$1,$2,$3 来调用action中的邮件的收件人,Default Subject,Default Message
2)脚本示例
#!/bin/bash to="$1" # 指明收件人 subject="$2" # 指明主题 body="$3" # 指明邮件内容 echo "$body" | mail -s "$subject" "$to" # 发送邮件
- 然后给它执行的权限:
- chmod +x /usr/lib/zabbix/alterscripts/alerttest.sh
3)脚本调用
可以在 Media types 中添加一个媒介,类型Type选择为Script,脚本名Script name为刚刚创建的脚本名alerttest.sh
然后可以在Users中的Media中选择alertscript
5.7 宏Macro
5.7.1 宏macro概述
1)宏简介
- 宏是一种抽象,它根据一系列预定义的规则替换一定的文本模式,解释器或编译器在遇到宏时会自动进行这一模式替换
- 简单的说,宏就是一种变量
- zabbix有许多内置的宏,如 {HOST.NAME}、{HOST.IP}、{TRIGGER.DESCRIPTION}、{TRIGGER.NAME}、{TRIGGER.EVENTS.ACK}
2)宏的级别
宏一共有三种级别,分别是全局宏、模板宏、主机宏,不同级别的宏观的适用范围也不一样
- 全局宏也可以作用于所有的模板宏和主机宏,优先级最低
- 模板宏则可以作用于所有使用该模板的主机,优先级排在中间
- 主机宏则只对单个主机有效,优先级最高
3)宏的类型
- 宏的类型分为系统内建的宏和用户自定义的宏
- 为了更强的灵活性,zabbix还支持在全局、模板或主机级别使用用户自定义宏(user macro)
- 系统内建的宏在使用的时候需要 {MACRO} 的语法格式,用户自定义宏要使用 {$MACRO} 这种特殊的语法格式
- 宏可以应用在 item keys 和description、trigger 名称和表达式、主机接口 IP/DNS 及端口、discovery机制的SNMP协议的相关信息中
- 宏的名称只能使用大写字母、数字及下划线
5.7.2 宏的定义
- 如果想要在监控项 items上使用红,就要先去定义一个红,然后去创建监控项,直接引用定义好的宏即可
1)定义全局宏
2)定义主机宏
3)定义模板宏
5.8 模板
- 模板是一系列配置的集合,它可以通过“链接”的方式快速部署在某监控对象上,并支持重复应用
- 模板链接到主机上时,才会生效
5.9 维护时间maintenance
- 在维护时间内,定义被维护的服务器不会报警
6. Zabbix用户参数
6.1 用户参数概述
1)用户参数
- 自定义用户参数(自定义key),有时我们需要使用自定义的命令来检索需要的数据
- 可以将其配置在配置文件中的用户参数中(UserParameter)
2)用法格式
UserParameter=<key>,<command> # key:自定义的key,一个用户参数也包含一个键 # command:获取这个key对应的值所需要执行 的命令
- 注意:配置好后需要在client端冲去agent服务
6.2 用法示例
1)修改agent端的配置,设置用户参数
# 先要在zabbix_agentd.d下创建一个文件,专门放置某一类的UserParameter [root@c7_node_03 zabbix]# vim /etc/zabbix/zabbix_agentd.d/ifconfig.conf UserParameter=ifconfig.RX,ifconfig ens33 | awk '(NR==5){print $3}' # 然后一定要重启agent服务,否则不生效 [root@c7_node_03 zabbix]# systemctl restart zabbix-agent
2)在zabbix-server端进行查询
[root@c7_node_02 zabbix_agentd.d]# zabbix_get -s 10.0.0.203 -p 10050 -k "ifconfig.RX" 450352
3)添加一个item监控项
6.3 带参数的key
1)带参数的用户参数
- 在配置文件中写入
UserParameter=memory.info[*], cat /proc/meminfo | awk '/^$1/{print $$2}' # $$2,表示不是调用前面位置参数的$2,而是awk的参数 $2 # $1 是调用前面的 [*],位置参数,第一个参数 # 然后将zabbix-agent重启 systemctl restart zabbix-agent
2)在zabbix-server端,查询这个用户参数的key
zabbix_get -s 10.0.0.203 -p 10050 -k "memory.info[MemFree]"
3)其他操作和上面完全相同
6.4 其他的一些UserParameter
# 监控系统内存使用信息 UserParameter=os.memory.used, free -m | awk '/^Mem/{print $3}' # 监控nginx相关信息 UserParameter=Nginx.active[*],/usr/bin/curl -s "http://$1:$2/status" | awk '/^Active/ {print $NF}' UserParameter=Nginx.reading[*],/usr/bin/curl -s "http://$1:$2/status" | grep 'Reading' | cut -d" " -f2 UserParameter=Nginx.writing[*],/usr/bin/curl -s "http://$1:$2/status" | grep 'Writing' | cut -d" " -f4 UserParameter=Nginx.waiting[*],/usr/bin/curl -s "http://$1:$2/status" | grep 'Waiting' | cut -d" " -f6 # 监控MySQL相关信息 UserParameter=Mysql.dml[*],/usr/local/mysql/bin/mysql -h$1 -u$2 -p$3 -e 'SHOW GLOBAL STATUS' | awk '/Com_$4\>{print $$2}'
7. Zabbix网络发现
7.1 网络发现概述
1)介绍
zabbix提供网络发现功能(network discovery),可以通过HTTP、ICMP、SSH、LDAP、TCP、SNMP、Telnet、Zabbix_agent等扫描指定网络内的主机,它能够根据用户事先定义的规则自动添加监控的主机或服务等。
一旦主机被发现,如何对其进行操作,将由action来决定
2)发现方式
- IP地址范围
- 可用服务(ftp,ssh,http,...)
- zabbix_agent的响应
- snmp_agent的响应
7.2 网络发现的过程
1)discovery
- zabbix定期扫描网络发现规则中定义的IP地址范围;检查的频率对每个规则都是可配置的, 每个规则都有一组用于为IP范围执行的服务检查
- 由网络发现模块执行的服务和主机(IP)的每个检查都会生成一个发现事件
- 8种响应事件
2)actions
网络发现中的事件可以触发action,从而自动执行指定的操作,把discovery events当做前提条件
- Sending notifications 发送通知
- Adding/removing hosts 添加/删除主机
- Enabling/disabling hosts 启用/禁用host
- Adding hosts to a group 向组中添加主机
- Removing hosts from a group 移除组中的主机
- Linking hosts to/unlinking from a template 从模板链接主机或取消链接
- Executing remote scripts 执行远程脚本
这些事件的配置还可以基于设备的类型、IP、状态、上线/离线 等进行配置
3)网络发现:接口添加
网络发现中添加主机时会自动创建interface接口
- 如果基于SNMP 检测成功,则会创建SNMP 接口
- 如果某服务同时响应给了agent 和SNMP ,则**两种接口都会创建**
- 如果同一种发现机制( 如agent) 返回了非惟一数据,则**第一个接口被识别为默认,其它的为额外接口**
- 即便是某主机开始时只有agent 接口,后来又通过snmp 发现了它,同样会为其添加额外的snmp 接口
- 不同的主机如果返回了相同的数据,则第一个主机将被添加,余下的主机会被当作第一个主机的额外接口
7.3 网络发现的配置示例
1)准备一台可被发现的主机,安装软件并进行配置
# 安装agent端的一些包 yum install zabbix-agent zabbix-sender -y # 将之前已有的配置传到这台机器上,然后修改hostname vim /etc/zabbix/zabbix_agentd.conf Hostname=node50.hgzero.com # visudo修改sudo的配置 visudo #Defaults !visiblepw zabbix ALL=(ALL) NOPASSWD:ALL # 然后启动zabbix-agent systemctl start zabbix-agent
2)设置自动发现规则discovery
- 注意:更新时间间隔设置为1h就好,不要扫描太过频繁,扫描整个网段,太废资源;这里为了实验,设为10m
3)自动发现成功
7.4 设置自动发现的动作
1)创建自动发现的动作
2)设置action动作
- 添加主机完成之后,就可以关闭网络扫描了,因为太耗资源了
7.5 自动注册
- 自动注册,auto_registation(Active Agent Auto-Registration)
1)在Agent端进行配置
# 安装zabbix-agent zabbix-sender yum install zabbix-agent zabbix-sender -y # 修改配置文件/etc/zabbix/zabbix_agentd.conf ServerActive=10.0.0.202 # 主动监控模式下,Server端的地址,自动注册时这个选项非常重要 Server=10.0.0.202 # 被动监控模式下,Server端的地址 ListenIP=10.0.0.50 # 本机监听地址,设置为本机某特定IP地址 HostMetadata=字符串 # 长度范围为0~255,用于识别主机以完成自动注册 HostMetadataItem=system.uname # 一般使用system.uname,获取这个key的数据后发送到Server端以完成自动注册
2)配置action,要求其事件来源为auto-registation
- 保存之后等一会儿这台主机就会自动注册成功了
7.6 LLD(Low Level Discovery)
由于主机在某些情况下对应的数据可能不同,如文件系统的路径不一样、接口的名称有可能不一样,这个时候在发现时可以使用LLD规则,去获取到每个被监控的主机上某个我们要获取的值。一旦完成调用,就可以在创建item时针对不同的主机来替换不同的参数值
- 自动发现特定变量的名称
- 服务端向客户端请求数据时,首先向客户端索取客户端的某些特定信息,而Agent端返回的是JSON格式的数据
- 添加针对变量的Items
- 常用的
- IFNAME 对方的接口名
- FSNAME 对方的文件系统的名称
8. Web监控
8.1 Web监控概述
1)Web监控
- 监控指定站点的资源下载速度、页面响应时间、响应代码等
2)术语
- web Scenario:web场景(站点)
- web page:web页面,一个场景有多个页面
- 内建key:要测一个页面,要测三个步骤:(内建key)
- web.test.time[Scenario,Step]: 响应时长
8.2 监控web示例
1)创建
- 可以在 “Hosts” 或 “Templates” 中创建 Web scenarios
2)配置web监控
3)查看
9. 主动 / 被动 监控
9.1 概述
1)被动检测
- 相对于agent而言;agent
- Server向agent请求获取配置的各监控项相关的数据,agent接收请求、获取数据并响应给server
2)主动检测
- 相对于agent而言;agent(active)
- agent主动向server请求与自己相关监控项配置,主动的将server配置的监控相关的数据发送给server
- 主动监控能极大的节约监控server的资源
3)zabbix_sender发送数据
- 实现人工生成数据,发送给server端
# zabbix server上的某主机上,直接定义Item时随便定义一个不会冲突的key即可 # item type为 “zabbix trapper” # zabbix_sender的用法 zabbix_sender -z zabbix_server_ip -p zabbix_server_port -s zabbix_agent_hostname -k key -o value 值
# 使用示例 zabbix_sender -z 10.0.0.202 -p 10051 -s node50.hgzero.com -k "system.cpu.intr"
9.2 被动监控
只需要在agent端配置好ServerActive、Hostname的值,然后在Web上设置item时选择 “agent(active)” 类型即可
其他步骤和被动监控并无差异