Zabbix 使用教程:添加主机、套用模板与配置告警
Zabbix 的日常使用是一个固定循环:被监控端装 agent 或打开 SNMP,在 Data collection → Hosts 添加主机并套用模板,用宏把阈值改成自己的标准,再用媒介、用户和动作把告警送到人,平时在 Problems、Latest data 和仪表盘里看问题与图形。下面按这个顺序走一遍,界面以 7.0 为准。
Zabbix 使用教程可以浓缩成五步:让设备能被采集(装 agent、开 SNMP 或 IPMI)→ 添加主机并套用模板 → 用宏调整阈值 → 按需要补充触发器 → 配置媒介、用户和动作把告警发出去,之后的日常工作就是看问题、看图形,割接时设维护期。本文的菜单路径以 Zabbix 7.0 为准,6.0 及更早版本的主机、模板等配置在 Configuration 菜单下,位置不同但概念一样;中文界面的菜单结构与英文一致。先认识 7.0 里最常用的几个菜单:
| 菜单 | 用来做什么 |
|---|---|
| Dashboards | 仪表盘,放问题列表、图形、Top 排行等组件 |
| Monitoring → Problems | 当前未解决的问题,在这里确认和处理告警 |
| Monitoring → Hosts / Latest data | 按主机看状态、最新采集值和图形 |
| Data collection → Hosts / Templates | 添加主机、套用和编辑模板 |
| Data collection → Maintenance | 设置维护期,割接时屏蔽通知 |
| Alerts → Actions / Media types | 配置告警动作和通知方式 |
| Users → Users / User groups | 用户、通知地址和主机群组权限 |
| Administration → Macros / Housekeeping | 全局宏、数据保留期 |
第一步:让被监控端能被采集
Linux 服务器装 agent 2。 先添加与 server 同版本的官方仓库,再安装 agent 2(下面以 7.0 为例,server 是其他版本时把地址里的 7.0 换掉):
# Ubuntu 24.04
wget https://repo.zabbix.com/zabbix/7.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_latest_7.0+ubuntu24.04_all.deb
sudo dpkg -i zabbix-release_latest_7.0+ubuntu24.04_all.deb
sudo apt update && sudo apt install -y zabbix-agent2
# Rocky Linux 9
sudo rpm -Uvh https://repo.zabbix.com/zabbix/7.0/rocky/9/x86_64/zabbix-release-latest-7.0.el9.noarch.rpm
sudo dnf install -y zabbix-agent2
修改 /etc/zabbix/zabbix_agent2.conf 里的三项:Server 写允许来采集的 server(或 proxy)地址,ServerActive 写主动上报的目标,Hostname 写这台主机在 Zabbix 里的名字,必须和后面添加主机时填的 Host name 完全一致。假设 server 是 10.0.0.5,这台主机叫 web01:
sudo sed -i -e 's/^Server=127.0.0.1$/Server=10.0.0.5/' \
-e 's/^ServerActive=127.0.0.1$/ServerActive=10.0.0.5/' \
-e 's/^Hostname=Zabbix server$/Hostname=web01/' /etc/zabbix/zabbix_agent2.conf
sudo systemctl restart zabbix-agent2 && sudo systemctl enable zabbix-agent2
# 只允许 server 访问 10050
# Ubuntu:
sudo ufw allow from 10.0.0.5 to any port 10050 proto tcp
# Rocky Linux 9:
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.5" port port="10050" protocol="tcp" accept'
sudo firewall-cmd --reload
回到 Zabbix server 上验证,返回 1 和一个百分数就说明通了:
sudo apt install -y zabbix-get # Rocky 用 dnf install zabbix-get
zabbix_get -s 10.0.1.11 -k agent.ping
zabbix_get -s 10.0.1.11 -k 'vfs.fs.size[/,pused]'
交换机、UPS、PDU 打开 SNMP。 在设备上启用 SNMP 并设置只读团体名,条件允许优先用 SNMPv3。在 server 上先用命令行确认能读到设备名称(需要安装 snmp 工具包):
snmpget -v2c -c '你的只读团体名' 10.0.0.1 1.3.6.1.2.1.1.5.0
服务器 BMC 打开 IPMI over LAN。 给 Zabbix 单独建一个 User 权限的 BMC 账号,只读传感器就够用,然后用 ipmitool 确认能读到温度。ipmitool 默认按 Administrator 权限建立会话,用 User 账号测试时要加 -L USER:
ipmitool -I lanplus -L USER -H 10.20.0.15 -U zbxmon -P 'BMC密码' sdr type Temperature
别忘了 server 的 StartIPMIPollers 默认是 0,不改成大于 0,IPMI 接口永远采不到数据。
第二步:添加主机并套用模板
- 打开 Data collection → Hosts,点右上角 Create host。
- Host name 填主机名,和 agent 配置里的 Hostname 一致;Visible name 可以填带中文的显示名,例如“上海一号机房 B03-web01”。
- Templates 输入模板名选择,见下表。
- Host groups 至少选一个,例如按机房和用途建“IDC/SH01”“Linux servers”。权限是按主机群组分配的,这一步决定了谁能看到这台主机。
- Interfaces 点 Add,按采集方式添加 Agent(端口 10050)、SNMP(端口 161,选版本,v2c 的团体名默认引用宏
{$SNMP_COMMUNITY})或 IPMI(端口 623)接口。IPMI 还要在 IPMI 标签页填写认证算法、权限级别、用户名和密码。 - 多机房时在 Monitored by 里选择由哪台 proxy 或哪个 proxy 组采集。
- 点 Add 保存,一两分钟后列表里 Availability 列的 ZBX、SNMP 或 IPMI 图标变绿,就说明采集成功。
机房里常见设备对应的官方模板:
| 设备 | 接口 | 模板 |
|---|---|---|
| Linux 服务器,被动模式 | Agent | Linux by Zabbix agent |
| Linux 服务器,主动模式或自动注册 | 不需要接口 | Linux by Zabbix agent active |
| Windows 服务器 | Agent | Windows by Zabbix agent |
| 华为交换机 | SNMP | Huawei VRP by SNMP |
| H3C 交换机 | SNMP | HP Comware HH3C by SNMP |
| 其他品牌或不确定型号的网络设备 | SNMP | Network Generic Device by SNMP |
| Dell 服务器的 iDRAC | SNMP | Dell iDRAC by SNMP |
| 任意品牌服务器的 BMC | IPMI | Chassis by IPMI |
| APC UPS | SNMP | APC UPS by SNMP |
| 只关心通不通 | 任意接口 | ICMP Ping(server 上要装 fping) |
几百台 Linux 主机不要一台台加,用自动注册。 让 agent 用系统主机名注册,并带上一段主机元数据:
# /etc/zabbix/zabbix_agent2.conf
ServerActive=10.0.0.5
# 注释掉固定的 Hostname,改用系统主机名
# Hostname=Zabbix server
HostnameItem=system.hostname
HostMetadata=linux idc-sh01
然后在 Alerts → Actions → Autoregistration actions 里新建动作:条件写 Host metadata contains linux,操作依次是 Add host、Add to host groups(Linux servers)、Link templates(Linux by Zabbix agent active);再加一条条件 Host metadata contains idc-sh01 的动作,把主机放进“IDC/SH01”群组。之后新装系统时把这个 agent 配置一起下发,主机会自己出现在 Zabbix 里。
第三步:用宏调整阈值,别直接改模板
官方模板的阈值都写成宏,常用的默认值如下:
| 宏 | 默认值 | 含义 |
|---|---|---|
{$CPU.UTIL.CRIT} |
90 | CPU 使用率 5 分钟内持续高于该值告警 |
{$MEMORY.UTIL.MAX} |
90 | 内存使用率上限 |
{$VFS.FS.PUSED.MAX.WARN}、{$VFS.FS.PUSED.MAX.CRIT} |
80、90 | 文件系统使用率的两级阈值 |
{$IF.UTIL.MAX} |
90 | 端口 15 分钟平均利用率上限,单位 % |
{$IFCONTROL} |
1 | 端口 down 是否告警,0 表示不告警 |
{$ICMP_LOSS_WARN} |
20 | ICMP 丢包率告警阈值,单位 % |
{$ICMP_RESPONSE_TIME_WARN} |
0.15 | ICMP 平均响应时间阈值,单位秒 |
要改阈值,在主机的 Macros 标签页切到“Inherited and host macros”,找到对应的宏点 Change 改值即可。宏的生效顺序是:主机上的宏优先,其次是模板上的宏,最后是 Administration → Macros 里的全局宏。
带上下文的宏可以只对某个对象生效,这在机房里特别有用:
{$VFS.FS.PUSED.MAX.WARN:"/data"}设为 95:只放宽 /data 分区的阈值,其他分区仍是 80;{$IFCONTROL:"GigabitEthernet0/0/12"}设为 0:这个端口 down 时不告警。欠费停机时会主动关闭客户服务器所在的交换机端口,这类端口不设成 0,每次停机都会产生一条“Link down”。
不要直接改官方模板:以后导入新版模板时,你的修改会被覆盖。确实要增删监控项时,在 Data collection → Templates 里把模板 Clone 一份,改自己的副本。
第四步:自己写触发器
模板没覆盖的判断,在 Data collection → Hosts 里点主机行的 Triggers,再点 Create trigger。要填的主要是名称、严重级别(Not classified、Information、Warning、Average、High、Disaster)和表达式。7.0 的表达式格式是 函数(/主机名/监控项键名,参数) 加比较条件:
| 想判断什么 | 表达式 | 说明 |
|---|---|---|
| CPU 连续 5 分钟高于 85% | min(/web01/system.cpu.util,5m)>85 |
用 min:5 分钟内每个值都超过才报,过滤瞬间尖峰 |
| /data 分区使用率超过 95% | last(/web01/vfs.fs.dependent.size[/data,pused])>95 |
键名来自 Linux 模板对文件系统的自动发现 |
| 主机 10 分钟没有数据 | nodata(/web01/agent.ping,10m)=1 |
适合主动模式的主机 |
| 最近 3 次 ping 都不通 | max(/core-sw01/icmpping,#3)=0 |
#3 表示最近 3 个值,不是 3 分钟 |
| 出口端口入方向 5 分钟持续超过 900 Mbps | min(/core-sw01/net.if.in[ifHCInOctets.25],5m)>900000000 |
25 是端口的 SNMP 索引,可以在 Latest data 里查到对应的键名;表达式里的后缀 M 按 1024×1024 计算,写 900M 并不等于 900 Mbps,按 bps 写完整数字更准确 |
| 服务器刚重启过 | last(/web01/system.uptime)<10m |
运行时间小于 10 分钟 |
三个让告警更干净的设置:
- 恢复表达式:在 OK event generation 选 Recovery expression,例如问题表达式
min(/web01/system.cpu.util,5m)>85,恢复表达式max(/web01/system.cpu.util,5m)<70,CPU 在 85% 附近来回波动时不会反复告警和恢复。 - 依赖关系:在 Dependencies 标签页,让机柜里每台服务器的“不可达”触发器依赖接入交换机的 ICMP 不可达触发器。交换机断了,只收到交换机这一条,而不是整柜几十条。
- 标签:给触发器加
scope:availability、team:network一类标签,后面按标签分派通知。
第五步:把告警发出去
告警送达要三样东西都配好:媒介类型(怎么发)、用户的媒介(发到哪)、动作(什么情况下发给谁)。
1. 邮件。 在 Alerts → Media types 打开内置的 Email:填写 SMTP 服务器、端口(SSL/TLS 一般 465,STARTTLS 一般 587)、发件地址、认证方式;Message templates 标签页里已经带好 Problem、Problem recovery 等消息模板,按需要改写即可;内置媒介默认是停用的,记得启用,再用列表里的 Test 发一封测试邮件。
2. 企业微信群机器人。 新建一个类型为 Webhook 的媒介,参数保留 To={ALERT.SENDTO}、Subject={ALERT.SUBJECT}、Message={ALERT.MESSAGE},脚本如下。新建的媒介没有消息模板,要在 Message templates 标签页至少添加 Problem 和 Problem recovery 两种,否则这个媒介发不出通知:
var p = JSON.parse(value);
var req = new HttpRequest();
req.addHeader('Content-Type: application/json');
var resp = req.post(
'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=' + encodeURIComponent(p.To),
JSON.stringify({msgtype: 'text', text: {content: p.Subject + '\n' + p.Message}})
);
if (req.getStatus() !== 200 || JSON.parse(resp).errcode !== 0) {
throw 'WeCom send failed: ' + resp;
}
return 'OK';
机器人的 key 填在用户媒介的“Send to”里,不要写进脚本,也不要贴到工单和聊天记录里;Reports → Action log 的收件人一栏会显示这个值,只给需要的人开放查看权限。上线前用媒介列表里的 Test 实际发一条,确认群里能收到。钉钉自定义机器人的地址是 https://oapi.dingtalk.com/robot/send?access_token=…,消息体同样是 msgtype: text 格式,机器人安全设置里必须在自定义关键词、加签、IP 地址段中至少选一种;飞书机器人地址形如 https://open.feishu.cn/open-apis/bot/v2/hook/…,消息体写成 {"msg_type":"text","content":{"text":"…"}}。
3. 给用户添加媒介。 在 Users → Users 打开用户,Media 标签页点 Add:选媒介类型,填收件地址或机器人 key,When active 写生效时段,例如 1-5,09:00-18:00 表示工作日白天;下面勾选要接收的严重级别。用户所在的用户组必须对主机所在的群组至少有只读权限,否则收不到这台主机的告警。
4. 创建动作。 在 Alerts → Actions → Trigger actions 新建:
- 条件:Trigger severity is greater than or equals Average,并且 Host group equals IDC/SH01;
- 操作:Default operation step duration 设为 30m;第 1 步发给“网络值班”用户组,媒介选 All;第 2 步发给“运维主管”,并在这一步加上条件 Event is not acknowledged,即 30 分钟内没人确认才升级;
- 恢复操作:Notify all involved,问题恢复时通知所有收到过告警的人。
保持 Pause operations for suppressed problems 勾选,维护期内的问题就不会发通知。收不到告警时,到 Reports → Action log 查每条通知的发送结果和报错。
日常查看与维护
- 处理问题:Monitoring → Problems 按严重级别和主机群组筛选,点问题行的 Update 可以确认(Acknowledge)并留言、修改严重级别、临时抑制到某个时间点,触发器允许时还可以手动关闭。确认过的问题不会再触发“未确认才升级”的那一步。
- 看最新数据和图形:Monitoring → Latest data 按主机、名称或标签筛选监控项,数值型监控项右侧有 Graph 链接,文本型有 History。时间范围用页面右上角的选择器,可以快速切到最近 1 小时、最近 7 天或自定义时段。
- 做一个机房总览仪表盘:在 Dashboards 里新建仪表盘,放 Problems by severity(各群组问题数)、Top hosts(按 CPU 或端口流量排序)、Graph(出口端口进出流量)和 Honeycomb(主机健康状态)几个组件,值班大屏一页就能看全。
- 割接设维护期:Data collection → Maintenance → Create maintenance period,选择带数据采集(With data collection)还是不采集,设置生效时间和周期(例如 One time only,周六 01:00 起持续 2 小时),选中要割接的主机或群组。带数据采集的维护期内问题照常记录,但会被标记为已抑制,不发通知。
- 下架主机:服务器下架时先把主机状态设为 Disabled,停止采集但保留历史数据;确认不再需要这些数据后再删除主机。
在管理系统里怎么落地
Zabbix 告诉你哪台主机、哪个端口出了问题,处理时还要知道它接在哪、怎么远程进去。在 Toplink DCIM 的服务器列表里可以直接看到每台机器接在哪台交换机的哪个端口、端口速率和 VLAN,端口的开关、VLAN 修改和限速也能在网页上完成(见交换机管理);服务器系统卡死、Zabbix 报 agent 不可达时,可以通过 IPMI 远程管理打开控制台查看屏幕,必要时远程重启。上文提到的欠费停机端口也是一个衔接点:在 DCIM 里关闭端口之前,先把 Zabbix 里这个端口的 {$IFCONTROL} 上下文宏设为 0,恢复服务后再删掉这条宏,值班人员就不会被预期内的端口 down 打扰。
常见问题
主机的 ZBX 图标变红,提示连不上 agent 怎么办?
先在 Zabbix server 上执行 zabbix_get -s 主机IP -k agent.ping。超时多半是被监控主机的防火墙没放行 10050;连接被拒说明 agent 没启动;如果提示 Check access restrictions in Zabbix agent configuration,是 agent 配置文件的 Server= 里没有写 server 的地址。改完 agent 配置要重启 agent。
一台主机能同时套多个模板吗?
可以,例如服务器同时套 Linux by Zabbix agent 和 Chassis by IPMI。但多个模板里不能有键名相同的监控项,否则保存时会报冲突;同类的模板只选一个,比如被动模式和主动模式的两个 Linux 模板不要同时套。
怎么一次修改几十台主机?
在 Data collection → Hosts 勾选主机,点列表下方的 Mass update,可以批量增删模板、修改主机群组、宏、IPMI 设置和资产清单字段。数量再多,可以用 Zabbix API 的 host.massupdate,或者把主机配置导出成 YAML 修改后再导入。