一、什么是CMDB
一句话定义:CMDB(Configuration Management Database,配置管理数据库)是运维领域的“设备与配置信息中心”,用于存储IT架构中所有设备、软件及其相互关系的配置信息。
CMDB 是“运维数据的关系图谱”,不是“服务器清单”。它的核心价值在于关系——通过“谁依赖谁”,让监控知道告警该通知谁,让变更知道会影响谁,让自动化知道该操作哪台机器。
1.1 核心概念
| 概念 | 含义 |
|---|---|
| CI(配置项) | CMDB管理的基本单元,如一台服务器、一个应用、一个数据库实例 |
| CI关系 | CI之间的依赖或连接关系,如“应用 RUNSON 服务器”“数据库 USEDBY 应用” |
| 自动发现 | 通过SNMP、SSH、API等协议自动识别和同步IT资源,避免手工录入 |
1.2 核心价值
CMDB是所有自动化运维系统的 “设备事实单一数据源” ——监控、自动化脚本、工单系统都从这里获取“某台设备在哪里、什么配置、谁负责”。
| 场景 | 说明 |
|---|---|
| 故障排查与定位 | 服务告警时,通过CMDB的拓扑关系快速定位受影响范围(如:数据库慢→影响哪些服务→影响哪些用户) |
| 变更影响分析 | 变更前查询依赖关系,评估影响面,避免“改一台影响一片” |
| 自动化运维 | Ansible/SaltStack等工具从CMDB动态获取设备清单,替代人工维护Excel |
| 资产管理与审计 | 统一管理IT资产台账,支持合规审计与生命周期管控 |
| AIOps数据底座 | 为AI根因分析提供资产拓扑、变更记录、依赖关系等上下文数据 |
二、应用场景
三、主流CMDB工具对比
| 工具 | 类型 | 特点 | 适用场景 | 官方链接 |
|---|---|---|---|---|
| ServiceNow | 商业 | ITIL支持全面,功能强大,但成本高、实施复杂 | 大型企业全栈ITSM | https://www.servicenow.com/products/servicenow-platform/configuration-management-database.html |
| BMC Helix | 商业 | 强AI能力,多云CMDB,ITIL 4合规 | 大型企业智能化运维 | https://www.bmc.com/cmdb |
| NetBox | 开源 | API优先,网络IPAM/DCIM能力极强,社区活跃 | 网络设备管理、中小团队 | https://github.com/netbox-community/netbox |
| iTop | 开源 | 严格遵循ITIL,含服务台功能,界面友好 | ITSM流程驱动的团队 | https://www.itophub.io |
| 蓝鲸CMDB | 开源 | 腾讯开源,中文文档完善,与自动化平台深度集成 | 国内企业、混合云环境 | https://github.com/TencentBlueKing/bk-cmdb |
| CMDBuild | 开源 | 高度可定制,支持工作流和地理可视化 | 需要定制化资产管理的中小企业 | https://www.cmdbuild.org |
选型建议:中小团队优先考虑NetBox或iTop(轻量、社区活跃);需要与腾讯生态集成选蓝鲸CMDB;大型企业考虑ServiceNow或BMC Helix。
四、使用方式
4.1 核心使用模式
查询:通过Web界面或API按条件查询CI及其属性。
关系维护:为CI建立关系(如“应用A部署在主机B上”),形成拓扑图。
自动同步:配置发现任务,定期从网络、服务器、云平台同步实际状态到CMDB。
消费数据:监控系统、自动化平台、工单系统通过CMDB API读取设备信息。
4.2 CI关系示例
4.3 关键原则
“自动发现驱动、服务视角组织、持续保鲜” ——CMDB数据不应依赖人工录入,而应通过自动发现工具持续同步IT环境的实际状态;以“业务服务”为中心组织数据,让CMDB从“资产清单”升级为“服务蓝图”。
五、快速上手(以NetBox为例)
- 安装部署
一键部署脚本install-netbox.sh:
#!/bin/bashset-eNETBOX_DIR="$HOME/netbox-docker"NETBOX_URL="http://localhost:8000"ADMIN_USER="admin"ADMIN_PASS="admin123456"ADMIN_EMAIL="admin@demo.local"# ---------- 1. 克隆仓库 ----------if[!-d"$NETBOX_DIR"];thenecho"==> 克隆 netbox-docker..."gitclone-brelease https://github.com/netbox-community/netbox-docker.git"$NETBOX_DIR"ficd"$NETBOX_DIR"[-fdocker-compose.override.yml]||cpdocker-compose.override.yml.example docker-compose.override.yml# ---------- 2. 启动服务 ----------echo"==> 启动容器..."dockercompose up-decho"==> 等待 NetBox 就绪..."untilcurl-s-o/dev/null-w"%{http_code}""$NETBOX_URL/login/"|grep-q"200";dosleep3done# ---------- 3. 创建管理员(幂等) ----------echo"==> 创建管理员..."dockercomposeexec-Tnetbox /opt/netbox/netbox/manage.py shell2>/dev/null<<EOF from django.contrib.auth import get_user_model User = get_user_model() if not User.objects.filter(username="$ADMIN_USER").exists(): User.objects.create_superuser("$ADMIN_USER", "$ADMIN_EMAIL", "$ADMIN_PASS") print("已创建管理员") else: print("管理员已存在,跳过") EOF# ---------- 4. 完成 ----------echoecho"===================================================="echo"✅ NetBox 已就绪"echo" Web 界面:$NETBOX_URL"echo" 用户名 :$ADMIN_USER"echo" 密码 :$ADMIN_PASS"echo"===================================================="echoecho"下一步:访问 http://localhost:8000"执行:
- 添加示例数据(具体可参考下面文档,此处不做演示)
参考文档:https://zhuanlan.zhihu.com/p/656805361、http://localhost:8000/static/docs/
添加过程:
创建region(地区)
创建site(站点,region>site)
创建location(比如在哪栋楼/哪层楼/哪个房间等)
Manufacturers (设备厂家名字,比如ALE/思科/华为/华三等)
Device Types (每个厂家等设备都有型号)
Platforms (设备软件平台,比如思科的ios/nxos/ios-xe等)
Device Roles (定义设备角色,比如access/core/aggregate/border等)
Devices (添加设备)
interfaces(在deviceadd component中添加接口)
添加IP 关联设备接口
演示效果
配置格式参考:
| CI名称 | 类型 | 关键属性 | 关系(本CI → 目标CI) |
|---|---|---|---|
| 交易业务线 | 业务线 | 负责人:李四;成本中心:CC-01 | — |
| 订单服务 | 业务服务 | 负责人:张三;SLA:99.99% | RUNS_ON→订单应用;BELONGS_TO→交易业务线;OWNED_BY→张三 |
| 订单应用 | 应用 | 版本:v2.3;语言:Java | DEPLOYED_ON→web-server-01;DEPENDS_ON→MySQL主库;DEPENDS_ON→Redis缓存 |
| web-server-01 | 物理服务器 | Dell R750;32核/128G;IP:10.0.1.10;机房A-机架3-U12 | CONNECTED_TO→switch-core-01;LOCATED_IN→机房A-机架3-U12 |
| db-server-01 | 物理服务器 | Dell R750;32核/128G;IP:10.0.1.20;机房A-机架3-U14 | CONNECTED_TO→switch-core-01;LOCATED_IN→机房A-机架3-U14 |
| MySQL主库 | 数据库实例 | 版本:8.0;端口:3306;数据量:500G | RUNS_ON→db-server-01 |
| Redis缓存 | 缓存实例 | 版本:6.2;端口:6379;内存:16G | — |
| switch-core-01 | 交换机 | 华为S5720;管理IP:10.0.0.1;48口 | BELONGS_TO→vlan-100 |
| vlan-100 | VLAN | ID:100;网段:10.0.1.0/24 | — |
| 张三 | 负责人 | 工号:1001;部门:交易研发 | — |
CI 属性:回答“这是什么”——型号、IP、版本、负责人
CI 关系:回答“它和谁有关”——依赖、部署、归属、连接
属性 + 关系:才能回答“出问题影响谁、变更要通知谁”——这才是 CMDB 的核心价值
3.卸载命令
# 如果需要卸载可执行cd~/netbox-dockerdockercompose down-v--remove-orphanscd~rm-rf~/netbox-docker六、新人避坑指南
| 坑 | 正确做法 |
|---|---|
| 手工录入大量数据 | 从第一天就配好自动发现,手工录入的CMDB几个月内就会腐化 |
| 追求“大而全”的字段 | 只录入“不记下来会出问题”的字段,字段越少越好 |
| 以“记录设备信息”为目标 | CMDB的价值在于“被消费”——监控、自动化、工单都要用它 |
| 一次性建设后不管 | CMDB需要持续运营,建立数据质量稽核与待办修复机制 |
下一步建议:选择一个开源工具(推荐NetBox或iTop),部署体验环境,手动创建5个CI和3条关系,再配置一次自动发现,感受CMDB从“手工台账”到“动态数据源”的价值转变。