资产, cmdb到底能干什么,怎么用

218 阅读3分钟

一、CMDB 到底有什么用?
一句话:让“谁、在用什么、怎么连、变了会怎样”一目了然,成为 IT 运维的“唯一真相源”。

典型场景价值说明
资产管理自动生成完整的硬件、软件、云资源台账,避免 Excel 人工维护造成的遗漏与错误。
变更/故障影响分析通过 CI(配置项)之间的依赖关系,迅速定位“一台虚拟机重启会影响哪些应用、哪些业务系统”。
合规审计记录每一次变更的“快照+历史轨迹”,轻松应对内外部审计。
成本优化统计资源利用率,发现僵尸主机、重复采购,节省预算。
自动化联动与 Ansible、Prometheus、Zabbix 等工具集成,实现“发现-入库-监控-告警-自愈”闭环。

二、要不要自建 CMDB?

企业规模/现状建议理由
<200 台设备,变化慢开源 SaaSExcel+脚本 先跑起来成本低、上线快;CMDBuild、OneCMDB 十分钟可部署。
>200 台或云+本地混合自建 CMDB采购商业版人工维护不可持续;需要 API、自动发现、权限分级、工单流程。
已有蓝鲸、ServiceNow、RudderStack直接复用避免重复造轮子;通过联邦数据把 CMDB 当“统一索引”即可。

三、当资产存在“包含/被包含”关系时,数据库如何设计?
采用 “CI + 关系”双层模型,任何开源或自建系统都通用。

  1. 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()
);
  1. 关系表(记录“怎么连”)
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)   -- 防重复
);
  1. 典型包含关系示例
    | parent_ci | rel_type | child_ci | 解释 | | --- | --- | --- | --- | | server-001 | contains | disk-003 | 物理机包含硬盘 | | cluster-A | contains | vm-007 | 集群包含虚拟机 | | app-Order | depends_on | db-User | 应用依赖数据库 |

  2. 查询示例

  • 列出某服务器下所有硬盘

    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);
    

四、落地小贴士

  1. 最小化模型:先只建“服务器→虚拟机→磁盘”三层,跑通后再扩展。
  2. 自动发现优先:用 Ansible-facts、Zabbix-agent 或云 API 定期扫描,把结果写进 CI 表,减少人工录入。
  3. 关系自动推导:扫描到 vm-007 的宿主机字段是 server-001,就自动插入一条 contains 关系;删除 VM 时同步级联删除关系。
  4. 版本快照:给 ci 表加 version 字段或用审计表记录每一次变更,变更前自动生成差异报告,方便回滚。

一句话总结
CMDB 让“资产 + 关系”变成可查询、可追溯、可自动化的数据资产;自建与否取决于规模和变化速度,而“双层表 + 递归关系”是描述包含/依赖的通用最佳实践。