zabbix中通过模板实现自动发现对tcp端口批量监控
主要为了解决监控大量端口,避免繁琐的重复操作监控项和触发器
诸位~ 仅供参考哈
自动发现监控参考地址:
https://blog.csdn.net/qq_37510195/article/details/130893655
模板
- 首先创建一个模板
自定义名称和群组
- 创建自动发现规则
模板——自动发现——创建发现规则
- zabbix-agent配置文件
UnsafeUserParameters=1
UserParameter=tcpportlisten,/home/shell/discoverport.sh
(key) (脚本地址,zabbix必须有执行权限)
4. linux脚本参考(仅供参考)
创建一个discoverport.sh文件
#!/bin/bash
portarray=(`sudo netstat -tnlp|egrep -i "java|nginx|mysql|minio"|awk {'print $4'}|awk -F':' '{if ($NF~/^[0-9]*$/) print $NF}'`)
servicename=(`sudo netstat -tnlp|egrep -i "java|nginx|mysql|minio"|awk {'print $7'}|awk -F'/' '{print $NF}'|sed 's/:$//'`)
# 定义端口和服务名称的映射关系 键值对
declare -A service_map=(
[8761]="eureka-server"
[9000]="gateway-server"
[10001]="core-server"
[10002]="device-server"
[10003]="media-server"
[10004]="visitor-server"
[10005]="system-monitor-server"
[10777]="parking-server"
)
length=${#portarray[@]} #输出有多少个
printf "{\n"
printf '\t'"\"data\":["
for ((i=0;i<$length;i++))
do
printf '\n\t\t{'
if [ -n "${service_map[${portarray[$i]}]}" ];
then
printf "\"{#TCP_PORT}\":\"${portarray[$i]}\", \"{#TCP_NAME}\":\"${service_map[${portarray[$i]}]}\"}"
else
printf "\"{#TCP_PORT}\":\"${portarray[$i]}\", \"{#TCP_NAME}\":\"${servicename[$i]}\"}"
fi
if [ $i -lt $[$length-1] ]; then
printf ','
fi
done
printf "\n\t]\n"
printf "}\n"
- Windows的参考这个脚本
创建一个discoverport.bat文件
@echo off
setlocal EnableDelayedExpansion
set "output={"data":["
for /f "tokens=2 delims= " %%a in ('netstat -ano ^| findstr "LISTENING" ^| findstr ":3306 :8182 :8180 :15672 :5672 :6379"') do (
for /f "tokens=1* delims=:" %%b in ("%%a") do (
for %%d in (%%c) do (
set "value=%%~d"
set "output=!output!{"{#TCP_PORT}":"!value:]:=!"},"
)
)
)
rem Remove the trailing comma from the last object
set "output=!output:~0,-2!}]}"
echo !output!!
#pause #这个要停留端口验证在用,平时注释掉
主机绑定模板
进入主机,选择要绑定的模板
进入主机的自动发现,找到加入的自动发现规则,双击自动发现后进行测试
这里,确保测试有数据产生!
注意:如果出现访问脚本超时,或者无权限执行脚本的类似文件:如
sudo: a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper
sudo: a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper
{
"data":[
]
}
解决方法:
需要把zabbix用户加入到sudo中,然后再执行测试自动发现就正常了
修改文件/etc/sudoers
加入:zabbix ALL=(ALL) NOPASSWD: ALL
创建监控项目
注意:这里是自动发现里面的监控项,非主机下的监控项
这里就可以通过脚本获取到的JSON数据,实现变量方式传值了,极大地避免了人工手动监控多个服务的情况。
监控{#TCP_PORT}端口,{#TCP_NAME}服务
创建触发器
{#TCP_NAME}服务停止了,端口为{#TCP_PORT}
验证主机中生成的监控项和触发器:
主机的监控项:
主机的触发器: