58人参与 • 2026-04-01 • Powershell
| 线路编号 | 域名 | 预设ip | 出口接口 |
|---|---|---|---|
| 线路1 | ifconfig.me | 203.0.113.10 | port2 |
| 线路2 | api.ipify.org | 203.0.113.20 | port3 |
| 线路3 | icanhazip.com | 203.0.113.30 | port4 |
| … | … | … | … |
docker ps | grep zabbix
记录zabbix server容器名称(如 zabbix-server)
docker exec -it zabbix-server sh
# 创建目录
mkdir -p /usr/lib/zabbix/externalscripts
# 创建脚本文件
cat > /usr/lib/zabbix/externalscripts/get_ip_by_domain.sh << 'eof'
#!/bin/bash
# 通过指定的域名获取公网出口ip
# 用法:get_ip_by_domain.sh <域名>
domain="$1"
timeout=5
if [ -z "$domain" ]; then
echo "error: no domain provided"
exit 1
fi
# 使用curl访问域名,提取ipv4地址
ip=$(curl -s -l -m $timeout "http://$domain" 2>/dev/null | grep -eo '([0-9]{1,3}\.){3}[0-9]{1,3}' | head -1)
if [ -n "$ip" ]; then
echo "$ip"
exit 0
else
echo "error: failed to get ip from $domain"
exit 1
fi
eof
# 赋予执行权限
chmod +x /usr/lib/zabbix/externalscripts/get_ip_by_domain.sh
# 修改属主
chown zabbix:zabbix /usr/lib/zabbix/externalscripts/get_ip_by_domain.sh
# 安装curl(alpine系统)
apk add curlsu -s /bin/sh -c "/usr/lib/zabbix/externalscripts/get_ip_by_domain.sh api.ipify.org" zabbix
应返回一个公网ip地址。
exit
访问 http://你的zabbix服务器ip:8080,使用 admin/zabbix 登录。
hwipmonitor)| 字段 | 填写内容 |
|---|---|
| 名称 | wan01 exit ip (via api.ipify.org) |
| 类型 | 外部检查 |
| 键值 | get_ip_by_domain.sh["api.ipify.org"] |
| 信息类型 | 文本 |
| 更新间隔 | 60m |
| 历史记录保留期 | 3d |
点击 添加 完成创建。
| 字段 | 填写内容 |
|---|---|
| 名称 | wan01 出口ip异常 (api.ipify.org) |
| 严重性 | 警告 |
| 描述 | 期望ip:103.248.229.101(填写实际预设ip) |
| 表达式 | {hwipmonitor:get_ip_by_domain.sh["api.ipify.org"].last()}<>"103.248.229.101" |
{主机名:监控项键值.last()}:获取监控项最新值<>"预设ip":不等于预设ipand {监控项.str(error)}=0点击 添加 完成创建。
管理 → 报警媒介类型 → 创建媒介类型
| 字段 | 填写内容 |
|---|---|
| 名称 | feishu |
| 类型 | webhook |
点击 参数 标签页,添加以下参数:
| 名称 | 值 |
|---|---|
subject | {alert.subject} |
message | {alert.message} |
在 脚本 框中输入以下内容(将webhook地址替换为实际地址):
try {
var params = json.parse(value),
req = new httprequest(),
webhook_url = 'https://open.feishu.cn/open-apis/bot/v2/hook/你的完整webhook地址',
msg = {
msg_type: "text",
content: {
text: params.subject + "\n" + params.message
}
},
resp;
req.addheader("content-type: application/json");
resp = req.post(webhook_url, json.stringify(msg));
if (req.getstatus() != 200) {
throw "response code: " + req.getstatus();
}
resp = json.parse(resp);
return json.stringify(resp);
} catch (error) {
throw "failed with error: " + error;
}测试告警这是一条测试消息点击 添加 完成创建。
管理 → 用户 → 点击 admin (zabbix administrator)
feishu飞书群(任意标识)点击 更新 保存用户配置。
配置 → 动作 → 触发器动作 → 创建动作
| 字段 | 填写内容 |
|---|---|
| 名称 | 出口ip异常飞书告警 |
点击 条件 标签页,添加:
出口ip异常这样所有名称包含“出口ip异常”的触发器都会触发此动作。
点击 操作 标签页 → 新增:
| 字段 | 填写内容 |
|---|---|
| 操作类型 | 发送消息 |
| 默认接收人 | 选择 admin (zabbix administrator) |
| 仅送到 | 选择 feishu |
| 主题 | 告警:{trigger.name} |
| 消息 | 主机:{host.name}\n当前ip:{item.lastvalue}\n期望ip:{trigger.description}\n时间:{event.date} {event.time} |
| 自定义持续时间 | 0 |
| 仅当问题出现时发送 | ✅ 勾选 |
点击 新增 添加恢复操作:
| 字段 | 填写内容 |
|---|---|
| 操作类型 | 发送消息 |
| 默认接收人 | 选择 admin |
| 仅送到 | feishu |
| 主题 | 恢复:{trigger.name} |
| 消息 | 主机:{host.name}\n当前ip:{item.lastvalue}\n时间:{event.date} {event.time} |
| 自定义持续时间 | 0 |
| 仅当问题恢复时发送 | ✅ 勾选 |
点击 添加 完成动作创建。
临时修改触发器表达式,强制触发告警:
{hwipmonitor:get_ip_by_domain.sh["api.ipify.org"].last()}<>"1.2.3.4"
测试完成后,将表达式改回正确的预设ip。
飞书应收到类似以下内容的消息:
告警:wan01 出口ip异常 (api.ipify.org) 主机:hwipmonitor 当前ip:103.248.229.101 期望ip:期望ip:103.248.229.101 时间:2026.03.30 17:04:23
为每个域名重复以下操作:
wan01 出口ip异常 (域名)#!/usr/bin/env python3
import csv
from zabbix_api import zabbixapi
# 配置
zabbix_url = "http://localhost/zabbix"
user = "admin"
password = "zabbix"
host_name = "hwipmonitor"
# 线路配置列表
configs = [
{"domain": "ifconfig.me", "ip": "203.0.113.10"},
{"domain": "api.ipify.org", "ip": "103.248.229.101"},
{"domain": "icanhazip.com", "ip": "203.0.113.30"},
# ... 添加更多
]
zapi = zabbixapi(zabbix_url)
zapi.login(user, password)
# 获取主机id
hosts = zapi.host.get({"filter": {"host": host_name}})
host_id = hosts[0]["hostid"]
for config in configs:
domain = config["domain"]
preset_ip = config["ip"]
# 创建监控项
item = zapi.item.create({
"name": f"wan01 exit ip (via {domain})",
"key_": f'get_ip_by_domain.sh["{domain}"]',
"hostid": host_id,
"type": 0, # 外部检查
"value_type": 1, # 文本
"delay": "60m",
"history": "3d"
})
# 创建触发器
trigger = zapi.trigger.create({
"description": f"wan01 出口ip异常 ({domain})",
"expression": f'{{{host_name}:get_ip_by_domain.sh["{domain}"].last()}}<>"{preset_ip}"',
"priority": 2, # 警告
"comments": f"期望ip:{preset_ip}",
"status": 0
})
print(f"已创建: {domain} -> {preset_ip}")可能原因:
解决方法:
# 检查脚本是否存在 ls -l /usr/lib/zabbix/externalscripts/get_ip_by_domain.sh # 检查curl是否安装 which curl # 测试脚本 su -s /bin/sh -c "/usr/lib/zabbix/externalscripts/get_ip_by_domain.sh api.ipify.org" zabbix
可能原因:
解决方法:
解决方法:
正确格式:
{主机名:监控项键值.last()}<>"预设ip"
常见错误:
{}# docker环境 docker logs zabbix-server --tail 100 | grep -i error # 物理机 tail -f /var/log/zabbix/zabbix_server.log
| 文件/配置 | 位置 |
|---|---|
| 外部脚本 | /usr/lib/zabbix/externalscripts/get_ip_by_domain.sh |
| 监控项 | zabbix web → 配置 → 主机 → 监控项 |
| 触发器 | zabbix web → 配置 → 主机 → 触发器 |
| 媒介类型 | zabbix web → 管理 → 报警媒介类型 |
| 用户媒介 | zabbix web → 管理 → 用户 |
| 动作 | zabbix web → 配置 → 动作 |
| 宏 | 说明 |
|---|---|
{host.name} | 主机名 |
{trigger.name} | 触发器名称 |
{item.lastvalue} | 监控项最新值 |
{trigger.description} | 触发器描述 |
{event.date} | 事件日期 |
{event.time} | 事件时间 |
{alert.subject} | 告警主题 |
{alert.message} | 告警内容 |
至此,您已完成 zabbix 多线路出口ip监控与飞书告警的全部配置。如有任何问题,欢迎随时交流!
到此这篇关于zabbix 监控多线路出口ip并通过飞书告警完整教程的文章就介绍到这了,更多相关zabbix 监控多线路出口ip内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论