Checkmk 基础设施监控¶
一句话概述:Checkmk 是企业级 IT 基础设施监控工具,脱胎于 Nagios 生态系统,提供自动服务发现、智能告警、可视化仪表盘和 REST API,免费的 Raw Edition 支持无限制主机监控,适合中小企业和团队自托管基础设施监控。
核心知识点¶
| 概念 | 白话解释 |
|---|---|
| Site | 站点 = Checkmk 的一个监控实例(一个站点监控一组主机) |
| Host | 主机 = 被监控的服务器/设备(可以是服务器、网络设备、云实例) |
| Service | 服务 = 主机上被监控的具体检查项(CPU 使用率、磁盘空间等) |
| Agent | 代理 = 安装在被监控主机上的数据采集程序 |
| Check | 检查 = 对某项服务的具体监控逻辑(如检查 MySQL 是否运行) |
| Rule | 规则 = 配置监控行为的条件规则(基于标签、主机名等灵活配置) |
| WATO | Web 管理界面 = 通过浏览器管理所有配置的界面(已被 Setup 菜单替代) |
| Activate Changes | 激活变更 = 配置修改后需要手动激活才生效(类似 git push) |
| Downtime | 停机窗口 = 计划维护期间屏蔽告警,不产生误报 |
| Contact Group | 联系组 = 定义谁收到哪些服务的告警通知 |
白话解释¶
想象你管理着一家公司的 50 台服务器、10 台网络交换机、5 个数据库,你需要: 1. 知道所有机器的运行状态(CPU、内存、磁盘) 2. 数据库出问题立刻收到短信 3. 做维护时暂停告警
Checkmk 的工作流程: 1. 在每台被监控的服务器上安装一个轻量级 Agent(2MB 左右) 2. Agent 收集 CPU、内存、磁盘、进程、日志等数百项指标 3. Checkmk 主机定期(默认 1 分钟)拉取 Agent 数据 4. 发现问题立即按预设规则通知对应人员
对比 Nagios:Checkmk 是 Nagios 的"豪华升级版",自动发现服务(不用手工添加),Web 界面更现代,配置更简单。
安装配置¶
方式一:Docker 安装(最快)¶
# 使用 Docker 安装 Checkmk(Raw Edition,完全免费)
docker run -d \
--name checkmk \
-p 8080:5000 \ # Web UI 端口(映射到本地 8080)
-v /omd/sites:/omd/sites \ # 持久化站点数据
checkmk/check-mk-raw:latest # Raw Edition(免费)
# 等待 20-30 秒启动完成,然后获取初始密码
docker logs checkmk 2>&1 | grep "cmkadmin" # 查看自动生成的密码
# 访问 Web UI
# 浏览器打开:http://localhost:8080
# 默认用户:cmkadmin
# 密码:从上面的日志中获取
# 验证安装
docker exec checkmk omd status # 检查站点状态
方式二:在 Ubuntu/Debian 系统上安装¶
# 下载 Checkmk Raw Edition(2.3.x 为当前版本)
# 从官网下载:https://checkmk.com/download
wget https://download.checkmk.com/checkmk/2.3.0p7/check-mk-raw-2.3.0p7_0.jammy_amd64.deb
# 安装(自动解决依赖)
sudo apt-get install -y ./check-mk-raw-2.3.0p7_0.jammy_amd64.deb
# 创建监控站点
sudo omd create mysite # 创建名为 mysite 的站点
sudo omd start mysite # 启动站点
# 设置管理员密码
sudo su - mysite # 切换到站点用户
htpasswd -m ~/etc/htpasswd cmkadmin # 设置密码
exit
# 访问
# http://your-server/mysite/
方式三:在 CentOS/RHEL 系统上安装¶
# 下载 RPM 包
wget https://download.checkmk.com/checkmk/2.3.0p7/check-mk-raw-2.3.0p7-el8-38.x86_64.rpm
# 安装
sudo dnf install -y ./check-mk-raw-2.3.0p7-el8-38.x86_64.rpm
# 创建站点
sudo omd create mysite
sudo omd start mysite
在被监控主机上安装 Agent¶
# 方式一:从 Checkmk 服务器下载 Agent(推荐)
# Checkmk 自动为各系统打包 Agent 安装包
# 获取下载 URL(从 Checkmk Web UI 复制,或用 API)
# UI 路径:Setup → Agents → Linux/Windows
# Ubuntu/Debian 被监控主机
wget "http://your-checkmk-server:8080/mysite/check_mk/agents/check-mk-agent_2.3.0p7-1_all.deb"
sudo dpkg -i check-mk-agent_*.deb
sudo systemctl enable check-mk-agent # 开机自启(旧版用 xinetd)
# CentOS/RHEL 被监控主机
wget "http://your-checkmk-server:8080/mysite/check_mk/agents/check-mk-agent-2.3.0p7-1.noarch.rpm"
sudo rpm -i check-mk-agent-*.rpm
# 注册 Agent 到 Checkmk 服务器(2.1+ 版本需要注册)
sudo cmk-agent-ctl register \
--hostname your-server-name \ # 在 Checkmk 中的主机名
--server checkmk-server:8080 \ # Checkmk 服务器地址
--site mysite \ # 站点名称
--user cmkadmin \ # 管理员用户名
--password your_password # 密码
# 验证 Agent 是否正常运行
sudo cmk-agent-ctl status # 查看注册状态
sudo check_mk_agent # 手动运行 Agent 查看输出
# 方式二:Windows 被监控主机
# 下载 MSI 安装包
# 双击安装,然后注册:
# PowerShell(管理员)
& "C:\Program Files (x86)\checkmk\service\cmk-agent-ctl.exe" register `
--hostname win-server-01 `
--server checkmk-server:8080 `
--site mysite `
--user cmkadmin `
--password your_password
基本使用¶
添加主机到监控¶
Web UI 操作路径:
1. 登录 http://your-server:8080/mysite/
2. 进入 Setup → Hosts → All hosts
3. 点击 "+ Add host"
4. 填写配置:
- Hostname: web-server-01(主机名)
- IP address: 192.168.1.10(可选,如果 DNS 能解析则不需要)
- Agent type: Checkmk Agent(如果安装了 Agent)
- SNMP credentials: 如果是网络设备(填 community string)
5. 点击 "Save & go to service configuration"
6. Checkmk 自动发现该主机的服务列表
7. 勾选要监控的服务,点击 "Accept all"
8. 点击页面右上角 "Activate changes"(激活配置)
命令行管理¶
# 以下命令在 Checkmk 服务器上运行
# 先切换到站点用户
sudo su - mysite # 切换到 mysite 站点用户
# 站点管理
omd status # 查看站点所有组件状态
omd start # 启动站点
omd stop # 停止站点
omd restart # 重启站点
# 主机和服务管理
cmk -I hostname # 为指定主机发现服务(-I = inventory)
cmk -v -I hostname # 详细模式发现服务
cmk --list-hosts # 列出所有被监控主机
cmk --list-checks # 列出所有检查插件
# 手动检查
cmk -v hostname # 手动运行所有检查(-v = verbose)
cmk -nv hostname # 模拟检查(不写入 Nagios 状态)
# 重新加载配置
cmk -R # 重新加载 Nagios 配置(不重启)
cmk -O # 仅重新编译配置,不重新加载
# 查看当前告警
cmk --check-inventory hostname # 检查主机服务变更情况
REST API 使用¶
# Checkmk 2.2+ 提供完整的 REST API(取代旧版 Web API)
# API 文档:http://your-server:8080/mysite/api/1.0/ui/
# ===== 基础认证 =====
SITE_URL="http://localhost:8080/mysite"
USERNAME="cmkadmin"
PASSWORD="your_password"
# ===== 常用 API 示例 =====
# 1. 获取所有主机列表
curl -s -X GET \
"${SITE_URL}/api/1.0/domain-types/host_config/collections/all" \
--header "Authorization: Bearer ${USERNAME} ${PASSWORD}" \
--header "Accept: application/json" | python3 -m json.tool
# 2. 创建新主机
curl -s -X POST \
"${SITE_URL}/api/1.0/domain-types/host_config/collections/all" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer ${USERNAME} ${PASSWORD}" \
--data '{
"host_name": "new-server-01",
"folder": "/",
"attributes": {
"ipaddress": "192.168.1.20",
"tag_agent": "cmk-agent"
}
}'
# 3. 为主机执行服务发现
curl -s -X POST \
"${SITE_URL}/api/1.0/domain-types/service_discovery_run/collections/all" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer ${USERNAME} ${PASSWORD}" \
--data '{
"host_name": "new-server-01",
"mode": "fix_all"
}'
# 4. 激活配置变更(等同于 UI 中的 "Activate changes")
curl -s -X POST \
"${SITE_URL}/api/1.0/domain-types/activation_run/actions/activate-changes/invoke" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer ${USERNAME} ${PASSWORD}" \
--data '{
"redirect": false,
"sites": ["mysite"],
"force_foreign_changes": false
}'
# Python 调用 Checkmk REST API
import requests
import json
class CheckmkAPI:
"""Checkmk REST API 简单封装"""
def __init__(self, base_url: str, username: str, password: str):
self.base_url = base_url # 如 http://localhost:8080/mysite/api/1.0
self.auth_header = {
"Authorization": f"Bearer {username} {password}", # Bearer 认证
"Accept": "application/json",
}
def get_hosts(self) -> list:
"""获取所有被监控主机"""
response = requests.get(
f"{self.base_url}/domain-types/host_config/collections/all",
headers=self.auth_header,
)
response.raise_for_status()
return response.json()['value']
def create_host(self, hostname: str, ip: str, folder: str = "/") -> dict:
"""添加新主机到监控"""
response = requests.post(
f"{self.base_url}/domain-types/host_config/collections/all",
headers={**self.auth_header, "Content-Type": "application/json"},
json={
"host_name": hostname,
"folder": folder,
"attributes": {
"ipaddress": ip,
"tag_agent": "cmk-agent", # 使用 Checkmk Agent 监控
}
}
)
response.raise_for_status()
return response.json()
def discover_services(self, hostname: str) -> dict:
"""触发服务自动发现"""
response = requests.post(
f"{self.base_url}/domain-types/service_discovery_run/collections/all",
headers={**self.auth_header, "Content-Type": "application/json"},
json={"host_name": hostname, "mode": "fix_all"} # fix_all 自动处理新发现的服务
)
response.raise_for_status()
return response.json()
def activate_changes(self) -> dict:
"""激活所有未保存的配置变更"""
response = requests.post(
f"{self.base_url}/domain-types/activation_run/actions/activate-changes/invoke",
headers={**self.auth_header, "Content-Type": "application/json"},
json={"redirect": False, "force_foreign_changes": False}
)
response.raise_for_status()
return response.json()
def get_host_services(self, hostname: str) -> list:
"""获取主机的所有服务状态"""
response = requests.get(
f"{self.base_url}/domain-types/service/collections/all",
headers=self.auth_header,
params={"host_name": hostname}
)
response.raise_for_status()
return response.json()['value']
# 使用示例:批量添加主机
api = CheckmkAPI(
base_url="http://localhost:8080/mysite/api/1.0",
username="cmkadmin",
password="your_password"
)
# 批量添加服务器
new_servers = [
{"name": "web-server-01", "ip": "192.168.1.11"},
{"name": "web-server-02", "ip": "192.168.1.12"},
{"name": "db-server-01", "ip": "192.168.1.21"},
]
for server in new_servers:
api.create_host(server["name"], server["ip"]) # 创建主机
print(f"已添加主机:{server['name']}")
api.discover_services(server["name"]) # 自动发现服务
print(f"已发现服务:{server['name']}")
api.activate_changes() # 激活所有变更
print("配置已激活!")
高级用法¶
配置告警通知¶
UI 操作路径:
1. Setup → Events → Notifications → Add rule
2. 配置触发条件:
- 服务状态:CRITICAL、WARNING、UNKNOWN
- 主机状态:DOWN、UNREACHABLE
- 触发时间:立即或延迟
3. 配置通知方式:
- Email(内置)
- Slack(Webhook 插件)
- PagerDuty(集成插件)
- SMS(第三方网关)
4. 配置接收人:
- 联系组:DevOps Team
- 特定用户:admin@company.com
计划停机(维护窗口)¶
UI 操作路径:
1. 选择主机或服务
2. 点击 "Schedule downtime"
3. 填写:
- Start time: 维护开始时间
- End time: 维护结束时间
- Comment: 说明(如"系统更新")
4. 维护期间告警自动静音
命令行方式(批量设置):
echo "SCHEDULE_HOST_DOWNTIME;hostname;$(date +%s);$(date -d '+2 hours' +%s);1;0;0;cmkadmin;系统维护" | \
cmk --notify
自定义监控检查插件¶
#!/usr/bin/env python3
# 自定义检查插件:检查生信流水线队列长度
# 文件路径:/usr/lib/check_mk_agent/local/check_bioinfo_queue.py
import subprocess
import sys
def check_queue():
"""
检查生信分析队列长度
返回:0=OK, 1=WARNING, 2=CRITICAL
"""
# 获取队列长度(根据实际情况修改)
try:
# 假设队列长度存在某个文件或 API
queue_size = int(open('/tmp/bioinfo_queue_size').read().strip())
except Exception as e:
# 3=UNKNOWN 状态
print(f"3 Queue_Size - UNKNOWN: 无法读取队列大小: {e}")
sys.exit(3)
# 性能数据(Checkmk 用来画图)
# 格式:count=当前值;warn阈值;crit阈值;min;max
perf_data = f"queue_size={queue_size};50;100;0"
if queue_size >= 100:
print(f"2 Queue_Size count={perf_data} CRITICAL: 队列积压 {queue_size} 个任务")
elif queue_size >= 50:
print(f"1 Queue_Size count={perf_data} WARNING: 队列积压 {queue_size} 个任务")
else:
print(f"0 Queue_Size count={perf_data} OK: 队列正常,{queue_size} 个任务")
check_queue()
# 部署插件
sudo chmod +x /usr/lib/check_mk_agent/local/check_bioinfo_queue.py
sudo /usr/lib/check_mk_agent/local/check_bioinfo_queue.py # 测试输出
# 在 Checkmk UI 中触发服务发现,新服务会自动被发现
# Setup → Hosts → 选择主机 → 服务发现 → 发现新服务
常见报错¶
| 报错信息 | 原因 | 解决方案 |
|---|---|---|
Connection refused 5000/8080 | Checkmk 容器未启动 | docker start checkmk,等待 30 秒 |
Agent connection failed | Agent 未安装或端口被拦截 | 检查 Agent 服务状态,开放 6556 端口 |
UNKNOWN: Could not connect | 主机 IP 错误或防火墙 | 验证 IP,检查 nmap -p 6556 hostname |
No services discovered | Agent 未正确安装 | 在被监控主机运行 check_mk_agent 检查输出 |
Changes not activated | 修改配置后未点击激活 | 点击 Web UI 右上角橙色 "Activate changes" 按钮 |
Login failed | 密码错误 | 从 docker logs checkmk 查找初始密码 |
API 401 Unauthorized | 认证格式错误 | 确保 Header 格式为 Bearer username password |
Site not found | 站点名称错误 | 用 omd sites 查看所有站点名 |
速查表¶
# ===== omd 站点管理命令 =====
omd sites # 列出所有站点
omd create <sitename> # 创建新站点
omd start <sitename> # 启动站点
omd stop <sitename> # 停止站点
omd restart <sitename> # 重启站点
omd status <sitename> # 查看站点状态
omd backup <sitename> backup.tar.gz # 备份站点
omd restore <sitename> backup.tar.gz # 恢复站点
omd rm <sitename> # 删除站点
# ===== cmk 配置命令(在站点用户下运行)=====
cmk -I <hostname> # 发现主机服务
cmk --list-hosts # 列出所有主机
cmk -v <hostname> # 手动检查主机(详细输出)
cmk -R # 重新加载监控配置
cmk -O # 编译配置(不重载)
cmk --check-inventory <hostname> # 检查服务变更
# ===== Agent 管理 =====
check_mk_agent # 手动运行 Agent(查看输出)
cmk-agent-ctl status # 查看 Agent 注册状态
cmk-agent-ctl register ... # 注册 Agent 到 Checkmk
cmk-agent-ctl unregister --uuid <UUID> # 取消注册
# ===== REST API 端点速查 =====
# GET /api/1.0/domain-types/host_config/collections/all 列出主机
# POST /api/1.0/domain-types/host_config/collections/all 创建主机
# GET /api/1.0/objects/host_config/<name> 获取主机
# DELETE /api/1.0/objects/host_config/<name> 删除主机
# POST /api/1.0/domain-types/service_discovery_run/... 服务发现
# POST /api/1.0/domain-types/activation_run/.../invoke 激活变更
# GET /api/1.0/domain-types/service/collections/all 列出服务
# ===== 版本对比 =====
# Raw Edition: 完全免费、开源、基于 Nagios 核心、功能完整
# Cloud Edition: 付费、SaaS、自动管理基础设施
# Free Edition: 免费、25 台主机限制、部分企业功能
# Enterprise: 付费、无限主机、高级报表、SLA 追踪
同类工具对比¶
| 特性 | Checkmk | Zabbix | Nagios | Prometheus+Grafana |
|---|---|---|---|---|
| 安装难度 | 中等 | 中等 | 复杂 | 中等 |
| Web UI | 现代 | 现代 | 基础 | Grafana(需单独) |
| 自动发现 | 自动 | 半自动 | 手动 | 手动 |
| Agent | 轻量级 | 功能丰富 | NRPE | Node Exporter |
| 网络设备 | SNMP 完整 | SNMP 完整 | 插件 | 有限 |
| REST API | 完整 | 完整 | 有限 | 完整 |
| 告警规则 | 规则引擎 | 表达式 | 插件 | PromQL |
| 报表功能 | 基础(免费)/高级(付费) | 内置 | 第三方 | Grafana |
| 可扩展性 | 中等 | 强 | 中等 | 极强 |
| 适合规模 | 100-5000 主机 | 无限 | 小型 | 无限 |
| 成本 | 免费(Raw) | 免费 | 免费 | 免费 |
选型建议: - 传统 IT 基础设施(服务器+网络设备):Checkmk 或 Zabbix - 云原生/容器环境:Prometheus + Grafana - 已经用 Nagios:考虑升级到 Checkmk(兼容 Nagios 插件) - 规模 < 25 台且想要企业功能:Checkmk Free Edition
参考:Checkmk REST API 文档 | 监控设置指南 | Linux Agent 详解 | 更新于 2026 年