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 Service Mappingでサービスマップを管理するための構造化されたアプローチを提供します。以下の内容を扱います。

  • ビジネスサービスのトポロジーを検出して表示する
  • サービスマップの完全性と正確性を検証する
  • サービスに属するべき、マッピングされていないCIや孤立した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運用停止サービスが停止しています
4DR待機中災害復旧の待機状態です
ステップ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(Identification and Reconciliation Engine)ルールを確認します。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 - サービスマップを使用したビジネス影響分析

参考資料

コメント