关于 relationship-mapping
relationship-mapping 是面向 ServiceNow CMDB 的技能,帮助团队建模 CI 关系并维护依赖数据。内容涵盖关系创建与验证、依赖链分析、孤立 CI 检测及关系健康检查。
主要功能
- 01了解关系类型及其含义
- 02查询现有 CI 关系
- 03创建并验证关系
- 04分析依赖链
- 05检测孤立 CI
- 06审计关系健康状况
适用场景
- 01建模服务与基础设施之间的依赖
- 02变更前评估影响范围
- 03在 CMDB 审计中查找孤立 CI
- 04服务中断时调查依赖关系
MCP 相关
使用 SN-Query-Table、SN-Create-Record 和 SN-Execute-Background-Script 等 ServiceNow MCP 工具,检查、创建、验证并分析 CMDB 关系。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ happy-technologies-llc/ happy-platform-skills --skill relationship-mapping安装后在 Claude Code 中输入/relationship-mapping确认已加载。
详细介绍
CI 关系映射
概述
CI 关系构成了 CMDB 价值的基础。没有关系,CI 就只是彼此孤立的数据岛。本技能涵盖:
- 了解关系类型及其语义
- 创建并验证 CI 之间的关系
- 分析依赖链以评估影响
- 检测缺少关系的孤立 CI
- 长期维护关系健康状况
适用场景: 为服务依赖关系建模、准备变更影响分析、审核 CMDB 完整性或排查服务中断问题时。
价值: 完善的关系映射可实现准确的影响分析,将变更失败率降低多达 50%,并缩短事件期间的 MTTR。
前提条件
- 角色: 具有 CMDB 写入权限的
cmdb_admin或itil - 访问权限: cmdb_rel_ci、cmdb_rel_type、cmdb_ci 表
- 知识: CI 类层次结构、依赖建模概念
- 相关技能: 首先完成
cmdb/ci-discovery
操作步骤
第 1 步:了解关系类型
ServiceNow 在 cmdb_rel_type 中提供关系类型。每种关系都有:
- 父级描述: 父级与子级之间的关系
- 子级描述: 子级与父级之间的关系
常见关系类型:
| 关系 | 父级描述 | 子级描述 | 使用场景 |
|---|---|---|---|
| 运行于 | 运行于 | 托管 | 服务器上的应用程序 |
| 依赖于 | 依赖于 | 被使用 | 服务依赖关系 |
| 包含 | 包含 | 被包含于 | 物理包含关系 |
| 连接到 | 连接到 | 连接自 | 网络连接 |
| 向……发送数据 | 向……发送数据 | 接收自 | 数据流 |
| 集群包含 | 集群包含 | 集群成员 | 集群 |
| 使用 | 使用 | 被使用 | 通用依赖关系 |
查询可用的关系类型:
Tool: SN-Query-Table
Parameters:
table_name: cmdb_rel_type
query: active=true
fields: sys_id,name,parent_descriptor,child_descriptor
limit: 100
REST API:
GET /api/now/table/cmdb_rel_type?sysparm_query=active=true&sysparm_fields=sys_id,name,parent_descriptor,child_descriptor&sysparm_limit=100
第 2 步:查询现有关系
创建关系前,先了解已有关系:
查找某个 CI 的所有关系:
Tool: SN-Query-Table
Parameters:
table_name: cmdb_rel_ci
query: parent=[ci_sys_id]^ORchild=[ci_sys_id]
fields: parent,child,type,sys_created_on
limit: 50
查找下游依赖(依赖于此 CI 的对象):
Tool: SN-Query-Table
Parameters:
table_name: cmdb_rel_ci
query: child=[ci_sys_id]^type.parent_descriptorLIKEDepends
fields: parent,parent.name,type,type.parent_descriptor
查找上游依赖(此 CI 所依赖的对象):
Tool: SN-Query-Table
Parameters:
table_name: cmdb_rel_ci
query: parent=[ci_sys_id]^type.parent_descriptorLIKEDepends
fields: child,child.name,type,type.child_descriptor
第 3 步:创建关系
首先确定正确的关系类型:
决策矩阵:
| 父级 CI 类型 | 子级 CI 类型 | 建议的关系 |
|---|---|---|
| 应用程序 | 服务器 | 运行于 |
| 业务服务 | 应用程序 | 依赖于 |
| 服务器 | 机架 | 被包含于 |
| 服务器 | 服务器 | 连接到(如果是网络连接) |
| 数据库 | 服务器 | 运行于 |
| 负载均衡器 | 服务器池 | 包含 |
查找关系类型 sys_id:
Tool: SN-Query-Table
Parameters:
table_name: cmdb_rel_type
query: nameLIKERuns on::Runs on
fields: sys_id,name,parent_descriptor,child_descriptor
创建关系:
Tool: SN-Create-Record
Parameters:
table_name: cmdb_rel_ci
data:
parent: [parent_ci_sys_id]
child: [child_ci_sys_id]
type: [relationship_type_sys_id]
示例 - 应用程序运行于服务器:
Tool: SN-Create-Record
Parameters:
table_name: cmdb_rel_ci
data:
parent: "abc123..." # Application CI sys_id
child: "def456..." # Server CI sys_id
type: "55c95bf6c0a8010e0118ec7056e1c57d" # Runs on::Hosts
第 4 步:验证关系
检查无效关系:
查找缺少 CI 的关系:
Tool: SN-Execute-Background-Script
Parameters:
description: Find invalid relationships with missing CIs
script: |
var gr = new GlideRecord('cmdb_rel_ci');
gr.addQuery('parent.sys_idISEMPTY^ORchild.sys_idISEMPTY');
gr.query();
gs.info('Invalid relationships found: ' + gr.getRowCount());
while (gr.next()) {
gs.info('Invalid rel: ' + gr.sys_id + ' parent=' + gr.parent + ' child=' + gr.child);
}
查找重复关系:
Tool: SN-Execute-Background-Script
Parameters:
description: Detect duplicate relationships
script: |
var duplicates = new GlideAggregate('cmdb_rel_ci');
duplicates.addAggregate('COUNT');
duplicates.groupBy('parent');
duplicates.groupBy('child');
duplicates.groupBy('type');
duplicates.addHaving('COUNT', '>', 1);
duplicates.query();
gs.info('Duplicate relationship combinations found: ' + duplicates.getRowCount());
while (duplicates.next()) {
gs.info('Duplicate: parent=' + duplicates.parent + ' child=' + duplicates.child + ' type=' + duplicates.type + ' count=' + duplicates.getAggregate('COUNT'));
}
验证关系类型是否合适:
某些关系类型仅适用于特定 CI 类。如果已填写关系类型的 parent_ci_class 和 child_ci_class 字段,请检查这些字段。
第 5 步:分析依赖链
了解完整的依赖链对于影响分析至关重要。
获取完整的依赖树(递归):
Tool: SN-Execute-Background-Script
Parameters:
description: Build dependency tree for CI
script: |
var ciSysId = 'YOUR_CI_SYS_ID';
var maxDepth = 5;
var visited = {};
var tree = [];
function getDependencies(parentId, depth, direction) {
if (depth > maxDepth || visited[parentId]) return;
visited[parentId] = true;
var gr = new GlideRecord('cmdb_rel_ci');
if (direction === 'down') {
gr.addQuery('child', parentId);
gr.addQuery('type.parent_descriptor', 'CONTAINS', 'Depends');
} else {
gr.addQuery('parent', parentId);
gr.addQuery('type.parent_descriptor', 'CONTAINS', 'Depends');
}
gr.query();
while (gr.next()) {
var targetId = direction === 'down' ? gr.parent.toString() : gr.child.toString();
var targetName = direction === 'down' ? gr.parent.name.toString() : gr.child.name.toString();
tree.push({
depth: depth,
direction: direction,
ci_name: targetName,
ci_sys_id: targetId
});
getDependencies(targetId, depth + 1, direction);
}
}
getDependencies(ciSysId, 1, 'down');
gs.info('Upstream dependencies (what depends on this CI):');
tree.forEach(function(item) {
gs.info(' '.repeat(item.depth) + item.ci_name);
});
识别关键路径:
存在单点故障的服务具有关键路径:
Tool: SN-Query-Table
Parameters:
table_name: cmdb_rel_ci
query: parent.sys_class_name=cmdb_ci_service^type.parent_descriptorLIKEDepends
fields: parent.name,child.name,child.sys_class_name
第 6 步:检测孤立 CI
孤立 CI(没有关系的 CI)会降低 CMDB 的价值,并使影响分析更复杂。
查找没有任何关系的 CI:
Tool: SN-Execute-Background-Script
Parameters:
description: Find orphan CIs with no relationships
script: |
var orphans = [];
var ciClasses = ['cmdb_ci_server', 'cmdb_ci_appl', 'cmdb_ci_database_instance'];
ciClasses.forEach(function(ciClass) {
var gr = new GlideRecord(ciClass);
gr.addQuery('operational_status', '1');
gr.query();
while (gr.next()) {
var relGr = new GlideRecord('cmdb_rel_ci');
relGr.addQuery('parent', gr.sys_id);
relGr.addOrCondition('child', gr.sys_id);
relGr.setLimit(1);
relGr.query();
if (!relGr.hasNext()) {
orphans.push({
sys_id: gr.sys_id.toString(),
name: gr.name.toString(),
class: ciClass
});
}
}
});
gs.info('Orphan CIs found: ' + orphans.length);
orphans.forEach(function(o) {
gs.info(' ' + o.class + ': ' + o.name + ' (' + o.sys_id + ')');
});
MCP 替代方案 - 基于查询的方法:
Tool: SN-Query-Table
Parameters:
table_name: cmdb_ci_server
query: operational_status=1^sys_idNOT IN(SELECT parent FROM cmdb_rel_ci)^sys_idNOT IN(SELECT child FROM cmdb_rel_ci)
fields: name,ip_address,sys_class_name
limit: 50
注意:复杂的子查询可能无法通过 REST API 使用。为确保可靠性,请使用后台脚本。
第 7 步:维护关系健康状况
定期清理脚本:
Tool: SN-Execute-Background-Script
Parameters:
description: Clean up invalid relationships
script: |
var deleted = 0;
// Delete relationships where parent CI was deleted
var gr = new GlideRecord('cmdb_rel_ci');
gr.addNullQuery('parent');
gr.query();
while (gr.next()) {
gr.deleteRecord();
deleted++;
}
// Delete relationships where child CI was deleted
gr = new GlideRecord('cmdb_rel_ci');
gr.addNullQuery('child');
gr.query();
while (gr.next()) {
gr.deleteRecord();
deleted++;
}
gs.info('Deleted ' + deleted + ' invalid relationships');
更新过时的关系: 当 CI 的运行状态发生变化时,可能需要更新关系:
Tool: SN-Query-Table
Parameters:
table_name: cmdb_rel_ci
query: parent.operational_status!=1^ORchild.operational_status!=1
fields: sys_id,parent.name,child.name,parent.operational_status,child.operational_status
工具使用概述
| 操作 | MCP 工具 | REST 端点 |
|---|---|---|
| 列出关系类型 | SN-Query-Table | GET /cmdb_rel_type |
| 查询关系 | SN-Query-Table | GET /cmdb_rel_ci |
| 创建关系 | SN-Create-Record | POST /cmdb_rel_ci |
| 删除关系 | SN-Update-Record(设为非活动) | DELETE /cmdb_rel_ci/{id} |
| 复杂查询 | SN-Execute-Background-Script | POST /api/sn_chg_rest/change |
| CI 关系 API | 不适用 | GET /cmdb/instance/{id}/relation |
最佳实践
- 双向认知: 牢记关系有两个视角(父级/子级)
- 精简关系: 每个运行中的 CI 至少应有一个关系
- 类型一致性: 对相似的 CI 模式使用一致的关系类型
- 避免循环依赖: 如果 B 依赖 A,那么 A 就不应依赖 B
- 记录业务背景: 使用关系属性说明关系存在的原因
- 定期审计: 每月运行孤立项检测;每周清理无效关系
- 与发现流程集成: 手动关系应与发现流程创建的关系保持一致
故障排除
关系未显示在依赖视图中
症状: 创建的关系未显示在 CI 依赖视图中
原因: 未将关系类型配置为用于依赖可视化
解决方案: 检查 cmdb_rel_type 记录,确保已适当设置 is_used_by 和 is_dependency 标志
发现后出现重复关系
症状: 同一关系存在多次
原因: 手动创建的关系与发现流程重叠
解决方案: 运行重复项检测脚本;删除重复项并保留由发现流程创建的记录
检测到循环依赖
症状: 影响分析显示无限循环警告
原因: CI A 依赖 B,B 依赖 C,C 依赖 A
解决方案: 检查并打破循环链;这通常表示使用了错误的关系类型
未找到关系类型
症状: 找不到适用于该用例的关系类型
原因: OOB 类型可能无法涵盖所有场景
解决方案: 通过 cmdb_rel_type 表创建自定义关系类型(需要 cmdb_admin)
示例
示例 1:映射三层应用
# 1. Identify the CIs
Business Service: "Customer Portal"
Web Application: "Portal Frontend"
App Server: "prod-app-01"
Database: "Portal DB"
DB Server: "prod-db-01"
# 2. Find relationship type sys_ids
Tool: SN-Query-Table
Parameters:
table_name: cmdb_rel_type
query: nameLIKEDepends on^ORnameLIKERuns on
fields: sys_id,name,parent_descriptor
# 3. Create relationships (batch in one message)
# Service depends on Web App
SN-Create-Record: cmdb_rel_ci
parent: [service_sys_id], child: [webapp_sys_id], type: [depends_on_type]
# Web App runs on App Server
SN-Create-Record: cmdb_rel_ci
parent: [webapp_sys_id], child: [appserver_sys_id], type: [runs_on_type]
# Web App depends on Database
SN-Create-Record: cmdb_rel_ci
parent: [webapp_sys_id], child: [database_sys_id], type: [depends_on_type]
# Database runs on DB Server
SN-Create-Record: cmdb_rel_ci
parent: [database_sys_id], child: [dbserver_sys_id], type: [runs_on_type]
示例 2:孤立项检测与修复
# 1. Find orphan servers
Tool: SN-Execute-Background-Script
Parameters:
script: [orphan detection script from Step 6]
# 2. For each orphan, determine what it hosts
Tool: SN-Query-Table
Parameters:
table_name: cmdb_ci_appl
query: install_dateLIKE[orphan_ip_address]
fields: name,sys_id
# 3. Create missing relationships
Tool: SN-Create-Record
Parameters:
table_name: cmdb_rel_ci
data:
parent: [app_sys_id]
child: [orphan_server_sys_id]
type: [runs_on_type_sys_id]
相关技能
cmdb/ci-discovery- CI 创建与分类cmdb/impact-analysis- 使用关系进行影响分析cmdb/data-quality- CMDB 数据质量管理itsm/change-management- 变更与 CI 关系