安全解决方案:五、Zabbix自动化监控
优采云 发布时间: 2022-11-02 02:17安全解决方案:五、Zabbix自动化监控
文章目录
一、自动监控概述 1.1 自动添加主机
假设我们现在有 100 台主机需要添加。如果手动添加,工作量非常大。如何解决?我们可以通过zabbix提供的自动注册或者自动发现来实现批量添加主机。
1.2 自动添加主机
网络发现
活动代理自动注册
2. 网络发现概念 2.1 发现原理 2.2 规则示例
配置zabbix的网络发现主机:
2.3 网络发现实践 2.3.1 场景需求
比如我们设置IP段为192.168.20.1-192.168.20.254的网络发现规则,我们需要做的是:
2.3.2 发现场景 - 步骤 1
2.3.3 发现场景 - 步骤 2
单击配置 → 操作 → 发现操作
该操作将执行以下操作:
2.3.4 发现场景——步骤 3
定义删除丢失主机的操作
2.3.5 网络发现结果检查 2.4 网络发现总结
虽然网络发现可以发现和添加主机,但仍然存在一些问题:
3. 自动注册的概念 3.1 注册的原理
自动注册(agent auto-registration)功能主要用于代理主动向服务器注册。它和网络发现功能一样,但是这个功能更适合云环境,因为云环境中的IP地址是随机的,很难使用网络发现。实现方式;
1.注册时间短
2.适用于复杂的云环境,IP地址不规则
3.关联不同的模板
4.提高服务器性能
3.2 注册配置
自动注册主要分为两步:
1.自动注册,客户端对冲开启主动模式,并设置主机名
2.在zabbix web中配置一个自动注册动作
3.3 自动注册实践-1 3.3.1 场景需求 3.3.2 配置ZabbixAgent
每当活动代理刷新主动检查服务器的请求时,都会进行自动注册尝试。
请求的延迟在代理的 RefreshActiveChecks 参数中指定,代理重启后立即发送第一个请求
[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
点击Configuration→Action→Autoregistration actions,添加两个action,一个给web组,一个给db组;
3.3.4 自动注册结果检查
3.4 自动注册实践-2 3.4.1 场景需求 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
点击Configuration→Action→Autoregistration actions,添加两个action,一个给web组,一个给db组
3.4.4 自动注册结果检查 3.5 自动注册实践-3 3.5.1 场景需求 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
第二个动作:
4. 主动模式和被动模式的概念 4.1 主动模式和被动模式的基本概念
默认情况下,zabbix server 会直接从各个代理中抓取数据。对于代理来说,它是一种被动模式,也是获取数据的默认方式。但是当zabbix server监控的主机数量过多时,zabbix server端抓取agent上的数据时,zabbix server就会出现严重的性能问她,主要表现如下:
如何解决?可以使用主动模式,代理端主动将自己采集到的数据上报给Zabbix Server,这样Zabbix Server就会空闲很多。
4.2 主动模式和被动模式的功能区别
被动和主动模式针对的是代理;
被动模式:服务器轮询检测代理
主动模式:Agent主动向Server报告
4.3 主被动模式与发现的关系
自动发现是一种效率低下的被动模式。如果扫描的主机太多,很容易漏掉一个主机。
自动注册是一种高效的主动模式,可以根据主机名、元数据等关联不同的主机模板。
4.4 主控模式与监控项的关系
Zabbix 默认使用被动模式监控。当需要获取 100 个监控项的值时,Server 需要训练 Agent 100 次。
如果Zabbix主动模式需要获取100个监控项的值,Server会生成一个需要获取的监控项的值列表给Agent,Agent采集会发送所有完成后一次性将数据发送到服务器。
4.5 何时使用主动模式
1.队列有大量延迟监控项时
2.当监控主机超过500台时
4.6 如何切换到主动模式 4.6.1 修改代理配置
注:agent2目前不支持active模式,测试:推荐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 修改模式为active
1、克隆被动模式监控项模板
2.点击克隆模板→选择所有监控项→批量修改→zabbix客户端(活动)
3.选择主机取消并清理被动模板,然后重新关联新的“主动”模板
4.6.3 总结
当active模式切换完成后,可以继续观察zabbix server的负载,应该会下降很多。其次,运行不卡顿,图不破解,zabbix性能大幅提升。
5. 低级发现 LLD 5.1 什么是 LLD
自动发现:用于自动添加主机
低级自动发现:用于自动添加监控项
5.2 为什么需要 LLD
场景一:监控所有主机的端口,但是不同主机启动的端口不一样,怎么办?
场景二:监控所有主机的分区。不同的主机有不同的分区。我应该怎么办?
场景三:监控所有主机的网络,不同的主机有不同的配置,怎么办?
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
<p>
</p>
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 添加监控原型
点击配置→主机→自动发现规则→网络接口发现→监控项原型→创建监控项原型
5.4 LLD原理分析
为什么可以自动创建和监控eth0和eth1的mac地址?事实上,它依赖于“自动发现规则\监控原型”
5.4.1 发现规则
当我们查看“自动发现规则”时,发现它定义了一个特殊的键,net.if.discovery,可以提取主机上所有网卡的名称
[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}]
脚本:监控项(一定要预留一个可以传参数的地方)
# 编写脚本,用来获取主机所有端口,效果如下
{
"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创建自动发现规则
名称:端口发现
键值:端口发现 #获取所有端口号
5.5.5 监控项原型的Web创建
名称:检查端口 {#TCP_PORT}
键值:net.tcp.listen[{#TCP_PORT}],将端口号传递给监控项
5.5.6 网页创建触发器
5.5.7 网页结果验证
5.6 LLD监控Redis多实例实践 5.6.1 场景需求说明
redis 7001 client_connected,user,max,
redis 7002 客户端连接,用户,最大,
特殊脚本:提取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 "\" | 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 debug populate 20000000
[root@web01 ~]# redis-cli -p 7001
127.0.0.1:7001> FLUSHALL
行之有效的方法:如何有效收集资料?
要有效采集数据,做好知识管理,我认为有两大前提要掌握:
任何人都有采集信息的需求,比如采集大量的新闻事件、评论、分析报告,作为编写新文章或项目的素材。比如学习手冲咖啡的学习者,需要采集设备欣赏、冲泡方法教学,以及自己的学习心得,方便自己的学习和复习。
为了让采集到的数据在未来有用,首先我们“不能只采集死数据”,而是让自己“参与到数据中”,包括:标注数据、绘制关键点、整合相关数据,并根据目的对其进行分类等等。
而且,对于知识工作者和学习者来说,采集数据“不应该是偶然的行为”,而是一种“长期的习惯”,不断采集数据以备不时之需,内化整理自己的数据库,让你第一时间找到信息在自己的数据库中遇到问题时(需要写一篇文章文章,需要教别人煮咖啡)完成动作。
这就是所谓的“有效数据采集”,怎么做呢?以下是我作为一名长期知识工作者和学习者的建议,分享一个对我个人有用的过程。
1. 让数据源“个性化”和“自动化”,随着时间的推移开始积累
首先,我将创建自己独特的信息源,并将这条信息管道自动化,每天将我可能需要的信息发送到我的手中,并且我可以在一个统一简洁的界面中处理和分发这些信息,而无需额外的干扰。
这里最好的工具仍然是所谓的“
我利用了我每天早上花大约 30 分钟快速筛选信息这一事实。如果当天还有其他的空档,我也会打开Feedly看看,积累各种未来可能用到的信息。
我从不喜欢使用普通媒体 网站 作为我的主要信息来源,因为这就像让媒体决定我看什么。我也不相信像 Facebook 这样的社区能给我提供垂直和深入的学科知识,我害怕社区里的噪音太大。所以,我们必须自己做!
因此,这个“个性化”和“自动化”的过程非常重要。我把它当作我自己的“
如果你想进一步研究个性化和自动化的数据采集,还有更高级的方法,我将在此处跳过。有兴趣的朋友可以参考我写的另外两篇文章:
••
2.如何让数据源保持活跃?“别人的观点”和“世界的观点”
我根本没有从社区采集数据吗?当然不是,我也看社区,但那是我采集数据的第二步。而对于“
(1.) 打造个性化的自动化信息渠道:你自己的观点
上面采集的数据三部曲缺一不可,我认为它们的“使用顺序”很重要。我称之为:“自己的观点、他人的观点、世界的观点”的三层扩展。
《我的意见》:用Feedly采集你最认同网站、最钦佩、最信任的信息源,搭建渠道,每天稳步扩展你的见识,让你和这些作者一起成长,这是建立自己观点的步骤。
“别人的看法”:但我们不能只局限于自己的看法。这个时候,“社区”确实是一个很好的方式来保持数据的活力,通过不断的吸收和碰撞别人的观点来更新自己的观点。所以阅读社区,
但这里的社区不仅限于 Facebook。例如,我写了一个博客来和你讨论。它也是一个征求他人意见的社区。
《世界观》:但是,朋友圈有朋友圈的局限性,国民社会有国民社会的有限视野。如果你想能够看到更大世界的数据并找到矛盾的数据,你必须依靠谷歌搜索来跳出你习惯的信息。框架,试图找到世界的不同方面。
我的习惯是,当我看到一些来自 Feedly 的论点,或者社区的一些信息时,我不会马上做出最终的判断,而是会使用谷歌搜索来查找更多内容,尤其是试图找到相反的内容。争论,让自己的视野可以更加开阔。(
3.跳过80%的信息
在前面的方法中,我想我应该尽可能使用最好的方法来获取在线数据采集的来源。当然,我这里跳过了书中的数据通道。看书的时候,我觉得是一样的。”、“其他”和“世界”来思考如何选择你想读的书。
然而,仅有信息来源是不够的。下一步是如何高效、高质量地采集信息?
面对海量的信息,我将掌握以下原则。
首先是可以跳过80%的信息。就算是我自己的收录到Feedly信息,我也可能跳过80%的信息不看,还有哪些信息是不能跳过的?那我得回去问问自己,我现在最关心的话题是什么?我在寻找什么样的信息?
或者,如果我们想换个角度考虑一下上网,我们是不是把它当作休闲来随便看?还是因为您在网上花费的时间相同,所以将这些时间花在有目的的阅读上会更好吗?同时带来更多价值,也同样有趣。
我很久以前写了一个文章:“
4.边读边记,加强材料参与
当我看到某个文章似乎很励志的时候,我会努力尽快读完这个文章,因为此时的灵感是最大的!
而且最好能边看书,边画重点,边做笔记。这就是我一开始说的“参与”。
所以如果你不把它写下来是一种耻辱,你下次阅读这个材料时就会忘记它。
就像我看书的时候:“
这也是我喜欢使用 Evernote 的原因,它可以让我在阅读任何在线资料的同时做笔记,并最终快速保存:“(
5.采集数据是为了激发自己的想法,所以优先采集想法
为什么我们需要建立高效有效的信息渠道?我们为什么要采集数据?虽然有些数据确实是可以参考的,比如某某说的话,某某事件的数据,但其实还有很多数据是用来“激发自己的想法”的。
从这个角度来看,我应该寻找哪些信息?我要读什么书?我需要采集哪些数据?这将有更大的机会建立一个有效的数据库。
因为我应该追求我的想法笔记的完整性而不是我的数据采集的完整性。没有想法的数据,采集时间长,大多是无用的,反而造成数据库的负担。