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. 03CMDB監査で孤立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_admin または CMDB 書き込みアクセス権を持つ 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

ベストプラクティス

  • 双方向の把握: 関係には 2 つの視点(親/子)があることを覚えておきます
  • 関係の最小化: すべての運用 CI に少なくとも 1 つの関係を設定します
  • タイプの一貫性: 類似する CI パターン間で一貫した関係タイプを使用します
  • 循環依存の回避: B が A に依存している場合、A は B に依存しないようにします
  • ビジネスコンテキストの記録: 関係属性を使用して、関係が存在する理由を説明します
  • 定期監査: 孤立した CI の検出を毎月、無効な関係のクリーンアップを毎週実行します
  • ディスカバリーとの連携: 手動で作成した関係を、ディスカバリーで作成された関係と整合させます

トラブルシューティング

依存関係ビューに関係が表示されない

症状: 作成した関係が CI の依存関係ビューに表示されません 原因: 関係タイプが依存関係の可視化用に設定されていません 解決策: cmdb_rel_type レコードを確認し、is_used_by と is_dependency のフラグが適切に設定されていることを確認します

ディスカバリー後に重複した関係ができる

症状: 同じ関係が複数存在します 原因: 手動での作成とディスカバリーが重複しました 解決策: 重複検出スクリプトを実行し、ディスカバリーで作成されたレコードを残して重複を削除します

循環依存が検出される

症状: 影響分析で無限ループの警告が表示されます 原因: CI A が B に依存し、B が C に依存し、C が A に依存しています 解決策: 循環する依存関係を確認して解消します。多くの場合、関係タイプの使い方が誤っていることを示しています

関係タイプが見つからない

症状: ユースケースに適した関係タイプが見つかりません 原因: OOB タイプではすべてのシナリオを網羅できない場合があります 解決策: cmdb_rel_type テーブルを使用してカスタム関係タイプを作成します(cmdb_admin が必要です)

例

例 1:3 層アプリケーションのマッピング
# 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:孤立した CI の検出と修復
# 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 の関係

参考資料

コメント