mcpField
I
impact-analysis

impact-analysis

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

关于 impact-analysis

impact-analysis 是供变更经理和 IT 团队使用的 ServiceNow 技能,用于评估配置项变更对依赖系统和业务服务的影响。它追踪 CMDB 关系、结合配置项关键性评估风险,并为 CAB 审查整理影响信息。

主要功能

  1. 01查找配置项
  2. 02追踪依赖关系
  3. 03识别受影响的业务服务
  4. 04评估配置项关键性与变更风险
  5. 05生成影响报告
  6. 06将受影响配置项关联到变更请求

适用场景

  1. 01评估数据库服务器维护变更
  2. 02审查应用部署影响
  3. 03为 CAB 准备影响信息
  4. 04在事件分诊时调查服务影响

MCP 相关

使用 ServiceNow MCP 工具查询配置项、CMDB 关系和服务关联,执行后台分析,并将受影响配置项关联到变更请求。

安装

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

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

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

详细介绍

变更影响分析

概述

影响分析用于确定 CI 变更会影响哪些内容。本技能涵盖:

  • 使用 CMDB 关系追踪影响路径
  • 识别受影响的业务服务
  • 将 CI 关键性映射为业务影响
  • 根据 CI 关系量化变更风险
  • 生成供 CAB 审核的影响报告

**使用时机:**实施变更前、事件分类期间、容量规划时,或评估新部署时。

**价值主张:**准确的影响分析可避免意外停机、减少变更失败,并支持知情的风险决策。

前提条件

  • **角色:**具有 itil、change_manager 或 cmdb_read 访问权限
  • **访问权限:**cmdb_ci、cmdb_rel_ci、cmdb_ci_service、service_ci_assoc 表
  • **知识:**CMDB 关系、服务映射概念
  • **相关技能:**先完成 cmdb/relationship-mapping

操作流程

步骤 1:确定要变更的 CI

首先,找到将受变更影响的 CI:

按名称搜索:

Tool: SN-Query-Table
Parameters:
  table_name: cmdb_ci
  query: nameLIKEprod-web-01
  fields: sys_id,name,sys_class_name,operational_status,business_criticality

按 IP 地址搜索:

Tool: SN-Query-Table
Parameters:
  table_name: cmdb_ci_computer
  query: ip_address=10.0.1.100
  fields: sys_id,name,sys_class_name,operational_status,support_group

使用便捷工具:

Tool: SN-List-CmdbCis
Parameters:
  ci_class: cmdb_ci_server
  query: name=prod-web-01
  fields: sys_id,name,business_criticality,support_group
步骤 2:映射上游影响(哪些内容依赖此 CI)

追踪依赖于要变更 CI 的内容:

直接依赖(1 层):

Tool: SN-Query-Table
Parameters:
  table_name: cmdb_rel_ci
  query: child=[ci_sys_id]^type.parent_descriptorLIKEDepends
  fields: parent,parent.name,parent.sys_class_name,type.parent_descriptor

获取依赖 CI 的详细信息:

Tool: SN-Query-Table
Parameters:
  table_name: cmdb_ci
  query: sys_idIN[comma_separated_parent_ids]
  fields: sys_id,name,sys_class_name,business_criticality,operational_status

多层依赖链(递归):

Tool: SN-Execute-Background-Script
Parameters:
  description: Trace full upstream impact
  script: |
    var targetCiId = 'YOUR_CI_SYS_ID';
    var maxDepth = 5;
    var impactedCIs = [];
    var visited = {};

    function traceUpstream(ciId, depth) {
      if (depth > maxDepth || visited[ciId]) return;
      visited[ciId] = true;

      var gr = new GlideRecord('cmdb_rel_ci');
      gr.addQuery('child', ciId);
      gr.addQuery('type.parent_descriptor', 'CONTAINS', 'Depends');
      gr.query();

      while (gr.next()) {
        var parentId = gr.parent.toString();
        var parentCi = new GlideRecord('cmdb_ci');
        if (parentCi.get(parentId)) {
          impactedCIs.push({
            depth: depth,
            sys_id: parentId,
            name: parentCi.name.toString(),
            class: parentCi.sys_class_name.toString(),
            criticality: parentCi.business_criticality.toString()
          });
          traceUpstream(parentId, depth + 1);
        }
      }
    }

    traceUpstream(targetCiId, 1);

    gs.info('=== UPSTREAM IMPACT ANALYSIS ===');
    gs.info('Total CIs impacted: ' + impactedCIs.length);
    impactedCIs.forEach(function(ci) {
      gs.info('Level ' + ci.depth + ': ' + ci.name + ' (' + ci.class + ') - Criticality: ' + ci.criticality);
    });
步骤 3:识别受影响的业务服务

业务服务位于依赖链的顶层,代表业务价值:

查找直接关联的服务:

Tool: SN-Query-Table
Parameters:
  table_name: service_ci_assoc
  query: ci_id=[ci_sys_id]
  fields: service_id,service_id.name,service_id.operational_status

通过关系链查找服务:

Tool: SN-Query-Table
Parameters:
  table_name: cmdb_rel_ci
  query: child=[ci_sys_id]^parent.sys_class_nameLIKEcmdb_ci_service
  fields: parent,parent.name,parent.operational_status,parent.busines_criticality

全面分析服务影响:

Tool: SN-Execute-Background-Script
Parameters:
  description: Find all affected business services
  script: |
    var targetCiId = 'YOUR_CI_SYS_ID';
    var affectedServices = [];
    var visited = {};

    function findServices(ciId, path) {
      if (visited[ciId]) return;
      visited[ciId] = true;

      // Check if this CI is a service
      var ci = new GlideRecord('cmdb_ci');
      if (ci.get(ciId)) {
        if (ci.sys_class_name.toString().indexOf('cmdb_ci_service') !== -1) {
          affectedServices.push({
            sys_id: ciId,
            name: ci.name.toString(),
            criticality: ci.business_criticality.toString(),
            path: path.join(' -> ')
          });
          return;
        }
      }

      // Check direct service associations
      var assoc = new GlideRecord('service_ci_assoc');
      assoc.addQuery('ci_id', ciId);
      assoc.query();
      while (assoc.next()) {
        var svc = new GlideRecord('cmdb_ci_service');
        if (svc.get(assoc.service_id)) {
          affectedServices.push({
            sys_id: svc.sys_id.toString(),
            name: svc.name.toString(),
            criticality: svc.business_criticality.toString(),
            path: path.join(' -> ') + ' -> (direct association)'
          });
        }
      }

      // Traverse upstream
      var gr = new GlideRecord('cmdb_rel_ci');
      gr.addQuery('child', ciId);
      gr.query();
      while (gr.next()) {
        var parentId = gr.parent.toString();
        var parentCi = new GlideRecord('cmdb_ci');
        if (parentCi.get(parentId)) {
          findServices(parentId, path.concat([parentCi.name.toString()]));
        }
      }
    }

    var startCi = new GlideRecord('cmdb_ci');
    startCi.get(targetCiId);
    findServices(targetCiId, [startCi.name.toString()]);

    gs.info('=== AFFECTED BUSINESS SERVICES ===');
    gs.info('Total services: ' + affectedServices.length);
    affectedServices.forEach(function(svc) {
      gs.info('Service: ' + svc.name + ' | Criticality: ' + svc.criticality);
      gs.info('  Path: ' + svc.path);
    });
步骤 4:评估业务关键性

CI 关键性决定变更风险级别:

业务关键性值:

值标签描述变更风险
1最关键核心业务运营很高
2关键重要业务功能高
3重要支持性功能中
4较重要非必要功能低
5非关键对业务影响极小很低

计算综合风险:

Tool: SN-Execute-Background-Script
Parameters:
  description: Calculate change risk score
  script: |
    var targetCiId = 'YOUR_CI_SYS_ID';
    var impactData = {
      directCriticality: '',
      servicesImpacted: 0,
      criticalServicesImpacted: 0,
      totalDependentCIs: 0,
      riskScore: 0
    };

    // Get target CI criticality
    var targetCi = new GlideRecord('cmdb_ci');
    if (targetCi.get(targetCiId)) {
      impactData.directCriticality = targetCi.business_criticality.toString() || '5';
    }

    // Count dependent CIs and criticality
    var visited = {};
    function countImpact(ciId) {
      if (visited[ciId]) return;
      visited[ciId] = true;

      var gr = new GlideRecord('cmdb_rel_ci');
      gr.addQuery('child', ciId);
      gr.query();

      while (gr.next()) {
        var parentCi = new GlideRecord('cmdb_ci');
        if (parentCi.get(gr.parent)) {
          impactData.totalDependentCIs++;

          if (parentCi.sys_class_name.toString().indexOf('service') !== -1) {
            impactData.servicesImpacted++;
            if (parseInt(parentCi.business_criticality) <= 2) {
              impactData.criticalServicesImpacted++;
            }
          }

          countImpact(gr.parent.toString());
        }
      }
    }

    countImpact(targetCiId);

    // Calculate risk score (1-10)
    var critScore = 6 - parseInt(impactData.directCriticality || 5);
    var svcScore = Math.min(impactData.servicesImpacted * 2, 4);
    var critSvcScore = impactData.criticalServicesImpacted * 2;
    impactData.riskScore = Math.min(critScore + svcScore + critSvcScore, 10);

    gs.info('=== RISK ASSESSMENT ===');
    gs.info('Direct CI Criticality: ' + impactData.directCriticality);
    gs.info('Dependent CIs: ' + impactData.totalDependentCIs);
    gs.info('Services Impacted: ' + impactData.servicesImpacted);
    gs.info('Critical Services: ' + impactData.criticalServicesImpacted);
    gs.info('RISK SCORE: ' + impactData.riskScore + '/10');
    gs.info('Recommendation: ' + (impactData.riskScore >= 7 ? 'CAB REVIEW REQUIRED' : impactData.riskScore >= 4 ? 'Peer Review Recommended' : 'Standard Change Process'));
步骤 5:生成影响报告

创建供 CAB 审核的全面影响报告:

以结构化格式获取所有影响数据:

Tool: SN-Execute-Background-Script
Parameters:
  description: Generate comprehensive impact report
  script: |
    var targetCiId = 'YOUR_CI_SYS_ID';
    var report = {
      generatedAt: new GlideDateTime().getDisplayValue(),
      targetCI: {},
      upstreamImpact: [],
      downstreamImpact: [],
      affectedServices: [],
      affectedUsers: 0,
      riskLevel: '',
      recommendations: []
    };

    // Target CI details
    var targetCi = new GlideRecord('cmdb_ci');
    if (targetCi.get(targetCiId)) {
      report.targetCI = {
        name: targetCi.name.toString(),
        class: targetCi.sys_class_name.toString(),
        criticality: targetCi.business_criticality.getDisplayValue(),
        environment: targetCi.environment.toString(),
        supportGroup: targetCi.support_group.getDisplayValue(),
        location: targetCi.location.getDisplayValue()
      };
    }

    // Upstream (what depends on this)
    var upGr = new GlideRecord('cmdb_rel_ci');
    upGr.addQuery('child', targetCiId);
    upGr.query();
    while (upGr.next()) {
      var upCi = new GlideRecord('cmdb_ci');
      if (upCi.get(upGr.parent)) {
        report.upstreamImpact.push({
          name: upCi.name.toString(),
          class: upCi.sys_class_name.toString(),
          criticality: upCi.business_criticality.getDisplayValue()
        });
      }
    }

    // Downstream (what this depends on)
    var downGr = new GlideRecord('cmdb_rel_ci');
    downGr.addQuery('parent', targetCiId);
    downGr.query();
    while (downGr.next()) {
      var downCi = new GlideRecord('cmdb_ci');
      if (downCi.get(downGr.child)) {
        report.downstreamImpact.push({
          name: downCi.name.toString(),
          class: downCi.sys_class_name.toString()
        });
      }
    }

    // Services
    var svcAssoc = new GlideRecord('service_ci_assoc');
    svcAssoc.addQuery('ci_id', targetCiId);
    svcAssoc.query();
    while (svcAssoc.next()) {
      var svc = new GlideRecord('cmdb_ci_service');
      if (svc.get(svcAssoc.service_id)) {
        report.affectedServices.push({
          name: svc.name.toString(),
          criticality: svc.business_criticality.getDisplayValue()
        });
      }
    }

    // Estimate affected users (if service has user_base field)
    report.affectedServices.forEach(function(svc) {
      var svcGr = new GlideRecord('cmdb_ci_service');
      svcGr.addQuery('name', svc.name);
      svcGr.query();
      if (svcGr.next() && svcGr.user_base) {
        report.affectedUsers += parseInt(svcGr.user_base) || 0;
      }
    });

    // Risk level
    var criticalCount = report.affectedServices.filter(function(s) {
      return s.criticality === 'Most Critical' || s.criticality === 'Critical';
    }).length;

    if (criticalCount > 0 || report.upstreamImpact.length > 10) {
      report.riskLevel = 'HIGH';
      report.recommendations.push('Schedule during maintenance window');
      report.recommendations.push('Prepare rollback plan');
      report.recommendations.push('Notify affected service owners');
    } else if (report.upstreamImpact.length > 3) {
      report.riskLevel = 'MEDIUM';
      report.recommendations.push('Peer review recommended');
      report.recommendations.push('Test in non-prod first');
    } else {
      report.riskLevel = 'LOW';
      report.recommendations.push('Standard change process');
    }

    gs.info(JSON.stringify(report, null, 2));
步骤 6:将影响关联到变更请求

将影响分析与变更请求关联起来:

将受影响的 CI 添加到变更中:

Tool: SN-Create-Record
Parameters:
  table_name: task_ci
  data:
    task: [change_request_sys_id]
    ci_item: [affected_ci_sys_id]

使用影响摘要更新变更:

Tool: SN-Update-Record
Parameters:
  table_name: change_request
  sys_id: [change_sys_id]
  data:
    impact: 2  # 1=High, 2=Medium, 3=Low
    risk: "Medium"
    business_duration: "4 hours"
    justification: "Impact analysis shows 5 dependent services, 2 critical"

工具用法摘要

操作MCP 工具REST 端点
查找 CISN-Query-Table、SN-List-CmdbCisGET /cmdb_ci
查询关系SN-Query-TableGET /cmdb_rel_ci
查找服务SN-Query-TableGET /cmdb_ci_service
服务关联SN-Query-TableGET /service_ci_assoc
复杂分析SN-Execute-Background-ScriptPOST /api/sn_chg_rest
关联到变更SN-Create-RecordPOST /task_ci

最佳实践

  • **先广后深:**先识别所有第一层依赖,再递归追踪
  • **考虑两个方向:**影响会沿上游(依赖项)传播,也会沿下游(基础设施)传播
  • **考虑时间因素:**同一项变更在工作时间和维护窗口期间造成的影响不同
  • **记录假设:**记录 CMDB 中未体现的关系假设
  • **提交 CAB 前进行验证:**提交给 CAB 前,手动验证关键路径
  • **先更新 CMDB:**如果缺少关系,请在完成影响分析前添加这些关系

风险评估矩阵

标准低(1 分)中(2 分)高(3 分)
CI 关键性非关键重要关键/最关键
受影响的服务0-12-56+
关键服务012+
用户影响<100100-10001000+
恢复时间<1 小时1-4 小时4+ 小时

风险评分说明:

  • 5-7:低风险 - 标准变更流程
  • 8-11:中风险 - 需要同行评审
  • 12-15:高风险 - 需要 CAB 评审

故障排查

影响分析未显示任何依赖关系

症状: CI 显示没有上游影响,但显然被服务使用 原因: CMDB 中缺少关系 解决方案: 使用 cmdb/relationship-mapping 技能检查并创建缺失的关系

受影响项中未显示服务

症状: 已知的业务服务未显示为受影响 原因: 缺少 service_ci_assoc 记录或关系 解决方案:

  1. 检查 service_ci_assoc 中是否存在直接关联
  2. 检查 cmdb_rel_ci 中的关系链
  3. 创建缺失的关联
风险评分似乎过低

症状: 关键基础设施的风险评分较低 原因: CI 未设置业务关键性 解决方案: 分析前更新 CI 上的 business_criticality 字段

递归查询超时

症状: 复杂环境中的后台脚本超时 原因: 递归层级过多或查询优化不佳 解决方案: 降低 maxDepth,或使用带限制的索引查询

示例

示例 1:数据库服务器维护影响
# 1. Find the database server
Tool: SN-Query-Table
Parameters:
  table_name: cmdb_ci_server
  query: name=prod-db-01
  fields: sys_id,name,business_criticality

# Result: sys_id = abc123, criticality = 2 (Critical)

# 2. Find what runs on this server
Tool: SN-Query-Table
Parameters:
  table_name: cmdb_rel_ci
  query: child=abc123^type.parent_descriptorLIKERuns
  fields: parent.name,parent.sys_class_name

# Result: Oracle DB Instance, MySQL Instance

# 3. Find what depends on these databases
Tool: SN-Query-Table
Parameters:
  table_name: cmdb_rel_ci
  query: child.nameLIKEOracle^ORchild.nameLIKEMySQL
  fields: parent.name,parent.sys_class_name

# Result: ERP Application, HR Portal, Customer Portal

# 4. Find affected services
Tool: SN-Query-Table
Parameters:
  table_name: service_ci_assoc
  query: ci_id.nameLIKEPortal^ORci_id.nameLIKEERP
  fields: service_id.name,service_id.business_criticality

# Result:
#   - Customer Service (Critical)
#   - HR Services (Important)
#   - Finance Operations (Most Critical)

# CONCLUSION: HIGH RISK - 3 services affected, 2 critical
示例 2:应用部署影响
# Scenario: Deploying new version of "Portal Frontend" application

# 1. Get application CI
Tool: SN-List-CmdbCis
Parameters:
  ci_class: cmdb_ci_appl
  query: name=Portal Frontend
  fields: sys_id,business_criticality,support_group

# 2. Run full impact analysis script (from Step 5)
# This returns structured JSON with:
# - All dependent CIs
# - Affected services
# - Risk score
# - Recommendations

# 3. Create impact record for change
Tool: SN-Update-Record
Parameters:
  table_name: change_request
  sys_id: CHG0012345_sys_id
  data:
    impact: 2
    risk: "Medium"
    justification: |
      Impact Analysis Results:
      - 1 Business Service Affected: Customer Portal
      - 3 Dependent Components: Load Balancer, CDN, Auth Service
      - Risk Score: 6/10
      - Recommended: Peer review, rollback plan ready

相关技能

  • cmdb/relationship-mapping - 创建和验证关系
  • cmdb/ci-discovery - CI 创建与分类
  • cmdb/data-quality - 确保 CMDB 准确性,以便可靠地进行影响分析
  • itsm/change-management - 变更请求工作流

参考资料

评论

支持 Markdown