Zabbix 添加监控主机
Zabbix 添加监控主机实战
plaintext
1.安装Agent → 2.配置文件 → 3.Web添加 → 4.链接模板 → 5.数据采集 Agent:10050 ◄────► Server:10051 ◄────► Proxy │ ▼ Database2. 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 zabbix2.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/*.conf2.3 主动模式 vs 被动模式
表格
| 模式 | Server角色 | Agent角色 | 适用场景 |
|---|---|---|---|
| 被动 | 主动拉取 | 被动响应 | 小规模 |
| 主动 | 等待接收 | 主动上报 | 大规模、NAT |
bash
# 被动模式 Server=192.168.1.100 # 主动模式 ServerActive=192.168.1.100:10051 Hostname=web-server-012.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.psk3. 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 productionServer端动作: 配置 → 动作 → 自动注册动作
- 条件: 主机元数据包含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.psk5.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-agent25.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 │ 查看日志排查 │ └────────────────────────────────────────────────────────────────┘