跳转至

Checkmk 基础设施监控

一句话概述:Checkmk 是企业级 IT 基础设施监控工具,脱胎于 Nagios 生态系统,提供自动服务发现、智能告警、可视化仪表盘和 REST API,免费的 Raw Edition 支持无限制主机监控,适合中小企业和团队自托管基础设施监控。

核心知识点

概念白话解释
Site站点 = Checkmk 的一个监控实例(一个站点监控一组主机)
Host主机 = 被监控的服务器/设备(可以是服务器、网络设备、云实例)
Service服务 = 主机上被监控的具体检查项(CPU 使用率、磁盘空间等)
Agent代理 = 安装在被监控主机上的数据采集程序
Check检查 = 对某项服务的具体监控逻辑(如检查 MySQL 是否运行)
Rule规则 = 配置监控行为的条件规则(基于标签、主机名等灵活配置)
WATOWeb 管理界面 = 通过浏览器管理所有配置的界面(已被 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/8080Checkmk 容器未启动docker start checkmk,等待 30 秒
Agent connection failedAgent 未安装或端口被拦截检查 Agent 服务状态,开放 6556 端口
UNKNOWN: Could not connect主机 IP 错误或防火墙验证 IP,检查 nmap -p 6556 hostname
No services discoveredAgent 未正确安装在被监控主机运行 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 追踪

同类工具对比

特性CheckmkZabbixNagiosPrometheus+Grafana
安装难度中等中等复杂中等
Web UI现代现代基础Grafana(需单独)
自动发现自动半自动手动手动
Agent轻量级功能丰富NRPENode 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 年