19.3.2 配置项分类与CMDB字段规范

配置项(CI)分类与CMDB字段规范是平台化配置管理的核心基础,目标是建立统一的数据语义、可追溯关系与可扩展模型。配置项应覆盖计算、网络、存储、中间件、应用与环境等资源维度,并明确生命周期、责任人、业务归属与关联依赖,确保资产、配置、变更和合规在同一数据框架内闭环。

一、配置项分类体系
- 基础设施类:物理机、虚拟机、云主机、机架、交换机、路由器、防火墙、负载均衡设备。
- 平台与中间件类:MySQL、Nginx、Redis、Nacos、Kafka、ZooKeeper、Keepalived、HAProxy、ProxySQL。
- 容器与编排类:Docker主机、镜像仓库、Kubernetes集群、Node、Namespace、Workload、Service、Ingress。
- 应用与服务类:应用实例、微服务、API网关、任务调度、配置中心。
- 监控与运维工具类:Prometheus、Alertmanager、Grafana、Jenkins、自动化脚本与作业。
- 业务与环境类:业务系统、项目、团队、环境(dev/test/stage/prod)、区域与可用区。

二、CMDB字段规范(通用)
- 标识字段:CI唯一ID、编码/序列号、名称、别名、类型、子类型、环境、区域、可用区。
- 生命周期字段:状态(规划/上线/停用/退役)、创建时间、启用时间、退役时间、变更版本。
- 归属字段:业务系统、应用名称、项目、负责人、运维责任人、团队、成本中心。
- 关系字段:上游/下游依赖、部署关系、主从关系、集群关系、服务绑定、网络拓扑关系。
- 资源字段:CPU、内存、磁盘、带宽、IP地址、端口、操作系统版本、镜像版本。
- 安全与合规字段:访问级别、敏感等级、合规标签、密钥/证书关联、漏洞状态。
- 审计字段:最后修改人、修改时间、变更单号、审计记录链接。

三、配置项模型原理草图(CMDB)

文章图片

四、关键CI类型的字段建议
- 主机类:主机名、IP、MAC、OS版本、虚拟化类型、宿主机、序列号、机房/机柜、保修到期。
- 数据库类(MySQL/ProxySQL):实例ID、版本、角色(主/从)、端口、数据目录、复制拓扑、备份策略。
- 缓存类(Redis):集群模式、分片数量、哨兵地址、持久化策略、内存上限。
- MQ类(Kafka):集群ID、Broker列表、ZK地址、Topic数量、分区与副本策略。
- 容器编排类(K8s):集群版本、节点池、CNI类型、命名空间、资源配额、Ingress控制器。
- 负载均衡类(Nginx/HAProxy/Keepalived):VIP、后端池、健康检查、配置版本、主备关系。

五、字段规范原则
- 统一命名与枚举:字段名采用小写下划线或驼峰统一标准;状态、环境、角色等使用枚举值。
- 只增不改与可扩展:核心字段稳定,扩展字段通过自定义属性或标签机制实现。
- 关系优先于文本:依赖关系使用引用对象而非自由文本,提升可计算与可视化能力。
- 版本化与审计:变更需记录版本号与变更单,支持历史回滚与审计追溯。

六、示例:最小可用字段集(MVS)与MySQL建模

以“主机类CI”演示最小字段集与可执行建表。

-- 文件:/opt/cmdb/schema/cmdb_host.sql
CREATE TABLE cmdb_host (
  id            BIGINT PRIMARY KEY AUTO_INCREMENT,
  ci_code       VARCHAR(64) NOT NULL UNIQUE,  -- CI唯一编码
  hostname      VARCHAR(128) NOT NULL,
  ip_address    VARCHAR(64) NOT NULL,
  env           ENUM('dev','test','stage','prod') NOT NULL,
  region        VARCHAR(64),
  az            VARCHAR(64),
  os_version    VARCHAR(128),
  status        ENUM('planning','online','offline','retired') DEFAULT 'online',
  owner         VARCHAR(64),                  -- 负责人
  ops_owner     VARCHAR(64),                  -- 运维责任人
  created_at    TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  updated_at    TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
# 安装并初始化MySQL(示例:Ubuntu)
sudo apt-get update
sudo apt-get install -y mysql-server
sudo systemctl enable --now mysql

# 导入表结构
mysql -uroot -p < /opt/cmdb/schema/cmdb_host.sql

# 插入一条示例数据
mysql -uroot -p -e "INSERT INTO cmdb_host(ci_code,hostname,ip_address,env,region,az,os_version,owner,ops_owner)
VALUES('HOST-0001','web-01','10.0.1.10','prod','cn-north-1','az1','Ubuntu 22.04','app_team','ops_team');"

# 预期效果:查询返回一条记录
mysql -uroot -p -e "SELECT ci_code,hostname,ip_address,env,status FROM cmdb_host;"

七、示例:关系字段落地(服务与主机的依赖)

-- 文件:/opt/cmdb/schema/cmdb_relation.sql
CREATE TABLE cmdb_relation (
  id        BIGINT PRIMARY KEY AUTO_INCREMENT,
  src_ci    VARCHAR(64) NOT NULL,  -- 源CI编码
  dst_ci    VARCHAR(64) NOT NULL,  -- 目标CI编码
  rel_type  ENUM('deploy_on','depends_on','member_of','master_of') NOT NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 例如:应用实例部署在主机上
INSERT INTO cmdb_relation(src_ci,dst_ci,rel_type)
VALUES('APP-API-001','HOST-0001','deploy_on');

八、示例:自动发现与字段填充(Ansible采集)

# 安装Ansible
sudo apt-get install -y ansible

# 生成资产清单
cat > /opt/cmdb/inventory.ini <<'EOF'
[cmdb_hosts]
10.0.1.10 ansible_user=ubuntu
EOF

# 采集主机事实并输出JSON
ansible -i /opt/cmdb/inventory.ini cmdb_hosts -m setup -a 'gather_subset=hardware,network' > /opt/cmdb/facts.json

# 说明:facts.json中包含ip_address、os_version、cpu、mem等字段,可由脚本映射入CMDB

九、示例:最小字段集的API写入(curl)

# 假设CMDB提供REST接口
API="http://cmdb.example.com/api/v1/ci/host"
cat > /opt/cmdb/host.json <<'EOF'
{
  "ci_code": "HOST-0002",
  "hostname": "db-01",
  "ip_address": "10.0.2.11",
  "env": "prod",
  "region": "cn-north-1",
  "az": "az2",
  "os_version": "CentOS 7.9",
  "owner": "db_team",
  "ops_owner": "ops_team"
}
EOF

curl -X POST -H "Content-Type: application/json" \
  -d @/opt/cmdb/host.json \
  $API
# 预期效果:返回创建成功与CI唯一ID

十、安装与排错
- 安装验证:确认CMDB数据库连接、表结构、写入权限。

# 检查MySQL服务与端口
systemctl status mysql
ss -lntp | grep 3306

# 检查表是否存在
mysql -uroot -p -e "SHOW TABLES LIKE 'cmdb_%';"
  • 常见问题与处理:
  • 写入失败(权限不足):确认数据库用户权限。
GRANT INSERT,SELECT,UPDATE ON cmdb.* TO 'cmdb_user'@'%' IDENTIFIED BY 'StrongPass!';
FLUSH PRIVILEGES;
  • 字段枚举不匹配:检查env/status枚举值是否一致;统一前端枚举。
  • 关系重复:为src_ci + dst_ci + rel_type加唯一索引。
ALTER TABLE cmdb_relation ADD UNIQUE KEY uniq_rel (src_ci, dst_ci, rel_type);

十一、练习
1. 为“Kafka集群CI”设计最小字段集(含版本、Broker列表、ZK地址、Topic数量)。
2. 使用Ansible采集本机IP与OS版本,将字段映射到cmdb_host并写入数据库。
3. 为cmdb_relation增加“应用依赖数据库”的关系,并查询出所有依赖DB-001的应用。

十二、落地建议
- 先定义最小可用字段集(MVS),逐步迭代扩展。
- 与自动化资产发现、配置管理工具联动,保持数据实时性。
- 结合标签体系与业务分层,形成可查询、可报表、可告警的配置视图。