主机名 | ip | 操作系统 | 服务 |
docker01 | 172.16.0.167 | Centos7.6.1810 | zabbix_agentd (daemon) (Zabbix) 5.2.5 |
docker02 | 172.16.0.112 | docker容器 | zabbix_server (Zabbix) 5.2.5+agent |
一、服务端部署
说明:docker01使用rpm方式部署agent,docker02使用docker方式一键部署zabbix-server端
以下均在zabbix-server端上执行docker run -dit --name zabbix-mysql --network host --restart always -v /data/mysql_db/:/var/lib/mysql -v /etc/localtime:/etc/localtime -e MYSQL_DATABASE="zabbix" -e MYSQL_USER="zabbix" -e MYSQL_PASSWORD="zabbix123" -e MYSQL_ROOT_PASSWORD="root123" mysql:5.7 --character-set-server=utf8 --collation-server=utf8_unicode_ci
docker run -v /etc/localtime:/etc/localtime -dit --restart=always --network host --name=zabbix-java-gateway zabbix/zabbix-java-gateway:latest
docker run -dit --privileged=true --network host --mount source=zabbix-server-vol,target=/etc/zabbix -v /etc/localtime:/etc/localtime -v /usr/lib/zabbix/alertscripts:/usr/lib/zabbix/alertscripts --name=zabbix-server --restart=always -e DB_SERVER_HOST="172.16.0.112" -e MYSQL_DATABASE="zabbix" -e MYSQL_USER="zabbix" -e MYSQL_PASSWORD="zabbix123" -e MYSQL_ROOT_PASSWORD="root123" -e ZBX_JAVAGATEWAY="172.16.0.112" --add-host zabbix-server:172.16.0.112 zabbix/zabbix-server-mysql:centos-latest
docker run -dit --privileged=true -v /etc/localtime:/etc/localtime --network host --name zabbix-web-nginx --restart=always -e DB_SERVER_HOST="172.16.0.112" -e MYSQL_DATABASE="zabbix" -e MYSQL_USER="zabbix" -e MYSQL_PASSWORD="zabbix123" -e MYSQL_ROOT_PASSWORD="root123" -e ZBX_SERVER_HOST="172.16.0.112" zabbix/zabbix-web-nginx-mysql:latest
docker run --name zabbix_agent_docker --privileged=true --restart=always --network host -e ZBX_HOSTNAME="docker02" -e ZBX_SERVER_PORT="10051" -e ZBX_SERVER_HOST="172.16.0.112" -d zabbix/zabbix-agent

遇到的问题:部署出现过数据库少表的情况,可以到官方下载5.2源码中的mysql导入脚本重新导入一份即可,使用docker log -f 容器id查看相关容器日志
二、客户端部署
rpm -Uvh https://repo.zabbix.com/zabbix/5.2/rhel/7/x86_64/zabbix-release-5.2-1.el7.noarch.rpm
修改被监控端的zabbix_agent.conf配置文件,新增KEY值port.alert
UserParameter=port.alert,/usr/lib/zabbix/alertscripts/port_alert.sh

systemctl enable zabbix-agent
systemctl restart zabbix-agent
需要准备两个脚本,port_alert.sh为端口自发现脚本,port.conf为指定的监控端口号[root@docker01 ~]# cd /usr/lib/zabbix/alertscripts/
[root@docker01 alertscripts]# pwd
/usr/lib/zabbix/alertscripts
[root@docker01 alertscripts]# ll
total 8
-rwxr-xr-x 1 root root 926 Feb 25 10:52 port_alert.sh
-rw-r--r-- 1 root root 220 Feb 25 07:06 port.conf
[root@docker01 alertscripts]# cat port_alert.sh
#/bin/bash
CONFIG_FILE=/usr/lib/zabbix/alertscripts/port.conf
Check(){
grep -vE '(^ *#|^$)' ${CONFIG_FILE} | grep -vE '^ *[0-9]+' &> /dev/null
if [ $? -eq 0 ]
then
echo Error: ${CONFIG_FILE} Contains Invalid Port.
exit 1
else
portarray=($(grep -vE '(^ *#|^$)' ${CONFIG_FILE} | grep -E '^ *[0-9]+'|awk '{print $1}'))
servername=($(grep -vE '(^ *#|^$)' ${CONFIG_FILE} | grep -E '^ *[0-9]+'|awk '{print $2}'))
fi
}
PortDiscovery(){
length=${#portarray[@]}
length1=${#servername[@]}
printf "{\n"
printf '\t'"\"data\":["
for ((i=0;i<$length;i++))
do
printf '\n\t\t{'
printf "\"{#TCP_PORT}\":\"${portarray[$i]}\",\"{#SERVER_NAME}\":\"${servername[$i]}\"}"
if [ $i -lt $[$length-1] ];then
printf ','
fi
done
printf "\n\t]\n"
printf "}\n"
}
port(){
Check
PortDiscovery
}
port
[root@docker01 alertscripts]# cat port.conf
6379 redis
80 nginx
8137 report-statistics
8128 conf
8013 register
8136 report-detail
8138 report-interface
8127 route
8085 data-center
8084 conf-view
3306 mysql
5060 opensips
8282 fileserver
8014 fs_cli
6060 freeswitch
配置文件port.conf每个端口号和服务名称为一行,每行的被监控端口可以有空格,空行和注释行#会被过滤
三、zabbix服务端测试及创建模板

测试成功,返回json格式的合法端口号和服务名称
新建模板:

新建自动发现规则:
键值为zabbix_agentd.conf中配置的key:port.alert参数

自动发现清单中新建监控项原型:
键值:net.tcp.listen[{#TCP_PORT}]
新的应用集:port-alert

触发器配置:
名称:{#SERVER_NAME} {#TCP_PORT} 端口已关闭,请检查 !!!
表达式:{Port Alert:net.tcp.listen[{#TCP_PORT}].last()}<>1
表达式<>1表示最后更新的值如果不为1则触发告警


停止相关服务测试:
