mcpField
S
service-mapping

service-mapping

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

关于 service-mapping

该技能为 ServiceNow ITOM Service Mapping 提供服务拓扑管理与排查步骤,面向运维人员和服务负责人。它涵盖依赖分析、映射缺口识别和发现模式检查,可用于变更影响评估及地图验证。

主要功能

  1. 01查看业务服务拓扑
  2. 02验证服务映射完整性与准确性
  3. 03识别未映射或孤立的 CI
  4. 04分析服务依赖链
  5. 05检查和排查发现模式
  6. 06检测服务与基础设施间的映射缺口

适用场景

  1. 01评估变更对业务服务的影响
  2. 02排查服务地图缺失或过时
  3. 03检查发现模式运行故障
  4. 04定位未关联服务的基础设施 CI

MCP 相关

该技能使用 SN-Query-Table、SN-Get-Record、SN-Update-Record、SN-Natural-Language-Search 和 SN-Execute-Background-Script 查询、检查和更新 ServiceNow 服务映射数据。

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/happy-technologies-llc/happy-platform-skills --skill service-mapping

安装后在 Claude Code 中输入/service-mapping确认已加载。

详细介绍

服务映射

概述

此技能提供了一套结构化方法,用于管理 ServiceNow ITOM 服务映射。内容包括:

  • 发现和查看业务服务拓扑
  • 验证服务映射的完整性和准确性
  • 识别应归属于某项服务但尚未映射或已孤立的 CI
  • 分析服务依赖链以评估影响
  • 检查并排查发现模式问题
  • 检测服务与其底层基础设施之间的映射缺口

使用时机: 运维人员或服务负责人需要了解服务拓扑、验证发现结果、排查服务映射故障,或为变更影响分析做准备时。

所需插件: com.snc.service-mapping

前提条件

  • 角色: sm_admin、sm_user、itil 或 cmdb_read
  • 访问权限: 对 cmdb_ci_service、svc_ci_assoc、sa_pattern、cmdb_rel_ci 具有读写权限
  • 知识: 熟悉 CMDB CI 类、服务映射概念和发现模式
  • 插件: 必须激活 com.snc.service-mapping 和 com.snc.service-watch

操作步骤

第 1 步:列出业务服务及其运行状况

检索所有已定义的业务服务,以了解服务全貌。

使用 MCP:

Tool: SN-Query-Table
Parameters:
  table_name: cmdb_ci_service
  query: active=true^ORDERBYname
  fields: sys_id,name,number,operational_status,busines_criticality,owned_by,support_group,sys_class_name,sys_updated_on
  limit: 50

使用 REST API:

GET /api/now/table/cmdb_ci_service?sysparm_query=active=true^ORDERBYname&sysparm_fields=sys_id,name,number,operational_status,busines_criticality,owned_by,support_group,sys_class_name,sys_updated_on&sysparm_display_value=true&sysparm_limit=50

运行状态值:

值标签描述
1正常运行服务正常运行
2维修正在维修或维护
3未运行服务已停止
4灾难恢复待机灾难恢复待机
第 2 步:查看服务映射 CI 关联

检索映射到特定业务服务的所有 CI,以查看其拓扑。

使用 MCP:

Tool: SN-Query-Table
Parameters:
  table_name: svc_ci_assoc
  query: service=[service_sys_id]
  fields: sys_id,service,ci_id,ci_id.name,ci_id.sys_class_name,ci_id.operational_status,port,type,is_manual
  limit: 100

使用 REST API:

GET /api/now/table/svc_ci_assoc?sysparm_query=service=[service_sys_id]&sysparm_fields=sys_id,service,ci_id,port,type,is_manual&sysparm_display_value=true&sysparm_limit=100
第 3 步:分析服务依赖关系

追踪业务服务的上游和下游依赖关系。

使用 MCP:

Tool: SN-Execute-Background-Script
Parameters:
  description: Map service dependency tree for a business service
  script: |
    var svcId = '[service_sys_id]';

    gs.info('=== SERVICE DEPENDENCY ANALYSIS ===');

    // Upstream dependencies (services this service depends on)
    gs.info('\n--- UPSTREAM DEPENDENCIES (Depends On) ---');
    var upstream = new GlideRecord('cmdb_rel_ci');
    upstream.addQuery('child', svcId);
    upstream.addQuery('type.name', 'Depends on::Used by');
    upstream.query();
    while (upstream.next()) {
      var parent = upstream.parent.getRefRecord();
      gs.info('Depends on: ' + parent.name + ' (' + parent.sys_class_name + ') | Status: ' + parent.operational_status.getDisplayValue());
    }

    // Downstream dependencies (services that depend on this)
    gs.info('\n--- DOWNSTREAM DEPENDENCIES (Used By) ---');
    var downstream = new GlideRecord('cmdb_rel_ci');
    downstream.addQuery('parent', svcId);
    downstream.addQuery('type.name', 'Depends on::Used by');
    downstream.query();
    while (downstream.next()) {
      var child = downstream.child.getRefRecord();
      gs.info('Used by: ' + child.name + ' (' + child.sys_class_name + ') | Status: ' + child.operational_status.getDisplayValue());
    }

    // CI count by class
    gs.info('\n--- CI COMPOSITION ---');
    var ga = new GlideAggregate('svc_ci_assoc');
    ga.addQuery('service', svcId);
    ga.addAggregate('COUNT');
    ga.groupBy('ci_id.sys_class_name');
    ga.query();
    while (ga.next()) {
      gs.info('Class: ' + ga.ci_id.sys_class_name + ' | Count: ' + ga.getAggregate('COUNT'));
    }

使用 REST API:

# Upstream dependencies
GET /api/now/table/cmdb_rel_ci?sysparm_query=child=[service_sys_id]^type.name=Depends on::Used by&sysparm_fields=parent,type&sysparm_display_value=true

# Downstream dependencies
GET /api/now/table/cmdb_rel_ci?sysparm_query=parent=[service_sys_id]^type.name=Depends on::Used by&sysparm_fields=child,type&sysparm_display_value=true
第 4 步:检查发现模式

检查服务映射模式,了解如何发现和映射 CI。

使用 MCP:

Tool: SN-Query-Table
Parameters:
  table_name: sa_pattern
  query: active=true^ORDERBYname
  fields: sys_id,name,description,ci_type,status,pattern_type,last_run,run_count,success_count,failure_count
  limit: 50

使用 REST API:

GET /api/now/table/sa_pattern?sysparm_query=active=true^ORDERBYname&sysparm_fields=sys_id,name,description,ci_type,status,pattern_type,last_run,run_count,success_count,failure_count&sysparm_display_value=true&sysparm_limit=50

模式状态参考:

状态描述
就绪模式已准备好运行
运行中模式当前正在执行
已完成上次运行已成功完成
失败上次运行遇到错误
已禁用模式处于非活动状态
第 5 步:识别映射缺口

查找未关联到任何业务服务的 CI。

使用 MCP:

Tool: SN-Execute-Background-Script
Parameters:
  description: Find CIs with no service association (potential mapping gaps)
  script: |
    gs.info('=== SERVICE MAPPING GAP ANALYSIS ===');

    // Find servers not mapped to any service
    var ciClasses = ['cmdb_ci_server', 'cmdb_ci_app_server', 'cmdb_ci_db_instance', 'cmdb_ci_lb'];

    for (var i = 0; i < ciClasses.length; i++) {
      var className = ciClasses[i];
      var gr = new GlideRecord(className);
      gr.addQuery('operational_status', '1'); // Operational only
      gr.addQuery('install_status', '1');     // Installed
      gr.addJoinQuery('svc_ci_assoc', 'sys_id', 'ci_id', true); // LEFT JOIN - no association
      gr.setLimit(20);
      gr.query();

      if (gr.getRowCount() > 0) {
        gs.info('\n--- Unmapped ' + className + ' (showing up to 20) ---');
        while (gr.next()) {
          gs.info('CI: ' + gr.name + ' | IP: ' + gr.ip_address + ' | Location: ' + gr.location.getDisplayValue());
        }
      }
    }

    // Count total mapped vs unmapped
    gs.info('\n--- MAPPING COVERAGE SUMMARY ---');
    var totalCIs = new GlideAggregate('cmdb_ci');
    totalCIs.addQuery('install_status', '1');
    totalCIs.addAggregate('COUNT');
    totalCIs.query();
    totalCIs.next();
    var total = parseInt(totalCIs.getAggregate('COUNT'));

    var mappedCIs = new GlideAggregate('svc_ci_assoc');
    mappedCIs.addAggregate('COUNT', 'DISTINCT', 'ci_id');
    mappedCIs.query();
    mappedCIs.next();
    var mapped = parseInt(mappedCIs.getAggregate('COUNT', 'DISTINCT', 'ci_id'));

    gs.info('Total installed CIs: ' + total);
    gs.info('CIs mapped to services: ' + mapped);
    gs.info('Unmapped CIs: ' + (total - mapped));
    gs.info('Coverage: ' + Math.round((mapped / total) * 100) + '%');
第 6 步:验证服务映射的准确性

将服务映射与活动警报交叉核对,以检测过时或不正确的映射。

使用 MCP:

Tool: SN-Execute-Background-Script
Parameters:
  description: Cross-reference service maps with alerts
  script: |
    gs.info('=== SERVICE MAP VALIDATION ===');

    var svc = new GlideRecord('cmdb_ci_service');
    svc.addQuery('active', true);
    svc.query();

    while (svc.next()) {
      // Check for alerts on CIs in this service
      var assoc = new GlideRecord('svc_ci_assoc');
      assoc.addQuery('service', svc.sys_id.toString());
      assoc.query();

      var alertCount = 0;
      var staleCIs = 0;

      while (assoc.next()) {
        var ciId = assoc.ci_id.toString();

        // Check for active alerts
        var alert = new GlideAggregate('em_alert');
        alert.addQuery('ci', ciId);
        alert.addQuery('state', '!=', 'Closed');
        alert.addAggregate('COUNT');
        alert.query();
        if (alert.next()) {
          alertCount += parseInt(alert.getAggregate('COUNT'));
        }

        // Check for stale CIs (not updated in 90 days)
        var ci = new GlideRecord('cmdb_ci');
        if (ci.get(ciId)) {
          var lastUpdate = new GlideDateTime(ci.sys_updated_on.toString());
          var cutoff = new GlideDateTime();
          cutoff.addDaysLocalTime(-90);
          if (lastUpdate.before(cutoff)) {
            staleCIs++;
          }
        }
      }

      if (alertCount > 0 || staleCIs > 0) {
        gs.info('Service: ' + svc.name + ' | Active Alerts: ' + alertCount + ' | Stale CIs: ' + staleCIs);
      }
    }
第 7 步:排查发现模式失败问题

调查已失败或产生意外结果的模式。

使用 MCP:

Tool: SN-Query-Table
Parameters:
  table_name: sa_pattern
  query: status=Failed^ORactive=true^failure_count>0
  fields: sys_id,name,ci_type,status,last_run,failure_count,success_count,error_message
  limit: 20

使用 REST API:

GET /api/now/table/sa_pattern?sysparm_query=status=Failed^ORactive=true^failure_count>0&sysparm_fields=sys_id,name,ci_type,status,last_run,failure_count,success_count,error_message&sysparm_display_value=true&sysparm_limit=20

工具使用

MCP 工具参考
工具使用时机
SN-Query-Table查询服务、关联、模式和关系
SN-Get-Record检索单条服务或模式记录
SN-Update-Record更新服务状态或模式配置
SN-Natural-Language-Search使用自然语言搜索,例如“具有失败模式的服务”
SN-Execute-Background-Script依赖分析、缺口检测和批量验证
REST API 参考
端点方法用途
/api/now/table/cmdb_ci_serviceGET查询业务服务
/api/now/table/svc_ci_assocGET服务与 CI 的关联
/api/now/table/sa_patternGET发现模式
/api/now/table/cmdb_rel_ciGETCI 关系和依赖项
/api/now/table/em_alertGET将警报与服务 CI 交叉引用

最佳实践

  • 自上而下映射: 从业务服务开始,向下映射到基础设施,确保保留业务上下文
  • 发现后进行验证: 将新的模式结果推广到生产服务映射之前,务必先进行审核
  • 监控覆盖率指标: 跟踪已映射到服务的运行中 CI 百分比,并设定改进目标
  • 谨慎使用手动条目: 手动 CI 关联会绕过发现验证;优先使用模式驱动的映射
  • 审核过时的映射: 安排每季度审核,从服务映射中移除已停用的 CI
  • 与变更管理相关联: 重大变更后验证服务映射,确保拓扑准确

故障排除

模式因凭据错误而失败

原因: 发现凭据已过期,或没有目标主机上的相应权限 解决方案: 在 Discovery Credentials 模块中验证凭据。从 MID Server 测试 SSH/WMI/SNMP 连通性。

服务映射中缺少 CI

原因: 模式未覆盖该 CI 类,或入口点不正确 解决方案: 检查模式的入口点配置。确认该 CI 类是否有适用的模式。验证从 MID Server 到目标的网络连通性。

服务映射中出现重复 CI

原因: 协调规则未能正确匹配,导致创建重复的 CI 解决方案: 检查受影响 CI 类的 IRE(识别与协调引擎)规则。检查 discovery_source 字段是否存在冲突来源。

服务映射显示过时的拓扑

原因: 发现计划未运行,或模式已禁用 解决方案: 确认发现计划处于启用状态,并在正确的 MID Server 上运行。检查 sa_pattern.last_run 以确认执行情况。

示例

示例 1:完整服务拓扑报告
# 1. Get the business service
Tool: SN-Query-Table
Parameters:
  table_name: cmdb_ci_service
  query: name=Email Service
  fields: sys_id,name,operational_status,busines_criticality,owned_by
  limit: 1

# 2. Get all CIs in the service map
Tool: SN-Query-Table
Parameters:
  table_name: svc_ci_assoc
  query: service=[service_sys_id]
  fields: ci_id,ci_id.name,ci_id.sys_class_name,ci_id.operational_status,port,type
  limit: 200

# 3. Get dependency relationships
Tool: SN-Query-Table
Parameters:
  table_name: cmdb_rel_ci
  query: parent=[service_sys_id]^ORchild=[service_sys_id]
  fields: parent,child,type
  limit: 50
示例 2:变更前影响评估
# 1. Find all services affected by a CI undergoing change
Tool: SN-Query-Table
Parameters:
  table_name: svc_ci_assoc
  query: ci_id=[ci_sys_id]
  fields: service,service.name,service.busines_criticality,type
  limit: 20

# 2. For each affected service, get downstream consumers
Tool: SN-Query-Table
Parameters:
  table_name: cmdb_rel_ci
  query: parent=[service_sys_id]^type.name=Depends on::Used by
  fields: child,child.name,child.sys_class_name
  limit: 50
示例 3:发现模式运行状况检查
Tool: SN-Execute-Background-Script
Parameters:
  description: Summary of pattern health
  script: |
    var ga = new GlideAggregate('sa_pattern');
    ga.addQuery('active', true);
    ga.addAggregate('COUNT');
    ga.groupBy('status');
    ga.query();

    gs.info('=== PATTERN HEALTH SUMMARY ===');
    while (ga.next()) {
      gs.info('Status: ' + ga.status.getDisplayValue() + ' | Count: ' + ga.getAggregate('COUNT'));
    }

相关技能

  • itom/alert-analysis - 分析与已映射服务相关的警报
  • itom/observability-integration - 将外部监控与服务映射集成
  • itom/health-log-analytics - 监控已映射服务组件的运行状况
  • cmdb/relationship-mapping - CMDB 关系管理
  • cmdb/impact-analysis - 使用服务映射进行业务影响分析

参考资料

评论

支持 Markdown