主要为了解决监控大量端口,避免繁琐的重复操作监控项和触发器
诸位~ 仅供参考哈
自动发现监控参考地址:
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++))
doprintf '\n\t\t{'if [ -n "${service_map[${portarray[$i]}]}" ];thenprintf "\"{#TCP_PORT}\":\"${portarray[$i]}\", \"{#TCP_NAME}\":\"${service_map[${portarray[$i]}]}\"}"elseprintf "\"{#TCP_PORT}\":\"${portarray[$i]}\", \"{#TCP_NAME}\":\"${servicename[$i]}\"}"fiif [ $i -lt $[$length-1] ]; thenprintf ','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}
验证主机中生成的监控项和触发器:
主机的监控项:
主机的触发器: