概述

默认模板监控项

通过 Zabbix 客户端 + 各种模板可以实现以下监控:

类别监控内容
CPU使用率、负载、上下文切换等
磁盘磁盘空间、I/O、inode 等
内存内存使用、swap、缓存等
网络网卡流量、丢包、错误等
系统进程数、登录用户、运行时长等

自定义监控的应用场景

  1. 默认模板中没有需要的监控项

    • 特定业务指标
    • 自定义应用程序状态
    • 特定硬件设备
  2. 模板中监控项过多

    • 精简监控项,减少资源消耗
    • 只关注关键指标

自定义监控全流程

┌─────────────────────────────────────────────────────────────┐
│                        客户端                                │
│  1. 通过命令/脚本取出对应的值                                │
│  2. 按 Zabbix 格式书写配置文件,创建键值对                    │
│  3. 重启客户端并测试键值                                     │
└─────────────────────────────────────────────────────────────┘
                              ↓
┌─────────────────────────────────────────────────────────────┐
│                        服务端                                │
│  1. 服务端测试键值是否可用                                   │
│  2. Web 界面:键值与监控项关联                               │
│  3. Web 界面:配置触发器                                     │
│  4. Web 界面:创建图形                                       │
└─────────────────────────────────────────────────────────────┘

详细步骤

步骤位置操作说明
1客户端通过命令/脚本取出对应的值获取监控数据
2客户端创建键值对配置文件键值对 key 用于获取客户端数据
3客户端重启客户端并测试本地验证
4服务端测试键值是否可用使用 zabbix_get
5Web键值与监控项关联创建监控项
6Web配置触发器设置告警条件
7Web创建图形可视化展示

实战案例

案例一:监控 MySQL 3306 端口

1. 确定监控命令

# 检查 3306 端口是否存在
ss -lntpu | grep -w 3306 | wc -l

# 返回 1 表示端口存在,返回 0 表示不存在

2. 创建配置文件

# 进入配置目录
cd /etc/zabbix/zabbix_agent2.d/

# 创建配置文件
cat > 3306.conf << 'EOF'
# 格式:UserParameter=key,cmd
# UserParameter=固定写法,表示要自定义键值
# key 表示键值名称,建议使用"单词.单词"格式
# cmd 表示命令或脚本

UserParameter=check.mysql,ss -lntpu | grep -w 3306 | wc -l
EOF

3. 重启客户端

systemctl restart zabbix-agent2

4. 本地测试

zabbix_agent2 -t check.mysql

# 预期输出:
# check.mysql                                   [s|1]

5. 服务端测试

# 安装测试工具
yum install -y zabbix-get

# 测试键值
zabbix_get -s 192.168.5.134 -k check.mysql

# 预期输出:1 或 0

6. Web 界面配置

创建监控项

  1. 进入 ConfigurationHosts → 选择主机 → Items
  2. 点击 Create item
  3. 填写信息:

    • Name: MySQL 3306 Port Status
    • Key: check.mysql
    • Type of information: Numeric (unsigned)
    • Update interval: 1m

创建触发器

  1. 进入 Triggers 选项卡
  2. 点击 Create trigger
  3. 填写信息:

    • Name: MySQL 3306 port is down
    • Expression: {Host:check.mysql.last()}=0
    • Severity: High

案例二:带参数的自定义监控

目标

检查指定用户是否存在异地登录。

实现思路

  1. 使用 lastlog 命令获取用户最后登录的 IP
  2. 在服务端通过触发器进行对比判断

命令选择

# lastlog 可以显示所有用户的最后登录信息
lastlog | grep -w root | awk '{print $3}'

# 输出示例:192.168.1.100

创建带参数的配置

cat > /etc/zabbix/zabbix_agent2.d/user_login.conf << 'EOF'
# 注意:使用 $$3 而不是 $3,避免与 Zabbix 参数冲突
UserParameter=user.login.check[*],lastlog | grep -w "$1" | awk '{print $$3}'
EOF

测试

# 本地测试
zabbix_agent2 -t user.login.check[root]

# 服务端测试
zabbix_get -s 192.168.5.134 -k 'user.login.check[root]'

Web 配置

创建监控项

  • Key: user.login.check[root]
  • Type: Character

创建触发器

表达式:{Host:user.login.check[root].str(192.168.1.100)}=0
说明:如果返回值不是 192.168.1.100,则触发告警

自定义模板

为什么要使用模板

  • 实现监控项、触发器、图形的批量复用
  • 便于管理和维护
  • 支持多主机快速部署

创建步骤

1. 创建模板

  1. 进入 ConfigurationTemplates
  2. 点击 Create template
  3. 填写信息:

    • Template name: Template Custom MySQL Monitor
    • Groups: Templates/Databases

2. 添加监控项

在模板中添加之前创建的监控项:

  • Name: MySQL Port Status
  • Key: check.mysql
  • Type: Zabbix agent

3. 添加触发器

  • Name: MySQL is not running
  • Expression: {Template Custom MySQL Monitor:check.mysql.last()}=0

4. 添加图形

  1. 进入 Graphs 选项卡
  2. 点击 Create graph
  3. 选择监控项添加到图形

5. 模板关联主机

  1. 进入 ConfigurationHosts
  2. 选择主机 → Templates 选项卡
  3. 选择创建的模板 → AddUpdate

监控报警

报警方式对比

报警方式企业应用场景费用
邮件个人邮箱、企业邮箱免费
企业微信-告警应用需要企业微信免费
钉钉与阿里云集成免费
短信阿里云短信服务~0.045元/条
电话紧急告警收费
OneAlert第三方报警平台免费(有限制)/收费

邮件告警配置

1. 配置报警媒介类型

  1. 进入 AdministrationMedia typesEmail
  2. 配置 SMTP 服务器信息:

    • SMTP server: smtp.example.com
    • SMTP server port: 587
    • SMTP helo: example.com
    • SMTP email: zabbix@example.com
    • Authentication: 用户名密码

2. 配置用户报警媒介

  1. 进入 AdministrationUsers → 选择用户
  2. 进入 Media 选项卡
  3. 点击 Add

3. 配置动作

  1. 进入 ConfigurationActionsTrigger actions
  2. 创建或编辑动作
  3. 配置 Operations 发送邮件

微信告警配置

1. 创建告警脚本

创建 /usr/local/share/zabbix/alertscripts/wechat.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Zabbix WeChat Alerts Scripts

import requests
import sys
import os
import json
import logging

logging.basicConfig(
    level=logging.DEBUG,
    format='%(asctime)s, %(filename)s, %(levelname)s, %(message)s',
    datefmt='%a, %d %b %Y %H:%M:%S',
    filename=os.path.join('/tmp', 'wechat.log'),
    filemode='a'
)

# 企业微信配置(需要修改)
CORP_ID = 'wxd074861951c67ba6'
APP_SECRET = 'QtraZrI936DZ0jZ3aSWTZ-lFVheAMgLmq3toM4B9U1A'
AGENT_ID = 1

def get_access_token():
    """获取 access_token"""
    url = f'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={CORP_ID}&corpsecret={APP_SECRET}'
    resp = requests.get(url)
    return resp.json()['access_token']

def send_message(access_token, party_id, subject, message):
    """发送消息"""
    url = f'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={access_token}'
    
    data = {
        "toparty": party_id,
        "msgtype": "text",
        "agentid": AGENT_ID,
        "text": {
            "content": f"{subject}\n\n{message}"
        },
        "safe": 0
    }
    
    resp = requests.post(url, data=json.dumps(data))
    return resp.json()

if __name__ == '__main__':
    if len(sys.argv) < 4:
        print("Usage: wechat.py <party_id> <subject> <message>")
        sys.exit(1)
    
    party_id = sys.argv[1]
    subject = sys.argv[2]
    message = sys.argv[3]
    
    try:
        token = get_access_token()
        result = send_message(token, party_id, subject, message)
        logging.info(f'Sent to: {party_id}, Subject: {subject}, Message: {message}')
        print(json.dumps(result))
    except Exception as e:
        logging.error(f'Error: {str(e)}')
        print(f'Error: {str(e)}')
        sys.exit(1)

2. 安装依赖

# 安装 Python3 和 pip
yum install -y python3 python3-pip

# 安装 requests 库
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple requests

3. 测试脚本

cd /usr/local/share/zabbix/alertscripts/
python3 wechat.py "部门ID" "测试标题" "测试消息内容"

4. 配置报警媒介类型

  1. 进入 AdministrationMedia typesCreate media type
  2. 选择 Type: Script
  3. 填写信息:

    • Name: WeChat
    • Script name: wechat.py
    • Script parameters:

      • {ALERT.SENDTO} # 发给谁
      • {ALERT.SUBJECT} # 报警标题
      • {ALERT.MESSAGE} # 报警内容

5. 配置告警消息模板

故障消息模板

故障目前已经解决时间: {EVENT.RECOVERY.TIME} {EVENT.RECOVERY.DATE}
故障名称: {EVENT.NAME}
故障经历多久: {EVENT.DURATION}
故障主机: {HOST.NAME}
故障级别: {EVENT.SEVERITY}
故障ID: {EVENT.ID}
{TRIGGER.URL}

常用宏变量

说明
{ALERT.SENDTO}告警接收人
{ALERT.SUBJECT}告警标题
{ALERT.MESSAGE}告警内容
{EVENT.NAME}事件名称
{EVENT.TIME}事件发生时间
{EVENT.DATE}事件发生日期
{EVENT.DURATION}事件持续时间
{EVENT.RECOVERY.TIME}恢复时间
{EVENT.RECOVERY.DATE}恢复日期
{HOST.NAME}主机名
{EVENT.SEVERITY}严重程度
{EVENT.ID}事件 ID

常用内置键值参考

键值说明
agent.ping检查 Agent 是否存活
system.cpu.utilCPU 使用率
system.cpu.loadCPU 负载
vm.memory.size内存大小/使用率
vfs.fs.size文件系统大小/使用率
net.if.in网卡入流量
net.if.out网卡出流量
proc.num进程数量
system.uptime系统运行时间
system.users.num登录用户数

最后修改:2026 年 04 月 14 日
如果觉得我的文章对你有用,请随意赞赏