You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

公网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:通过自动注册动作更新主机接口

  1. 登录Zabbix前端,进入配置 → 动作 → 自动注册
  2. 创建新动作,命名为Update Public IP for Scoring Servers
  3. 动作条件:添加条件主机名称 匹配 正则表达式 ^Scoring_Server-ALB-(匹配你的主机命名规则)
  4. 动作操作:添加操作,选择更新主机接口,配置细节:
    • 接口类型:选择Agent(根据实际接口类型调整)
    • 连接端口:填写Agent端口(默认10050)
    • IP地址:填写{HOST.METADATA}
  5. 回到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 22:26:01