关于 service-mapping
该技能为 ServiceNow ITOM Service Mapping 提供服务拓扑管理与排查步骤,面向运维人员和服务负责人。它涵盖依赖分析、映射缺口识别和发现模式检查,可用于变更影响评估及地图验证。
主要功能
- 01查看业务服务拓扑
- 02验证服务映射完整性与准确性
- 03识别未映射或孤立的 CI
- 04分析服务依赖链
- 05检查和排查发现模式
- 06检测服务与基础设施间的映射缺口
适用场景
- 01评估变更对业务服务的影响
- 02排查服务地图缺失或过时
- 03检查发现模式运行故障
- 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_service | GET | 查询业务服务 |
/api/now/table/svc_ci_assoc | GET | 服务与 CI 的关联 |
/api/now/table/sa_pattern | GET | 发现模式 |
/api/now/table/cmdb_rel_ci | GET | CI 关系和依赖项 |
/api/now/table/em_alert | GET | 将警报与服务 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- 使用服务映射进行业务影响分析