公网IP变更时如何更新Zabbix Agent的主机接口信息?
解决方案:动态公网IP场景下Zabbix Agent主机接口自动更新
核心思路
固定主机唯一标识(基于内网IP),避免公网IP变更时重复创建主机;通过主动式Agent上报公网IP,结合Zabbix自动注册动作或定时脚本更新主机接口,解决IP变更后离线问题。
步骤1:配置固定主机标识(杜绝重复创建主机)
修改Zabbix Agent配置文件(zabbix_agentd.conf),用固定内网IP生成唯一主机名,确保公网IP变更时主机标识不变:
# 方式1:自动抓取内网IP(适用于内网IP固定的场景) HostnameItem=system.run[echo "Scoring_Server-ALB-`hostname -i | grep -Eo '192\.168\.[0-9]+\.[0-9]+'`"] # 方式2:直接写死内网IP(更稳妥,避免抓取命令异常) # Hostname=Scoring_Server-ALB-192.168.1.50
重启Agent生效:
systemctl restart zabbix-agent
步骤2:配置Agent自定义参数,暴露公网IP
在zabbix_agentd.conf中添加用户参数,让Zabbix可以获取当前公网IP:
# 用dig获取公网IP(需安装bind-utils包) UserParameter=public.ip,/usr/bin/dig +short myip.opendns.com @resolver1.opendns.com # 备选:用curl获取(无需dig,需安装curl) # UserParameter=public.ip,/usr/bin/curl -s --connect-timeout 5 https://api.ipify.org
测试参数有效性:
zabbix_agentd -t public.ip
返回当前公网IP即为配置正常。
步骤3:通过自动注册动作更新主机接口
- 登录Zabbix前端,进入配置 → 动作 → 自动注册
- 创建新动作,命名为
Update Public IP for Scoring Servers - 动作条件:添加条件
主机名称 匹配 正则表达式 ^Scoring_Server-ALB-(匹配你的主机命名规则) - 动作操作:添加操作,选择更新主机接口,配置细节:
- 接口类型:选择
Agent(根据实际接口类型调整) - 连接端口:填写Agent端口(默认10050)
- IP地址:填写
{HOST.METADATA}
- 接口类型:选择
- 回到Agent配置,添加公网IP作为主机元数据上报:
HostMetadataItem=system.run[/usr/bin/dig +short myip.opendns.com @resolver1.opendns.com]
重启Agent后,每次Agent连接Zabbix Server时,会自动上报最新公网IP,触发动作更新主机接口。
步骤4:解决IP变更后Agent离线问题
- 缩短主动检查刷新间隔:在
zabbix_agentd.conf中设置RefreshActiveChecks=60(默认120秒),让Agent更快同步配置 - 监控公网IP变化:编写脚本定时检查公网IP,变更时重启Agent触发元数据上报:
#!/bin/bash CURRENT_IP=$(dig +short myip.opendns.com @resolver1.opendns.com) LAST_IP=$(cat /var/tmp/last_public_ip 2>/dev/null) if [ "$CURRENT_IP" != "$LAST_IP" ]; then echo $CURRENT_IP > /var/tmp/last_public_ip systemctl restart zabbix-agent fi
将脚本加入crontab,每5分钟执行一次:
*/5 * * * * /path/to/check_public_ip.sh
备选方案:Zabbix API定时更新接口
如果自动注册动作无法满足需求,可编写脚本定时调用Zabbix API更新接口:
#!/bin/bash # 需提前配置Zabbix API认证信息 ZABBIX_URL="http://your-zabbix-server/api_jsonrpc.php" AUTH_TOKEN=$(curl -s -X POST $ZABBIX_URL -H "Content-Type: application/json-rpc" -d '{"jsonrpc":"2.0","method":"user.login","params":{"user":"Admin","password":"zabbix"},"id":1}' | jq -r .result) # 获取目标主机ID HOST_IDS=$(curl -s -X POST $ZABBIX_URL -H "Content-Type: application/json-rpc" -d '{"jsonrpc":"2.0","method":"host.get","params":{"filter":{"name":"Scoring_Server-ALB-*"}},"auth":"'"$AUTH_TOKEN"'","id":1}' | jq -r .result[].hostid) for HOST_ID in $HOST_IDS; do # 获取主机内网IP(用于调用Agent获取公网IP) INTERNAL_IP=$(curl -s -X POST $ZABBIX_URL -H "Content-Type: application/json-rpc" -d '{"jsonrpc":"2.0","method":"hostinterface.get","params":{"hostids":"'"$HOST_ID"'","filter":{"type":1}},"auth":"'"$AUTH_TOKEN"'","id":1}' | jq -r .result[].ip) # 获取最新公网IP PUBLIC_IP=$(zabbix_get -s $INTERNAL_IP -k public.ip) # 更新主机接口IP curl -s -X POST $ZABBIX_URL -H "Content-Type: application/json-rpc" -d '{"jsonrpc":"2.0","method":"hostinterface.update","params":{"hostid":"'"$HOST_ID"'","ip":"'"$PUBLIC_IP"'"},"auth":"'"$AUTH_TOKEN"'","id":1}' done
将脚本加入crontab定时执行即可。
内容的提问来源于stack exchange,提问作者Fave
相关产品推荐
相关产品推荐

