一、CMDB 到底有什么用?
一句话:让“谁、在用什么、怎么连、变了会怎样”一目了然,成为 IT 运维的“唯一真相源”。
| 典型场景 | 价值说明 |
|---|---|
| 资产管理 | 自动生成完整的硬件、软件、云资源台账,避免 Excel 人工维护造成的遗漏与错误。 |
| 变更/故障影响分析 | 通过 CI(配置项)之间的依赖关系,迅速定位“一台虚拟机重启会影响哪些应用、哪些业务系统”。 |
| 合规审计 | 记录每一次变更的“快照+历史轨迹”,轻松应对内外部审计。 |
| 成本优化 | 统计资源利用率,发现僵尸主机、重复采购,节省预算。 |
| 自动化联动 | 与 Ansible、Prometheus、Zabbix 等工具集成,实现“发现-入库-监控-告警-自愈”闭环。 |
二、要不要自建 CMDB?
| 企业规模/现状 | 建议 | 理由 |
|---|---|---|
| <200 台设备,变化慢 | 用 开源 SaaS 或 Excel+脚本 先跑起来 | 成本低、上线快;CMDBuild、OneCMDB 十分钟可部署。 |
| >200 台或云+本地混合 | 自建 CMDB 或 采购商业版 | 人工维护不可持续;需要 API、自动发现、权限分级、工单流程。 |
| 已有蓝鲸、ServiceNow、RudderStack | 直接复用 | 避免重复造轮子;通过联邦数据把 CMDB 当“统一索引”即可。 |
三、当资产存在“包含/被包含”关系时,数据库如何设计?
采用 “CI + 关系”双层模型,任何开源或自建系统都通用。
- CI 主表(记录“是什么”)
CREATE TABLE ci (
ci_id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
ci_type TEXT CHECK (ci_type IN ('server','vm','disk','app','db')),
serial_no TEXT UNIQUE,
ip INET,
created_at TIMESTAMP DEFAULT now()
);
- 关系表(记录“怎么连”)
CREATE TABLE ci_relation (
rel_id SERIAL PRIMARY KEY,
parent_ci INT REFERENCES ci(ci_id) ON DELETE CASCADE,
child_ci INT REFERENCES ci(ci_id) ON DELETE CASCADE,
rel_type TEXT CHECK (rel_type IN ('contains','depends_on','connects_to')),
UNIQUE (parent_ci, child_ci, rel_type) -- 防重复
);
-
典型包含关系示例
| parent_ci | rel_type | child_ci | 解释 | | --- | --- | --- | --- | | server-001 | contains | disk-003 | 物理机包含硬盘 | | cluster-A | contains | vm-007 | 集群包含虚拟机 | | app-Order | depends_on | db-User | 应用依赖数据库 | -
查询示例
-
列出某服务器下所有硬盘
SELECT c.* FROM ci c JOIN ci_relation r ON c.ci_id = r.child_ci WHERE r.parent_ci = (SELECT ci_id FROM ci WHERE name='server-001') AND r.rel_type = 'contains'; -
递归查询:一台故障宿主机影响到的所有虚拟机
(PostgreSQL 示例,用WITH RECURSIVE)WITH RECURSIVE impact AS ( SELECT ci_id FROM ci WHERE name='server-001' UNION SELECT r.child_ci FROM ci_relation r JOIN impact i ON r.parent_ci = i.ci_id WHERE r.rel_type = 'contains' ) SELECT * FROM ci WHERE ci_id IN (SELECT * FROM impact);
四、落地小贴士
- 最小化模型:先只建“服务器→虚拟机→磁盘”三层,跑通后再扩展。
- 自动发现优先:用 Ansible-facts、Zabbix-agent 或云 API 定期扫描,把结果写进 CI 表,减少人工录入。
- 关系自动推导:扫描到
vm-007的宿主机字段是server-001,就自动插入一条contains关系;删除 VM 时同步级联删除关系。 - 版本快照:给
ci表加version字段或用审计表记录每一次变更,变更前自动生成差异报告,方便回滚。
一句话总结
CMDB 让“资产 + 关系”变成可查询、可追溯、可自动化的数据资产;自建与否取决于规模和变化速度,而“双层表 + 递归关系”是描述包含/依赖的通用最佳实践。