文章目录
1. 自动化监控概述
1.1 自动化添加主机
假设我们现在有100台主机需要添加,如果是一台台手动添加,工作量非常大。怎么样解决呢?我们可以通过zabbix提供的自动注册或自动发现来实现主机的批量添加。
1.2 自动化添加主机方式
网络发现(Network discovery)
自动注册(Active agent auto-registration)
2. 网络发现概念
2.1 发现原理
- 自动发现由两个步骤组成:发现discovery 和动作action
- 1.首先zabbix 周期性扫描“网络发现规则”中定义的IP段,发现满足规则的主机
- 2.然后使这些主机完成动作,添加主机、链接模版、发送通知等
2.2 规则示例
配置zabbix的网络来发现主机:
- 首先进入配置→自动发现
- 点击创建发现规则
- 编辑自动发现规则属性
- IP范围:192.168.20.1 - 192.168.20.254指zabbix会自动扫描这个网段的所有IP,依次连接这些IP的10050端口;
- 检查:尝试通过system.uname监控项,看看是否能获取到数据,如果可以则假如该主机;
2.3 网络发现实践
2.3.1 场景需求
例如我们设置IP段为192.168.20.1-192.168.20.254的网络发现规则,我们需要怎么操作:
- 发现有zabbix agent 运行的主机
- 每10分钟执行一次
- 如果主机正常运行时间超过2分钟,添加主机
- 如果主机停机时间超过24小时,删除主机
- 将Linux主机添加到"Linux server"组、链接模版Template OS linux到linux主机
2.3.2 发现场景-步骤1
2.3.3 发现场景-步骤2
点击配置→动作→Discovery actions
- “zabbix agent"服务器是"up”
- system.uname(规则中定义的zabbix agent键值)包含“linux”
- 正常运行时间为2分钟(120秒)或者更长
该动作(action)将执行以下操作:
- 将发现的主机添加到Linux server组(如果以前未添加主机,则自动添加主机)
- 链接主机到Template OS Linux 模版
2.3.4 发现场景-步骤3
定义动作删除失联主机
2.3.5 网络发现结果检查
2.4 网络发现总结
网络发现虽然能发现并添加主机,但依然存在一些问题:
- 1.发现时间长,效率低; 因为是串行添加 1-2-3-4-5
- 2.扫描过程中容易漏扫
- 3.当IP地址不固定难以实现
- 4.无法实现不同类型主机关联不同模版
3. 自动注册概念
3.1 注册原理
自动注册(agent auto-registration)功能主要用于Agent 主动向Server注册,与网络发现有同样的功能,但是这个功能更适用于云环境下,因为云环境下IP地址是随机的,难以使用网络发现方式实现;
1、注册时间短
2、适用于云复杂环境,IP地址无规律
3、关联不同的模版
4、提高server性能
3.2 注册配置
自动注册主要分为两个步骤:
1.自动注册,客户端避险开启主动模式,并设定主机名称
2.在zabbix web中配置一个自动注册的动作
3.3 自动注册实践-1
3.3.1 场景需求
- 根据不同的主机名称关联不同的主机模版
- web主机节点,需要关联Template OS Linux模版、TCP status模版、Nginx模版
- db主机节点,需要管理Template OS Linux模版、MySQL模版
3.3.2 配置ZabbixAgent
每当活动agent刷新主动检查到服务器的请求时,都会进行自动注册尝试。
请求的延时在agent的RefreshActiveChecks参数中指定,第一个请求在agent重启后立即发送
[root@localhost ~]# vim /etc/zabbix/zabbix_agent2.conf
Server=192.168.20.46
ServerActive=192.168.20.46 #设置主动模式
Hostname=web02 #指定主机名,如不指定则服务器将使用agent的系统主机名命名主机
[root@localhost ~]# /etc/init.d/zabbix-agent2 restart
3.3.3 配置ZabbixServer
点击配置→动作→Autoregistration actions, 添加两个动作,一个是针对web组,一个是针对db组;
3.3.4 自动注册结果检查
3.4 自动注册实践-2
3.4.1 场景需求
- 根据不同主机名称关联不同的主机模版
- web主机节点,需要关联Template OS Linux模版、TCL status模版、Nginx模版、PHP模版;
- db主机节点,需要关联Template OS Linux模版、MySQL模版;
- 客户端采用Ansible Playbook实现,做到完全自动化添加主机,并智能添加模版
3.4.2 配置Ansible
#1.安装
#2.配置
server
serverActive
Hostname
#2.所有的脚本,所有的UserParameter全部导入到对应
的目录中;
#3.启动
# 脚本参考: roles_zbx.tar.gz
1.agent适用ansible来运行; (serverActive
Hostname )
2.所有的agent都需要有脚本,conf配置文件,其次,服
务必须都是启用了对应的状态(Ansible);
3.给server导入所有的模板;
3.配置server,配置自动注册的动作,根据不同主机名
称,关联不同的模板
3.4.3 配置ZabbixServer
点击配置→动作→Autoregistration actions,添加两个动作,一个针对web组,一个针对db组
3.4.4 自动注册结果检查
3.5 自动注册实践-3
3.5.1 场景需求
- 使用主机元数据来区分Linux主机和Windows主机,根据不同的操作系统关联不同的主机模版
- Linux主机关联Template OS Linux模版
- Windows主机关联Template OS Windows模版
3.5.2 配置ZabbixAgent
1、在配置文件中额外添加HostMetadataItem一行内容:
[root@web01 ~]# vim /etc/zabbix/zabbix_agent2.conf
Server=192.168.20.46
ServerActive=192.168.20.46
Hostname=web01
HostMetadataItem=system.uname
2、这样就能确保主机元数据将包含“Linux”或“Windows”,主机元数据示例如下:
#Linux主机获取的元数据信息
#Linux: Linux server3 3.2.0-4-686-pae #1
SMP Debian 3.2.41-2 i686 GNU/Linux
#Windows主机获取的元数据信息
#Windows: Windows WIN-0PXGGSTYNHO 5.0.6001
Windows Server 2008 Service Pack 1 Intel
IA-32
3.5.3 配置ZabbixServer
-
第一个动作:
- 名称: Linux主机自动注册
- 条件:主机元数据似Linux
- 操作:链接到模版: Template OS Linux
-
第二个动作:
- 名称: windows主机自动注册
- 主机以元数据似Windows
- 操作:链接到模版:Template OS Windows
4. 主动与被动模式概念
4.1 主被模式基本概念
默认情况下,zabbix server会直接去每个agent上抓去数据,对于agent来说,是被动模式,也是默认的一种获取数据的方式,但是当zabbix server 监控主机数量过多的时候,由Zabbix Server端去抓取agent上的数据,zabbix server会出现严重的性能问她,主要表现如下:
- web操作很卡,容易出现502
- 监控图形中图形断裂
- 监控告警不及时
如何解决呢? 可以使用主动模式,agent端主动汇报自己收集到的数据给Zabbix Server,这样Zabbix Server就会空闲很多。
4.2 主被模式功能区别
被动和主动模式,针对的都是Agent;
被动模式: Server轮询检测Agent
主动模式:Agent主动上报给Server
4.3 主被模式与发现的关系
自动发现属于被动模式,效率低,如果扫描主机过多,容易出现漏添主机的情况
自动注册属于主动模式,效率高,能根据主机名称、元数据等关联不同主机模版
4.4 主被模式与监控项的关系
zabbix默认使用的是被动模式监控,当需要获取100个监控项的值,需要Server向Agent轮训100次
Zabbix主动模式如需要获取100个监控项的值,Server会将要获取监控项的值生成一个清单给Agent,Agent采集完成后一次将所有数据发送给Server
4.5 何时需要使用主动模式
1.当队列存在大量延时的监控项
2.当监控主机超过500台
4.6 如何调为主动模式
4.6.1 修改Agent配置
注意: Agent2目前不支持主动模式,测试:建议使用zabbix-agent
1.修改zabbix_agentd.conf 配置文件
[root@web01 ~]# vim /etc/zabbix/zabbix_agentd.conf
ServerActive=192.168.20.46
Hostname=web01 #要与zabbixweb中添加主机对应,否则会找不到主机
2.当开启agent主动发送数据模式,还需要在zabbix server端修改两个参数,保证性能。
[root@zabbix-server ~]# vim /etc/zabbix/zabbix_server.conf
StartPollers=10 #zabbix server主动采集数据进程减少一些
StartTrappers=200 #负责处理Agent推送过来数据的进程开大一些
4.6.2 修改模式为主动式
1.克隆一份被动模式监控项的模版
2.点解克隆模版→选中所有监控项→批量修改→zabbix客户端(主动式)
3.选择主机取消并清理被动模版,然后重新关联新的“主动式”模版
4.6.3 总结
当完成主动模式的切换之后,可以持续观察图zabbix server的负载,应该会降下来不少,其次在操作上也不卡了, 图也不裂了,zabbix的性能得到较大的提升。
5. 低级发现LLD
5.1 什么是LLD
自动发现:是用来自动化添加主机的
低级自动发现:是用来自动化添加监控项的
5.2 为何需要LLD
场景1: 监控所有主机的端口,而不同的主机启动的端口都不一样,怎么办
场景2:监控所有主机的分区,不同主机分区都不一样,怎么办
场景3:监控所有主机的网络、不同的主机配置都不一样,怎么办
5.3 LLD快速体验
基于已有的自动发现规则,添加一个监控原型,用来监控所有网卡的MAC地址
5.3.1 编写网卡采集命令
[root@localhost ~]# ifconfig eth0 | awk '/eth0/ {print $NF}'
00:0C:29:1F:D3:72
[root@localhost ~]# ifconfig eth1 | awk '/eth1/ {print $NF}'
00:0C:29:1F:D3:7C
5.3.2 创建自定义监控项
[root@localhost ~]# vim /etc/zabbix/zabbix_agent2.d/system.conf
UserParameter=net.mac[*],ifconfig "$1" | awk '/$1/ {print $$NF}'
[root@localhost ~]# /etc/init.d/zabbix-agent2 restart
5.3.3 服务端测试取值
[root@zabbix-server ~]# zabbix_get -s 192.168.20.49 -k net.mac[eth0]
00:0C:29:1F:D3:72
[root@zabbix-server ~]# zabbix_get -s 192.168.20.49 -k net.mac[eth1]
00:0C:29:1F:D3:7C
5.3.4 web添加监控原型
单击配置→主机→自动发现规则→Network interface discovery→监控项原型→创建监控项原型
5.4LLD原理分析
为什么能自动创建并监控eth0、eth1的mac地址呢,其实就是依靠“自动发现规则\监控原型”来实现
5.4.1 发现规则
当我们查看“自动发现规则”的时候发现它定义了一个特殊的key,net.if.discovery,这个key可以提取到主机所有网卡名称
[root@zabbix-server ~]# zabbix_get -s 192.168.20.49 -k net.if.discovery
[{"{#IFNAME}":"lo"},{"{#IFNAME}":"eth0"},{"{#IFNAME}":"eth1"}]
5.4.2 监控原型
然后在通过“监控原型”将“自动发现规则”提取到的网卡名称依次传递给监控项,完成自动创建
如果后期增加eth2 网卡会自动添加对应的监控项,但移除eth2网卡并不会自动移除该网卡对应的监控项;
5.5 LLD监控主机端口实例
特殊监控项:提取每台主机的端口
系统:listen.tcp[{#TCP_PORT}]
脚本:监控项(必须预留能传参的位置)
- 监控每台主机端口:
- 1.定义自动发现规则
- 2.定义监控项原型
# 编写脚本,用来获取主机所有端口,效果如下
{
"data:[
{"{#TCP_PORT}":"10050"},
{"{#TCP_PORT}":"12345"},
{"{#TCP_PORT}":"22"},
{"{#TCP_PORT}":"25"},
{"{#TCP_PORT}":"3306"},
{"{#TCP_PORT}":"35934"},
{"{#TCP_PORT}":"35986"},
{"{#TCP_PORT}":"6379"},
{"{#TCP_PORT}":"80"},
{"{#TCP_PORT}":"8005"},
{"{#TCP_PORT}":"8080"}
]
}
5.5.1 编写发现规则脚本
[root@web01 ~]# vim /etc/zabbix/zabbix_agent2.d/discovery_port.sh
#!/bin/bash
port_array=($(ss -tnlp | awk '{print $4}' |awk -F ":" '{print $NF}' | egrep "^[0-9]+$" | sort | uniq | xargs))
length=${#port_array[@]}
printf "{\n"
printf '\t'"\"data\":["
index=0
for i in ${port_array[@]}
do
index=$[ $index +1 ]
printf '\n\t\t{'
if [ $index -eq ${length} ];then
printf "\"{#TCP_PORT}\":\"${i}\"}"
else
printf "\"{#TCP_PORT}\":\"${i}\"},"
fi
done
printf "\n\t]\n"
printf "}\n"
#执行脚本
[root@web01 ~]# sh /etc/zabbix/zabbix_agent2.d/discovery_port.sh
{
"data":[
{"{#TCP_PORT}":"10050"},
{"{#TCP_PORT}":"12345"},
{"{#TCP_PORT}":"22"},
{"{#TCP_PORT}":"25"},
{"{#TCP_PORT}":"3306"},
{"{#TCP_PORT}":"35934"},
{"{#TCP_PORT}":"35986"},
{"{#TCP_PORT}":"6379"},
{"{#TCP_PORT}":"80"},
{"{#TCP_PORT}":"8005"},
{"{#TCP_PORT}":"8080"}
]
}
5.5.2 创建特殊的监控项
#定义一个特殊的zabbix监控项
[root@web01 tmp]# vim /etc/zabbix/zabbix_agent2.d/discovery_port.conf
UserParameter=port.discovery,/bin/bash /etc/zabbix/zabbix_agent2.d/discovery_port.sh
#重启agent
[root@web01 zabbix_agent2.d]# /etc/init.d/zabbix-agent2 restart
5.5.3 服务端测试取值
[root@zabbix-server ~]# zabbix_get -s 192.168.20.47 -k port.discovery
{
"data":[
{"{#TCP_PORT}":"10050"},
{"{#TCP_PORT}":"12345"},
{"{#TCP_PORT}":"22"},
{"{#TCP_PORT}":"25"},
{"{#TCP_PORT}":"3306"},
{"{#TCP_PORT}":"35934"},
{"{#TCP_PORT}":"35986"},
{"{#TCP_PORT}":"6379"},
{"{#TCP_PORT}":"80"},
{"{#TCP_PORT}":"8005"},
{"{#TCP_PORT}":"8080"}
]
}
5.5.4 web创建自动发现规则
名称: port discovery
键值: port discovery #取得所有的端口号
5.5.5 web创建监控项原型
名称:Check Port {#TCP_PORT}
键值:net.tcp.listen[{#TCP_PORT}],将端口号传递至该监控项中
5.5.6 web创建触发器
5.5.7 web结果验证
5.6 LLD监控Redis多实例实践
5.6.1 场景需求说明
redis 7001 client_connected,user,max,
redis 7002 client_connected,user,max,
特殊脚本: 提取redis端口;7001 7002
脚本:自定义监控项(端口,clients_connected)
5.6.2 Redis监控配置
1.提取监控项(预留两个传参位置,port,key)
2.发现规则,脚本,提取数据,封装特殊的监控项
5.6.2.1 场景环境搭建
1.安装redis服务
[root@web01 tmp]# yum install redis -y
2.准备配置文件
[root@web01 redis.conf.d]# cat redis-7001.conf
bind 127.0.0.1
port 7001
daemonize yes
[root@web01 redis.conf.d]# cat redis-7002.conf
bind 127.0.0.1
port 7002
daemonize yes
3.启动服务
[root@web01 redis.conf.d]# redis-server ./redis-7001.conf
[root@web01 redis.conf.d]# redis-server ./redis-7002.conf
[root@web01 redis.conf.d]# netstat -tnlp | grep redis
tcp 0 0 127.0.0.1:7001 0.0.0.0:* LISTEN 13898/redis-server
tcp 0 0 127.0.0.1:7002 0.0.0.0:* LISTEN 13902/redis-server
5.6.2.2 编写采集数据脚本
[root@web01 zabbix_agent2.d]# cat redis_mutil_status.sh
#!/bin/bash
port=$1
key=$2
redis-cli -p ${port} info | grep "\<${key}\>" | awk -F ':' '{print $NF}'
#测试脚本
[root@web01 zabbix_agent2.d]# ./redis_mutil_status.sh 7001 connected_clients
1
[root@web01 zabbix_agent2.d]# ./redis_mutil_status.sh 7002 connected_clients
2
5.6.2.3 创建自定义监控项
[root@web01 zabbix_agent2.d]# cat redis_mutil_status.conf
UserParameter=rds.status[*],/etc/zabbix/zabbix_agent2.d/redis_mutil_status.sh "$1" "$2"
#重启agent2
[root@web01 zabbix_agent2.d]# /etc/init.d/zabbix-agent2 restart
5.6.2.4 服务端测试取值
[root@zabbix-server ~]# zabbix_get -s 192.168.20.47 -k rds.status[7001,connected_clients]
1
[root@zabbix-server ~]# zabbix_get -s 192.168.20.47 -k rds.status[7002,connected_clients]
2
5.6.3 配置自动发现LLD
5.6.3.1 编写发现规则脚本
[root@web01 zabbix_agent2.d]# ./redis_mutil_discovery.sh
{
"data":[
{"{#PORT}":"6379"},
{"{#PORT}":"7001"},
{"{#PORT}":"7002"}
]
}
[root@web01 zabbix_agent2.d]# cat ./redis_mutil_discovery.sh
#!/bin/bash
rds_port=($(netstat -lntp |grep redis | awk '{print $4}' | awk -F ':' '{print $NF}' | xargs))
length=${#rds_port[@]}
printf "{\n"
printf '\t'"\"data\":["
index=0
for i in ${rds_port[@]}
do
index=$[ $index + 1 ]
printf '\n\t\t{'
if [ $index -eq ${length} ];then
printf "\"{#PORT}\":\"${i}\"}"
else
printf "\"{#PORT}\":\"${i}\"},"
fi
done
printf "\n\t]\n"
printf "}\n"
#执行脚本
[root@web01 zabbix_agent2.d]# ./redis_mutil_discovery.sh
{
"data":[
{"{#PORT}":"6379"},
{"{#PORT}":"7001"},
{"{#PORT}":"7002"}
]
}
5.6.3.2 创建发现规则监控项
[root@web01 ~]# cat /etc/zabbix/zabbix_agent2.d/redis_mutil_discovery.conf
UserParameter=redis.discovery,sudo /bin/bash /etc/zabbix/zabbix_agent2.d/redis_mutil_discovery.sh
[root@web01 ~]# /etc/init.d/zabbix-agent2 restart
5.6.3.3 服务端测试取值
[root@zabbix-server ~]# zabbix_get -s 192.168.20.47 -k redis.discovery
{
"data":[
{"{#PORT}":"7001"},
{"{#PORT}":"7002"}
]
}
5.6.4 配置zabbix web
5.6.4.1 web创建自动发现规则
创建模版→自动发现→创建自动发现规则
5.6.4.2 web创建监控项原型
5.6.4.3 web创建触发器原型
名称: Redis {#PORT} 内存利用达70%
#故障表达式原型
{Template Redis Status panpancar:rds.status[{#PORT},used_memory].last()}/{Template Redis Status panpancar:redis.status[{#PORT}, total_system_memory].last()}*100>=70
#恢复表达式原型
{Template Redis Status panpancar:rds.status[{#PORT},used_memory].last()}/{Template Redis Status panpancar:redis.status[{#PORT}, total_system_memory].last()}*100<=50
5.6.4.4 web创建图形原型
5.6.4.6 测试告警并验证
[root@web01 ~]# redis-cli -p 7001
127.0.0.1:7001> debug populate 20000000
[root@web01 ~]# redis-cli -p 7001
127.0.0.1:7001> FLUSHALL