自动化监控概述
自动化添加主机
前面我们演示了手动添加一台主机的方法,很简单。但我们现在有100台主机需要添加,就会变得非常繁琐,所以我们可以通过zabbix
提供的自动注册或自动发现来实现主机的批量添加
自动化添加主机方式
网络发现(network discovery
)
自动注册(active agent auto-registration
)
网络发现概念
发现原理
- 自动发现由两个步骤组成:发现
discovery
和动作action
- 1.首先
zabbix
周期性地扫描在网络发现规则中定义的ip
段,发现满足规则的主机 - 2.然后使这些主机完成动作,即添加主机、添加模板、发送通知等待
- 1.首先
规则示例
配置zabbix-web
前端的网络发现来发现主机:
- 首先进入配置-->自动发现
- 单击创建发现规则
- 配置自动发现规则属性
ip
范围:172.15.1.1-254指zabbix
会自动扫描这个网段的所有ip
,依次连接这些ip
的10050端口(检测类型选择zabbix
客户端)- 检查:尝试通过
system.uname
监控项,看看是否能获取到数据,如果可以则加入该主机
网络发现实践
场景需求
例如我们设置ip
段为172.16.1.1-172.16.1.254的网络发现规则,我们需要:
- 发现有
zabbix agent
运行的主机 - 每10分钟执行一次
- 如果主机正常运行实践超过2分钟,添加主机
- 如果主机停机时间超过24小时,删除主机
- 将
linux
主机添加到linux servers
组,链接模板为Template OS Linux
发现场景-步骤1
发现场景-步骤2
点击配置-->动作-->discovery actions
,先配置条件
- 服务类型等于
zabbix
客户端 system.unmae
(规则中定义的zabbix agent
键值)包含linux
- 正常运行时间为2分钟(120秒)或更长
该动作(action
)将执行以下操作:
- 添加主机
- 将发现的主机添加到
linux servers
组(如果没该组,就创建) - 主机链接到
Template OS Linux
模板
发现场景-步骤3
定义动作删除失联主机
网络发现总结
- 网络发现虽然能发现并添加主机,但仍然存在一些问题
- 1.发现时间长,效率较低
- 2.扫描过程中容易漏扫
- 3.当
ip
地址不固定难以实现 - 4.无法实现不通类型主机关联不通模板
自动注册概念
注册原理
自动注册(agent auto-registration
)功能主要用于agent
主动向server
注册,与网络发现有同样的功能,但是这个功能更适用于ip
地址是随机的,难以使用网络发现方式实现
- 注册时间短
- 适用复杂的环境,
ip
地址无规律 - 关联不同的模板
- 提高
server
性能
注册配置
自动注册主要分为两个步骤:
- 1.自动注册,客户端必须开启主动模式,并设定主机名称
- 2.在
zabbix web
中配置一个自动注册的动作
自动注册实践-1
场景需求
- 根据不同的主机名称关联不同的主机模板
web
主机节点,需要关联Template OS Linux
模板、TCP Status
模板、nginx
模板、php
模板db
主机节点,需要关联Template OS Linux
模板、mysql
模板
配置zabbix agent
每当活动agent
刷新主动检测到服务器时,都会进行自动注册尝试。
请求的延迟在agent
的RefreshActiveChecks
参数中指定,第一个请求在agent
重新启动后立即发送
vim /etc/zabbix/zabbix_agent2.conf
Server=192.168.99.4
ServerActive=192.168.99.4 # 设置主动模式
Hostname=wordpress #指定主机名,如不指定则服务器将使用agent的系统主机名命名主机
# 重启agent
systemctl restart zabbix-agent2
配置zabbix server
点击配置-->动作-->AutoRegistrations,条件为主机名称包含wordpress
自动注册实践-2
场景需求
- 使用主机元数据赖区分
linux
和windows
主机,根据不同的操作系统关联不同的主机模板linux
主机关联Template OS Linux
模板windows
主机关联Template OS Windows
模板
配置zabbix agent
1.在配置文件中额外添加HostMetadataItem
一行内容:
vim /etc/zabbix/zabbix_agent2.conf
Server=192.168.99.4
ServerActive=192.168.99.4 # 设置主动模式
Hostname=wordpress #指定主机名,如不指定则服务器将使用agent的系统主机名命名主机
HostMetadataItem=system.uname
# 重启agent
systemctl restart zabbix-agent2
2.这样能确保主机元数据包含linux
或windows
,主机元数据示例如下:
# linux主机获取的元数据信息
Linux wordpress 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64
# windows主机获取的元数据信息
Windows:windows WIN-0PXGGSTYNHO 5.0.6001 Windows Server 2008 Service Pcak1 Intel IA-32
配置zabbix server
- 第一个动作:
- 名称:
linux
主机自动注册 - 条件:主机元数据包含
Linux
- 操作:链接到模板:
Template OS Linux
- 名称:
- 第二个动作:
- 名称:
Windows
主机自动注册 - 条件:主机元数据包含
Windows
- 操作:链接到模板:
Template OS Windows
- 名称:
主动模式与被动模式
主备模式基本概念
默认情况下,zabbix server
会直接去每个agent
上抓取数据,对于agent
来说,是被动模式,也是默认的一种获取数据的方式,但是当zabbix server
监控主机数量过多的时候,由zabbix server
端去抓取agent
上的数据,zabbix server
会出现严重的性能问题,主要表现如下:
- 1.
web
操作很卡,容易出现502错误 - 2.监控图像中图层断裂
- 3.监控告警不及时
如何解决呢?可以使用主动模式,agent
端主动汇报自己收集到的数据给zabbix server
,这样zabbix server
就会空闲很多
主备模式功能区别
被动和主动模式,针对的都是agent
被动模式:server
轮询检测agent
。(领导找下属询问销售业绩,每个一段时间询问一次)
主动模式:agent
主动上报给server
。(领导给下属分配业务,下属定期通知领导)
主备模式与发现的关系
自动发现属于被动模式,效率低,如果扫描主机过多,容易出现漏添加主机情况
自动注册属于主动模式,效率高,能根据主机名称、元数据等关联不同主机模板
主备模式与监控项的关系
zabbix
默认使用的是被动模式监控,当需要获取100个监控项的值,需要server
向agent
轮询100次。
zabbix
主动模式如需要获取100个监控项的值,server
会将要获取监控项的值生成一个清单发送给agent
,agent
采集完成后会一次将所有数据发送给server
何时需要使用主动模式
- 当队列存在大量延迟的监控项
- 当监控主机超过500+
如何调为主动模式
修改agent配置
1.修改zabbix_agent2.conf
vim /etc/zabbix/zabbix_agent2.conf
ServerActive=192.168.99.4 # 指定agent收集的数据发送给谁
Hostname=wordpress # 要与zabbix web中添加主机对应,否则会找不到主机
2.当开启agent
主动发送数据模式,还需要在zabbix server
端修改如下两个参数,保证性能
vim /etc/zabbix/zabbix_server_conf
StartPollers=10 # zabbix server主动采集数据进程减少一些
StartTrappers=20 # 负责处理agent推送过来数据的进程开大一些
修改模板为主动模式
- 克隆一份被动模式监控项的模板
- 点击克隆后的模板-->选中所有监控项-->批量修改-->
zabbix
客户端(主动式) - 选择主机取消链接并清理被动模板,然后重新关联主动式模板
总结
当完成了主动模式的切换之后,可以持续观察zabbix server
的负载,应该会降低不少,其次在操作上也不卡了,图也不裂了,zabbix
的性能也得到了较大的提升。
低级自动发现LLD
什么是LLD
自动发现:是用来自动化添加主机
低级自动发现:是用来自动化添加监控项
为何需要LLD
场景1:监控所有主机的端口,而不同的主机启动的端口不一样,怎么办?
场景2:监控所有主机的分区,不同的主机分区的方式都不一样?怎么办?
场景3:监控所有主机的网络,不同的主机的配置都不一样?怎么办?...
LLD极速体验
编写网卡采集命令
ifconfig eth0 | awk '/ether/ {print $2}'
fa:26:21:09:6d:00
# 客户端新建一个监控项配置文件
UserParameter=net.mac[*],ifconfig "$1" | awk '/ether/ {print $$2}'
测试取值
# 客户端测试取值
zabbix_agent2 -t net.mac[eth0]
net.mac[eth0] [s|fa:26:21:09:6d:00]
# 服务端测试取值
zabbix_get -s blue.yn.cn -k net.mac[eth0]
fa:26:21:09:6d:00
web添加监控原型
点击-->配置-->主机-->自动发现规则-->network interface discovery
-->监控项原型-->创建监控项原型
LLD原理分析
为什么能自动创建并监控eht0
的mac
地址呢,其实是依靠自动发现规则\监控项原型来实现
发现规则
当我们查看自动发现规则的时候发现它定义了一个特殊的Key
,net.if.discovery
,而这个Key
可以提取到主机所有网卡名称
zabbix_get -s blue.yn.cn -k net.if.discovery
[{"{#IFNAME}":"eth0"},{"{#IFNAME}":"lo"}]
监控原型
然后再通过监控项原型将自动发现规则中提取到的网卡名称依次传递给监控项,完成自动创建
如果后期增加eth1
网卡会自动添加对应的监控项,但移除eth1
网卡并不会自动移除该网卡对应的监控项
LLD监控主机端口实践
特殊监控项:提取主机侦听的tcp
端口
键值:listen.tcp.[{#TCP_PORT}]
脚本:监控项(必须预留能传参的位置)
- 监控每台主机侦听的
tcp
端口:- 1.定义自动发现规则
- 2.定义监控项原型
# 编写脚本,用来获取主机的所有端口,效果如下:
{
"data":[
{"{#TCP_PORT}":"111"},
{"{#TCP_PORT}":"22"},
{"{#TCP_PORT}":"3306"},
{"{#TCP_PORT}":"80"},
{"{#TCP_PORT}":"9000"}
]
}
编写发现规则脚本
vim /etc/zabbix/zabbix_agent2.d/tcpport_discovery.sh
#!/usr/bin/bash
array_tcpport=($(netstat -lntp | awk '{print $4}' | egrep "^[0-9]+" | awk -F ':' '{print $NF}' | sort | uniq
))
length=${#array_tcpport[@]}
#echo ${array_tcpport[@]}
printf "{\n"
printf "\t\"data\":[\n"
index=0
# 遍历数组
for i in ${array_tcpport[@]}
do
index=$[ $index + 1 ]
if [ $index -eq $length ];then
printf "\t\t{\"{#TCP_PORT}\":\"$i\"}\n"
else
printf "\t\t{\"{#TCP_PORT}\":\"$i\"},\n"
fi
done
printf "\t]\n"
printf "}\n"
# 执行脚本
sh tcpport_discovery.sh
{
"data":[
{"{#TCP_PORT}":"111"},
{"{#TCP_PORT}":"22"},
{"{#TCP_PORT}":"3306"},
{"{#TCP_PORT}":"80"},
{"{#TCP_PORT}":"9000"}
]
}
创建特殊的监控项
vim /etc/zabbix/zabbix_agent2.d/discovery_tcpport.conf
UserParameter=tcpport.discovery, sudo /bin/bash /etc/zabbix/zabbix_agent2.d/tcpport_discovery.sh
# zabbix用户添加sudo权限
vim /etc/sudoers
zabbix ALL=(ALL) NOPASSWD:ALL
# 重启agent
systemctl restart zabbix-agent2.service
服务端测试取值
zabbix_get -s blue.yn.cn -k tcpport.discovery
{
"data":[
{"{#TCP_PORT}":"111"},
{"{#TCP_PORT}":"22"},
{"{#TCP_PORT}":"3306"},
{"{#TCP_PORT}":"80"},
{"{#TCP_PORT}":"9000"}
]
}
web创建自动发现规则
创建 Tcp_Port Discovery by yj
模板
然后点击模板的自动发现创建发现规则
名称:tcpport discovery
键值:tcpport.discovery
,取得所有侦听的tcp
端口
web创建监控项原型
名称:Check Tcp Port{#TCP_PORT}
键值:net.tcp.listen[{#TCP_PORT}]
,将端口号通过参数传递至该监控项中
留言