跳转至

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 年