mcpField
R
relationship-mapping

relationship-mapping

github.com/happy-technologies-llc云与 DevOps4141 次安装2 天前更新
代码仓库

关于 relationship-mapping

relationship-mapping 是面向 ServiceNow CMDB 的技能,帮助团队建模 CI 关系并维护依赖数据。内容涵盖关系创建与验证、依赖链分析、孤立 CI 检测及关系健康检查。

主要功能

  1. 01了解关系类型及其含义
  2. 02查询现有 CI 关系
  3. 03创建并验证关系
  4. 04分析依赖链
  5. 05检测孤立 CI
  6. 06审计关系健康状况

适用场景

  1. 01建模服务与基础设施之间的依赖
  2. 02变更前评估影响范围
  3. 03在 CMDB 审计中查找孤立 CI
  4. 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-TableGET /cmdb_rel_type
查询关系SN-Query-TableGET /cmdb_rel_ci
创建关系SN-Create-RecordPOST /cmdb_rel_ci
删除关系SN-Update-Record(设为非活动)DELETE /cmdb_rel_ci/{id}
复杂查询SN-Execute-Background-ScriptPOST /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 关系

参考资料

评论

支持 Markdown