Zabbix 添加监控主机实战

plaintext

1.安装Agent → 2.配置文件 → 3.Web添加 → 4.链接模板 → 5.数据采集

Agent:10050 ◄────► Server:10051 ◄────► Proxy
                              │
                              ▼
                         Database

2. Agent 安装与配置

2.1 Zabbix Agent2 安装

bash

# RHEL/CentOS
rpm -Uvh https://repo.zabbix.com/zabbix/6.4/rhel/8/x86_64/zabbix-release-6.4-1.el8.noarch.rpm
dnf install zabbix-agent2 -y && systemctl enable --now zabbix-agent2

# Debian/Ubuntu
wget https://repo.zabbix.com/zabbix/6.4/debian/pool/main/z/zabbix-release_6.4-1+debian12_all.deb
dpkg -i zabbix-release_6.4-1+debian12_all.deb && apt update && apt install zabbix-agent2 -y

# 源码编译
yum install -y gcc make pcre-devel openssl-devel
./configure --enable-agent --with-libpcre2 --with-openssl && make install
useradd -M -s /sbin/nologin zabbix

2.2 zabbix_agent2.conf 核心配置

bash

# /etc/zabbix/zabbix_agent2.conf

Server=192.168.1.100,192.168.1.101       # 被动模式允许的Server IP
ServerActive=192.168.1.100:10051         # 主动模式(Agent上报)
Hostname=web-server-01                   # 必须与Web端完全一致
ListenIP=0.0.0.0
ListenPort=10050

# TLS加密(生产环境建议)
TLSConnect=psk
TLSAccept=psk
TLSPSKIdentity=PSK-ID-web-server-01
TLSPSKFile=/etc/zabbix/zabbix_agent2.psk

# 主动模式参数
RefreshActiveChecks=120
BufferSend=5
Timeout=30

Include=/etc/zabbix/zabbix_agent2.d/*.conf

2.3 主动模式 vs 被动模式

表格

模式 Server角色 Agent角色 适用场景
被动 主动拉取 被动响应 小规模
主动 等待接收 主动上报 大规模、NAT

bash

# 被动模式
Server=192.168.1.100

# 主动模式
ServerActive=192.168.1.100:10051
Hostname=web-server-01

2.4 PSK 加密通信

bash

# 生成PSK密钥
openssl rand -hex 32 > /etc/zabbix/zabbix_agent2.psk
chown zabbix:zabbix /etc/zabbix/zabbix_agent2.psk && chmod 600 /etc/zabbix/zabbix_agent2.psk

# Agent配置
TLSConnect=psk
TLSAccept=psk
TLSPSKIdentity=PSK-ID-web-server-01
TLSPSKFile=/etc/zabbix/zabbix_agent2.psk
systemctl restart zabbix-agent2

# 测试
zabbix_get -s 127.0.0.1 -p 10050 -k "system.cpu.load" \
    --tls-connect psk --tls-psk-identity="PSK-ID-web-server-01" \
    --tls-psk-file=/etc/zabbix/zabbix_agent2.psk

3. Web 端添加主机

3.1 手动添加流程

plaintext

配置 → 主机 → 创建主机

主机名称: web-server-01    ← 与Agent一致
可见名称: Web服务器-01
群组: Linux servers
接口: Agent
  IP: 192.168.1.101
  端口: 10050
模板: Template OS Linux by Zabbix Agent2
状态: 已启用

表格

配置项 说明
主机名称 Agent Hostname值,唯一标识
可见名称 Web显示名称
群组 主机所属群组
IP/端口 Agent连接信息

3.2 模板链接与宏覆盖

表格

模板 监控内容
Template OS Linux by Zabbix Agent2 CPU/内存/磁盘/网络
Template App MySQL MySQL连接/查询
Template App HTTP Service HTTP响应/时间

主机宏覆盖: 配置 → 主机 → 宏标签

bash

{$CPU.LIMIT} = 80        # 覆盖CPU告警阈值
{$DISK.SIZE.MIN} = 10GB # 覆盖磁盘告警阈值

宏优先级: 主机宏 → 模板宏 → 全局宏

4. 自动发现与自动注册

4.1 自动发现(Server主动扫描)

plaintext

Discovery Rule → 扫描网段:10050 → 匹配条件 → 执行动作

配置: 配置 → 动作 → Discovery actions → 创建动作

  • 条件: 发现状态=上线, IP范围=192.168.1.0/24
  • 操作: 添加主机+链接模板+启用

4.2 自动注册(Agent主动上报)

plaintext

Agent主动上报 → Server接收 → 匹配Hostname/元数据 → 执行动作

Agent端配置

bash

ServerActive=192.168.1.100:10051
Hostname=web-server-01
HostMetadata=linux production

Server端动作: 配置 → 动作 → 自动注册动作

  • 条件: 主机元数据包含linux
  • 操作: 添加到群组+链接模板

4.3 两种方式对比

表格

特性 自动发现 自动注册
发起方 Server主动扫描 Agent主动上报
Agent模式 被动 主动
适用场景 新机器已知IP 云环境/动态扩容

5. 常用操作命令

5.1 zabbix_get 验证连通性

bash

zabbix_get -s 192.168.1.101 -p 10050 -k "agent.ping"      # 返回1正常
zabbix_get -s 192.168.1.101 -p 10050 -k "system.cpu.load" # CPU负载
zabbix_get -s 192.168.1.101 -p 10050 -k "vfs.fs.size[/,pused]" # 磁盘

# PSK测试
zabbix_get -s 192.168.1.101 -p 10050 -k "system.cpu.load" \
    --tls-connect psk --tls-psk-identity="PSK-ID-web-server-01" \
    --tls-psk-file=/etc/zabbix/zabbix_agent2.psk

5.2 zabbix_sender 主动推送

bash

# 单个值
zabbix_sender -z 192.168.1.100 -p 10051 -s "web-server-01" -k "custom.item" -o "123"

# 批量文件(格式: host key value)
zabbix_sender -z 192.168.1.100 -p 10051 -i /tmp/data.txt

# 带时间戳
zabbix_sender -z 192.168.1.100 -p 10051 -s "web-server-01" -k "custom.item" -o 123 -t $(date +%s)

5.3 Agent日志排查

bash

/var/log/zabbix/zabbix_agent2.log
tail -f /var/log/zabbix/zabbix_agent2.log
grep -i error /var/log/zabbix/zabbix_agent2.log

# 调试模式: DebugLevel=4 && systemctl restart zabbix-agent2

5.4 Zabbix API批量添加主机

python

#!/usr/bin/env python3
"""Zabbix API批量添加主机 - pip install zabbix-api"""

from zabbix_api import ZabbixAPI
import json

class ZabbixHostManager:
    def __init__(self, server, username, password):
        self.zapi = ZabbixAPI(server=server)
        self.zapi.login(username, password)
        print(f"已连接: {server}")
    
    def get_group_id(self, name):
        r = self.zapi.hostgroup.get({"output": "extend", "filter": {"name": [name]}})
        return r[0]['groupid'] if r else None
    
    def get_template_ids(self, names):
        t = self.zapi.template.get({"output": "extend", "filter": {"host": names}})
        return [{"templateid": x['templateid']} for x in t]
    
    def create_host(self, hostname, ip, group, templates, port=10050):
        gid = self.get_group_id(group)
        if not gid:
            print(f"⚠ 群组不存在: {group}")
            return None
        try:
            host = self.zapi.host.create({
                "host": hostname,
                "interfaces": [{"type": 1, "main": 1, "useip": 1, "ip": ip, "port": str(port)}],
                "groups": [{"groupid": gid}],
                "templates": self.get_template_ids(templates)
            })
            print(f"✓ {hostname} 创建成功")
            return host['hostids'][0]
        except Exception as e:
            print(f"✗ {hostname} 失败: {e}")
            return None
    
    def batch_create(self, hosts):
        return [{"hostname": h["hostname"], 
                 "id": self.create_host(h["hostname"], h["ip"], h["group"], h.get("templates", []))} 
                for h in hosts]


if __name__ == "__main__":
    manager = ZabbixHostManager("http://192.168.1.100/zabbix", "Admin", "zabbix")
    hosts = [
        {"hostname": "web-server-01", "ip": "192.168.1.101",
         "group": "Linux servers", "templates": ["Template OS Linux by Zabbix Agent2"]},
        {"hostname": "mysql-server-01", "ip": "192.168.1.102",
         "group": "Database servers", "templates": ["Template OS Linux by Zabbix Agent2", "Template App MySQL"]},
    ]
    print(json.dumps(manager.batch_create(hosts), indent=2, ensure_ascii=False))

6. 常见问题与排查

6.1 主机不可达(Get value from agent failed)

bash

systemctl status zabbix-agent2
ss -tlnp | grep 10050
zabbix_get -s 192.168.1.101 -p 10050 -k "agent.ping"
firewall-cmd --add-port=10050/tcp --permanent && firewall-cmd --reload
setsebool -P zabbix_can_network=1
tail -50 /var/log/zabbix/zabbix_agent2.log

表格

原因 解决方案
Agent未启动 systemctl start zabbix-agent2
防火墙阻止 开放10050/tcp
Hostname不匹配 Agent与Web主机名必须一致
TLS配置错误 确认PSK密钥一致

6.2 数据采集不到

bash

tail -f /var/log/zabbix/zabbix_agent2.log | grep -i error
zabbix_get -s 192.168.1.101 -p 10050 -k "system.cpu.load"
# 返回ZBX_NOTSUPPORTED表示不支持该键值

表格

原因 解决方案
键值拼写错误 参考官方文档确认
缺少依赖 安装相关工具
脚本无权限 chmod +x /path/to/script
模板未链接 确认模板已正确链接

6.3 自动发现/注册不生效

bash

grep -E "ServerActive|Hostname" /etc/zabbix/zabbix_agent2.conf
tail -f /var/log/zabbix/zabbix_server.log | grep -i auto
systemctl restart zabbix-agent2

表格

原因 解决方案
动作未启用 确认动作状态为"已启用"
条件不匹配 检查主机元数据/名称
群组不存在 先创建群组

7. 最佳实践

7.1 命名规范

plaintext

格式: {环境}-{角色}-{序号}
示例: prod-web-01, prod-mysql-01
⚠️ 主机名必须唯一,与Agent Hostname一致

7.2 群组划分

表格

类型 示例
按环境 Production / Staging / Development
按角色 Web Servers / Database Servers

7.3 模板继承

plaintext

层级1: Template OS Linux by Zabbix Agent2
         ↓
层级2: Template App MySQL (链接L1)
         ↓
层级3: Template Business Web (链接L2)
⚠️ 建议不超过3层

7.4 标签管理

bash

# 触发器标签
env:production      # 环境
service:mysql       # 服务
severity:high       # 严重程度
team:ops            # 负责团队

7.5 批量操作

bash

# Ansible批量部署
ansible -i hosts all -m yum -a "name=zabbix-agent2 state=present" -b
ansible all -m template -a "src=zabbix_agent2.conf.j2 dest=/etc/zabbix/zabbix_agent2.conf" -b

# CSV格式: hostname,ip,group,templates
# prod-web-01,192.168.1.101,Production Linux,"Template OS Linux by Zabbix Agent2"

总结

plaintext

┌────────────────────────────────────────────────────────────────┐
│  1. Agent安装    │ Agent2推荐 │ 主动模式适合大规模             │
│  2. 配置         │ Hostname与Web一致 │ PSK加密生产环境建议      │
│  3. Web添加      │ 主机名=Agent Hostname │ 链接模板+宏覆盖      │
│  4. 自动注册     │ 适合云环境/动态扩容                        │
│  5. 验证         │ zabbix_get/sender │ 查看日志排查             │
└────────────────────────────────────────────────────────────────┘

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐