data-quality について
ServiceNow CMDBのデータ品質を評価・維持するための手順をまとめたスキルです。CMDBの管理やレビューを担当する人向けに、品質指標、重複や古いレコードの検出、データガバナンスを扱います。
主な機能
- 01完全性や正確性などの品質指標測定
- 02構成アイテムの重複検出
- 03古いレコードや孤立レコードの特定
- 04データ調整プロセスの計画
- 05継続的なデータガバナンスの確立
活用シーン
- 01CMDBの健全性評価
- 02大規模変更前のCIデータ確認
- 03CMDBレコードの定期メンテナンス
- 04重複データや古いデータの調査
MCP 対応
ServiceNowのMCPツールでCMDBテーブルを検索し、バックグラウンドスクリプトを実行してデータ品質の問題を確認、検出、報告する方法を示します。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ happy-technologies-llc/ happy-platform-skills --skill data-qualityインストール後、Claude Code で/data-qualityを入力して読み込まれたか確認します。
詳細
CMDB データ品質管理
概要
CMDB の価値は、データ品質によって決まります。データの品質が低いと、変更の失敗、誤った影響分析、信頼の喪失につながります。このスキルでは、次の内容を扱います。
- データ品質 KPI(完全性、正確性、一貫性)の測定
- 重複した CI の検出と解決
- 古いレコードや孤立レコードの特定と管理
- リコンシリエーションプロセスの実装
- 継続的なデータガバナンスの確立
使用する場面: CMDB の健全性評価時、大規模な変更の前、定期メンテナンスの一環として、または CMDB への信頼が低い場合に使用します。
価値提案: 高品質な CMDB データにより、変更失敗率を 50% 削減し、インシデント解決時間を 30% 短縮し、監査コンプライアンスを向上できます。
前提条件
- ロール: フルアクセスには
cmdb_admin、読み取り専用の評価にはitil - アクセス: cmdb_ci、cmdb_rel_ci、sys_audit テーブル
- 知識: CMDB の構造、識別ルール
- 関連スキル:
cmdb/ci-discovery、cmdb/relationship-mapping
データ品質のディメンション
| ディメンション | 定義 | 目標 | 測定方法 |
|---|---|---|---|
| 完全性 | 必須フィールドが入力されている | >95% | すべての必須フィールドが入力されたレコードの割合 |
| 正確性 | データが実態と一致している | >90% | 信頼できる情報源と照合して検証された割合 |
| 一貫性 | 矛盾するデータがない | >98% | 矛盾のないレコードの割合 |
| 適時性 | データが最新である | <30 日 | しきい値内に更新された割合 |
| 一意性 | 重複がない | >99% | 一意なレコードの割合 |
| 妥当性 | 値が許可された範囲内にある | >99% | 検証ルールを通過した割合 |
手順
ステップ 1:完全性を評価する
完全性は、必須フィールドが入力されているかどうかを測定します。
CI クラスごとに必須フィールドを定義します。
| CI クラス | 必須フィールド |
|---|---|
| cmdb_ci_server | name, ip_address, os, operational_status, support_group |
| cmdb_ci_appl | name, version, operational_status, support_group, install_status |
| cmdb_ci_service | name, operational_status, business_criticality, owned_by |
| cmdb_ci_database | name, type, version, operational_status |
サーバーの完全性を確認します。
Tool: SN-Query-Table
Parameters:
table_name: cmdb_ci_server
query: operational_status=1^nameISEMPTY^ORip_addressISEMPTY^ORsupport_groupISEMPTY
fields: sys_id,name,ip_address,support_group
limit: 100
包括的な完全性監査:
Tool: SN-Execute-Background-Script
Parameters:
description: CMDB Completeness Audit
script: |
var mandatoryFields = {
'cmdb_ci_server': ['name', 'ip_address', 'os', 'operational_status', 'support_group'],
'cmdb_ci_appl': ['name', 'version', 'operational_status', 'support_group'],
'cmdb_ci_service': ['name', 'operational_status', 'business_criticality', 'owned_by'],
'cmdb_ci_database_instance': ['name', 'type', 'version', 'operational_status']
};
var results = {};
for (var ciClass in mandatoryFields) {
var fields = mandatoryFields[ciClass];
var total = 0;
var complete = 0;
var incomplete = [];
var gr = new GlideRecord(ciClass);
gr.addQuery('operational_status', '1'); // Only operational CIs
gr.query();
while (gr.next()) {
total++;
var isComplete = true;
var missingFields = [];
for (var i = 0; i < fields.length; i++) {
if (gr.getValue(fields[i]) === null || gr.getValue(fields[i]) === '') {
isComplete = false;
missingFields.push(fields[i]);
}
}
if (isComplete) {
complete++;
} else {
incomplete.push({
sys_id: gr.sys_id.toString(),
name: gr.name.toString(),
missing: missingFields
});
}
}
results[ciClass] = {
total: total,
complete: complete,
completeness: total > 0 ? Math.round((complete / total) * 100) : 100,
incomplete: incomplete.slice(0, 10) // First 10 examples
};
}
gs.info('=== COMPLETENESS AUDIT RESULTS ===');
for (var cls in results) {
var r = results[cls];
gs.info(cls + ': ' + r.completeness + '% complete (' + r.complete + '/' + r.total + ')');
if (r.incomplete.length > 0) {
gs.info(' Examples of incomplete records:');
r.incomplete.forEach(function(inc) {
gs.info(' ' + inc.name + ' - Missing: ' + inc.missing.join(', '));
});
}
}
ステップ 2:重複を検出する
重複は CMDB への信頼を損ない、混乱を招きます。
名前で重複の可能性があるレコードを検索します。
Tool: SN-Execute-Background-Script
Parameters:
description: Find duplicate CIs by name
script: |
var duplicates = new GlideAggregate('cmdb_ci');
duplicates.addQuery('operational_status', '1');
duplicates.addAggregate('COUNT');
duplicates.groupBy('name');
duplicates.addHaving('COUNT', '>', 1);
duplicates.orderByAggregate('COUNT', 'DESC');
duplicates.query();
gs.info('=== DUPLICATE CI NAMES ===');
var count = 0;
while (duplicates.next() && count < 20) {
var name = duplicates.name.toString();
var dupCount = duplicates.getAggregate('COUNT');
gs.info('Name: "' + name + '" - Count: ' + dupCount);
// Show details
var details = new GlideRecord('cmdb_ci');
details.addQuery('name', name);
details.addQuery('operational_status', '1');
details.query();
while (details.next()) {
gs.info(' sys_id=' + details.sys_id + ', class=' + details.sys_class_name + ', ip=' + details.ip_address + ', created=' + details.sys_created_on);
}
count++;
}
gs.info('Total duplicate name groups: ' + duplicates.getRowCount());
IP アドレスで重複を検索します。
Tool: SN-Execute-Background-Script
Parameters:
description: Find duplicate CIs by IP address
script: |
var duplicates = new GlideAggregate('cmdb_ci_computer');
duplicates.addQuery('operational_status', '1');
duplicates.addNotNullQuery('ip_address');
duplicates.addAggregate('COUNT');
duplicates.groupBy('ip_address');
duplicates.addHaving('COUNT', '>', 1);
duplicates.query();
gs.info('=== DUPLICATE IP ADDRESSES ===');
while (duplicates.next()) {
var ip = duplicates.ip_address.toString();
var count = duplicates.getAggregate('COUNT');
gs.info('IP: ' + ip + ' - Count: ' + count);
var details = new GlideRecord('cmdb_ci_computer');
details.addQuery('ip_address', ip);
details.addQuery('operational_status', '1');
details.query();
while (details.next()) {
gs.info(' ' + details.name + ' (' + details.sys_class_name + ')');
}
}
シリアル番号で重複を検索します。
Tool: SN-Query-Table
Parameters:
table_name: cmdb_ci_hardware
query: serial_numberISNOTEMPTY^operational_status=1
fields: serial_number,name,sys_class_name,sys_id
次に、重複を分析します。
Tool: SN-Execute-Background-Script
Parameters:
description: Find duplicate serial numbers
script: |
var duplicates = new GlideAggregate('cmdb_ci_hardware');
duplicates.addQuery('operational_status', '1');
duplicates.addNotNullQuery('serial_number');
duplicates.addAggregate('COUNT');
duplicates.groupBy('serial_number');
duplicates.addHaving('COUNT', '>', 1);
duplicates.query();
gs.info('=== DUPLICATE SERIAL NUMBERS ===');
gs.info('Found: ' + duplicates.getRowCount() + ' duplicate serial numbers');
while (duplicates.next()) {
gs.info('Serial: ' + duplicates.serial_number + ' Count: ' + duplicates.getAggregate('COUNT'));
}
ステップ 3:古いレコードを特定する
古いレコードは、許容される期間内に更新されていません。
古さのしきい値を定義します。
| CI タイプ | 古さのしきい値 | 根拠 |
|---|---|---|
| サーバー | 30 日 | 定期的にスキャンする必要があります |
| アプリケーション | 60 日 | インフラストラクチャより変化が少ないため |
| サービス | 90 日 | ビジネスサービスの変化は緩やかなため |
| ネットワーク | 14 日 | ネットワークスキャンは頻繁に行われるため |
古いサーバーレコードを検索します。
Tool: SN-Query-Table
Parameters:
table_name: cmdb_ci_server
query: operational_status=1^sys_updated_on<javascript:gs.daysAgo(30)
fields: name,ip_address,sys_updated_on,discovery_source
limit: 100
包括的な古さの監査:
Tool: SN-Execute-Background-Script
Parameters:
description: CMDB Staleness Audit
script: |
var thresholds = {
'cmdb_ci_server': 30,
'cmdb_ci_computer': 30,
'cmdb_ci_appl': 60,
'cmdb_ci_service': 90,
'cmdb_ci_network_gear': 14,
'cmdb_ci_database_instance': 30
};
var results = {};
var cutoffDate = new GlideDateTime();
for (var ciClass in thresholds) {
var days = thresholds[ciClass];
cutoffDate.setValue(new GlideDateTime());
cutoffDate.addDays(-days);
var gr = new GlideRecord(ciClass);
gr.addQuery('operational_status', '1');
gr.query();
var total = gr.getRowCount();
var stale = new GlideRecord(ciClass);
stale.addQuery('operational_status', '1');
stale.addQuery('sys_updated_on', '<', cutoffDate);
stale.query();
var staleCount = stale.getRowCount();
results[ciClass] = {
total: total,
stale: staleCount,
threshold: days,
freshness: total > 0 ? Math.round(((total - staleCount) / total) * 100) : 100
};
// Sample stale records
var samples = [];
stale.setLimit(5);
stale.query();
while (stale.next()) {
samples.push({
name: stale.name.toString(),
last_updated: stale.sys_updated_on.getDisplayValue()
});
}
results[ciClass].samples = samples;
}
gs.info('=== STALENESS AUDIT RESULTS ===');
for (var cls in results) {
var r = results[cls];
gs.info(cls + ': ' + r.freshness + '% fresh (' + r.stale + ' stale of ' + r.total + ', threshold: ' + r.threshold + ' days)');
if (r.samples.length > 0) {
r.samples.forEach(function(s) {
gs.info(' Stale: ' + s.name + ' (last updated: ' + s.last_updated + ')');
});
}
}
ステップ 4:リレーションシップの健全性を確認する
リレーションシップは、品質を測る重要なディメンションです。
孤立した CI(リレーションシップがないもの)を検索します。
Tool: SN-Execute-Background-Script
Parameters:
description: Find CIs with no relationships
script: |
var ciClasses = ['cmdb_ci_server', 'cmdb_ci_appl', 'cmdb_ci_database_instance'];
var orphans = {};
ciClasses.forEach(function(ciClass) {
orphans[ciClass] = [];
var gr = new GlideRecord(ciClass);
gr.addQuery('operational_status', '1');
gr.query();
while (gr.next()) {
var hasRel = new GlideRecord('cmdb_rel_ci');
hasRel.addQuery('parent', gr.sys_id);
hasRel.addOrCondition('child', gr.sys_id);
hasRel.setLimit(1);
hasRel.query();
if (!hasRel.hasNext()) {
orphans[ciClass].push({
sys_id: gr.sys_id.toString(),
name: gr.name.toString()
});
}
}
});
gs.info('=== ORPHAN CI REPORT ===');
for (var cls in orphans) {
gs.info(cls + ': ' + orphans[cls].length + ' orphans');
orphans[cls].slice(0, 5).forEach(function(o) {
gs.info(' ' + o.name + ' (' + o.sys_id + ')');
});
}
無効なリレーションシップを検索します。
Tool: SN-Query-Table
Parameters:
table_name: cmdb_rel_ci
query: parent.operational_status!=1^ORchild.operational_status!=1
fields: parent.name,child.name,parent.operational_status,child.operational_status
limit: 50
ステップ 5:データの正確性を検証する
CMDB データを信頼できる情報源と比較します。
ディスカバリーデータと照合して検証します。
Tool: SN-Execute-Background-Script
Parameters:
description: Compare CMDB to discovery data
script: |
// Find CIs where CMDB data differs from discovery
var mismatches = [];
var gr = new GlideRecord('cmdb_ci_server');
gr.addQuery('operational_status', '1');
gr.addNotNullQuery('discovery_source');
gr.query();
while (gr.next()) {
var issues = [];
// Check if last discovery was recent
if (gr.last_discovered) {
var lastDisc = new GlideDateTime(gr.last_discovered);
var now = new GlideDateTime();
var daysSince = gs.dateDiff(lastDisc, now, true) / (24 * 60 * 60 * 1000);
if (daysSince > 30) {
issues.push('Not discovered in ' + Math.round(daysSince) + ' days');
}
}
// Check for empty critical fields that discovery should populate
if (!gr.os || gr.os.toString() === '') {
issues.push('OS not set');
}
if (!gr.cpu_count || gr.cpu_count.toString() === '0') {
issues.push('CPU count not set');
}
if (!gr.ram || gr.ram.toString() === '0') {
issues.push('RAM not set');
}
if (issues.length > 0) {
mismatches.push({
name: gr.name.toString(),
sys_id: gr.sys_id.toString(),
issues: issues
});
}
}
gs.info('=== ACCURACY VALIDATION ===');
gs.info('CIs with potential accuracy issues: ' + mismatches.length);
mismatches.slice(0, 20).forEach(function(m) {
gs.info(' ' + m.name + ': ' + m.issues.join(', '));
});
ステップ 6:データ品質ダッシュボードを生成する
包括的な品質スコアを作成します。
Tool: SN-Execute-Background-Script
Parameters:
description: Generate CMDB Data Quality Score
script: |
var dashboard = {
generatedAt: new GlideDateTime().getDisplayValue(),
totalCIs: 0,
operationalCIs: 0,
scores: {
completeness: 0,
uniqueness: 0,
freshness: 0,
relationships: 0
},
overallScore: 0,
grade: '',
topIssues: []
};
// Count total CIs
var totalGr = new GlideAggregate('cmdb_ci');
totalGr.addAggregate('COUNT');
totalGr.query();
if (totalGr.next()) {
dashboard.totalCIs = parseInt(totalGr.getAggregate('COUNT'));
}
// Count operational CIs
var opGr = new GlideAggregate('cmdb_ci');
opGr.addQuery('operational_status', '1');
opGr.addAggregate('COUNT');
opGr.query();
if (opGr.next()) {
dashboard.operationalCIs = parseInt(opGr.getAggregate('COUNT'));
}
// Completeness Score (check name and class are set)
var completeGr = new GlideAggregate('cmdb_ci');
completeGr.addQuery('operational_status', '1');
completeGr.addNotNullQuery('name');
completeGr.addNotNullQuery('sys_class_name');
completeGr.addAggregate('COUNT');
completeGr.query();
if (completeGr.next()) {
var complete = parseInt(completeGr.getAggregate('COUNT'));
dashboard.scores.completeness = Math.round((complete / dashboard.operationalCIs) * 100);
}
// Uniqueness Score (inverse of duplicate rate)
var dupGr = new GlideAggregate('cmdb_ci');
dupGr.addQuery('operational_status', '1');
dupGr.addAggregate('COUNT');
dupGr.groupBy('name');
dupGr.addHaving('COUNT', '>', 1);
dupGr.query();
var dupGroups = dupGr.getRowCount();
dashboard.scores.uniqueness = Math.max(0, 100 - Math.round((dupGroups / dashboard.operationalCIs) * 100 * 10));
// Freshness Score (updated in last 30 days)
var cutoff = new GlideDateTime();
cutoff.addDays(-30);
var freshGr = new GlideAggregate('cmdb_ci');
freshGr.addQuery('operational_status', '1');
freshGr.addQuery('sys_updated_on', '>', cutoff);
freshGr.addAggregate('COUNT');
freshGr.query();
if (freshGr.next()) {
var fresh = parseInt(freshGr.getAggregate('COUNT'));
dashboard.scores.freshness = Math.round((fresh / dashboard.operationalCIs) * 100);
}
// Relationship Score (CIs with at least one relationship)
var withRelGr = new GlideAggregate('cmdb_rel_ci');
withRelGr.addAggregate('COUNT', 'DISTINCT', 'parent');
withRelGr.query();
var withRel = 0;
if (withRelGr.next()) {
withRel = parseInt(withRelGr.getAggregate('COUNT', 'DISTINCT', 'parent'));
}
dashboard.scores.relationships = Math.min(100, Math.round((withRel / dashboard.operationalCIs) * 100));
// Overall Score (weighted average)
dashboard.overallScore = Math.round(
(dashboard.scores.completeness * 0.3) +
(dashboard.scores.uniqueness * 0.25) +
(dashboard.scores.freshness * 0.25) +
(dashboard.scores.relationships * 0.2)
);
// Grade
if (dashboard.overallScore >= 90) dashboard.grade = 'A';
else if (dashboard.overallScore >= 80) dashboard.grade = 'B';
else if (dashboard.overallScore >= 70) dashboard.grade = 'C';
else if (dashboard.overallScore >= 60) dashboard.grade = 'D';
else dashboard.grade = 'F';
// Top Issues
if (dashboard.scores.completeness < 90) {
dashboard.topIssues.push('Completeness below 90%: Review mandatory field requirements');
}
if (dashboard.scores.uniqueness < 95) {
dashboard.topIssues.push('Duplicate CIs detected: Run deduplication process');
}
if (dashboard.scores.freshness < 80) {
dashboard.topIssues.push('Stale data: ' + (100 - dashboard.scores.freshness) + '% of CIs not updated in 30 days');
}
if (dashboard.scores.relationships < 70) {
dashboard.topIssues.push('Orphan CIs: Many CIs lack relationships');
}
gs.info('=== CMDB DATA QUALITY DASHBOARD ===');
gs.info('Generated: ' + dashboard.generatedAt);
gs.info('');
gs.info('CI Population:');
gs.info(' Total CIs: ' + dashboard.totalCIs);
gs.info(' Operational CIs: ' + dashboard.operationalCIs);
gs.info('');
gs.info('Quality Scores:');
gs.info(' Completeness: ' + dashboard.scores.completeness + '%');
gs.info(' Uniqueness: ' + dashboard.scores.uniqueness + '%');
gs.info(' Freshness: ' + dashboard.scores.freshness + '%');
gs.info(' Relationships: ' + dashboard.scores.relationships + '%');
gs.info('');
gs.info('OVERALL SCORE: ' + dashboard.overallScore + '% (Grade: ' + dashboard.grade + ')');
gs.info('');
if (dashboard.topIssues.length > 0) {
gs.info('Top Issues to Address:');
dashboard.topIssues.forEach(function(issue) {
gs.info(' - ' + issue);
});
}
ステップ 7:問題を修正する
不完全なレコードを修正します。
Tool: SN-Update-Record
Parameters:
table_name: cmdb_ci_server
sys_id: [ci_sys_id]
data:
support_group: [group_sys_id]
os: "Red Hat Enterprise Linux 8"
operational_status: 1
重複レコードを統合します。
Tool: SN-Execute-Background-Script
Parameters:
description: Merge duplicate CIs (keep newer, retire older)
script: |
var keepSysId = 'NEWER_CI_SYS_ID';
var retireSysId = 'OLDER_CI_SYS_ID';
// Move relationships from retired CI to kept CI
var rels = new GlideRecord('cmdb_rel_ci');
rels.addQuery('parent', retireSysId);
rels.query();
while (rels.next()) {
rels.parent = keepSysId;
rels.update();
}
rels = new GlideRecord('cmdb_rel_ci');
rels.addQuery('child', retireSysId);
rels.query();
while (rels.next()) {
rels.child = keepSysId;
rels.update();
}
// Retire the duplicate
var retireCi = new GlideRecord('cmdb_ci');
if (retireCi.get(retireSysId)) {
retireCi.operational_status = 6; // Retired
retireCi.install_status = 7; // Retired
retireCi.comments = 'Merged into ' + keepSysId + ' on ' + new GlideDateTime().getDisplayValue();
retireCi.update();
gs.info('Retired duplicate CI: ' + retireCi.name);
}
古いレコードを廃止します。
Tool: SN-Update-Record
Parameters:
table_name: cmdb_ci_server
sys_id: [stale_ci_sys_id]
data:
operational_status: 6
install_status: 7
comments: "Retired due to staleness - not discovered in 90+ days"
ツールの使用概要
| 操作 | MCP ツール | REST エンドポイント |
|---|---|---|
| CI のクエリ | SN-Query-Table, SN-List-CmdbCis | GET /cmdb_ci |
| CI の更新 | SN-Update-Record | PATCH /cmdb_ci/{id} |
| スキーマの取得 | SN-Get-Table-Schema | GET /sys_dictionary |
| 複雑な分析 | SN-Execute-Background-Script | N/A |
| 集計クエリ | SN-Execute-Background-Script | GET /stats/cmdb_ci |
ベストプラクティス
- 監査を自動化する: スケジュール済みジョブで、週次の品質レポートを作成します
- 最初に KPI を定義する: 測定を始める前に、品質目標を設定します
- 重要な CI を優先する: 本番環境と重要なインフラストラクチャを優先します
- 根本原因を分析する: 症状だけでなく、問題のあるデータの原因を修正します
- ガバナンスプロセス: CI クラスごとにデータスチュワードを任命します
- ディスカバリーとの整合性: ディスカバリーのパターンが品質目標をサポートするようにします
- 継続的な改善: 品質の傾向を経時的に追跡します
品質改善ロードマップ
| フェーズ | 焦点 | 目標 | 期間 |
|---|---|---|---|
| 1 | 完全性 | 95% | 1~2 週目 |
| 2 | 重複 | <1% | 3~4 週目 |
| 3 | 古さ | <5% | 5~6 週目 |
| 4 | リレーションシップ | >80% | 7~8 週目 |
| 5 | 継続 | 維持 | 継続 |
トラブルシューティング
品質スコアが突然低下する
症状: ダッシュボードに大幅な品質低下が表示される 原因: ディスカバリーのインポート、一括データ読み込み、またはスキーマ変更 解決策: sys_import_log で最近の一括操作を確認し、ディスカバリーのパターンを見直します
重複を見つけられない
症状: スクリプトで検出されない重複が、手動レビューで見つかる 原因: 名前にわずかな違いがある(スペース、大文字と小文字、誤字) 解決策: あいまい一致またはレーベンシュタイン距離による比較を使用します
古いレコードが繰り返し再出現する
症状: 修正後も同じ CI が繰り返し古いものとしてフラグ付けされる 原因: ディスカバリーが実行されていないか、CI がディスカバリーの対象範囲に含まれていない 解決策: ディスカバリーのスケジュールとパターンに CI が含まれていることを確認します
マッピングがあるのにリレーションシップスコアが低い
症状: リレーションシップが存在するのに、スコアが低いままである 原因: 子のリレーションシップではなく、親のリレーションシップのみをカウントしている 解決策: クエリで親または子のいずれかとして出現する CI をカウントするようにします
例
例 1:週次品質レポート
# Run weekly via scheduled job
Tool: SN-Execute-Background-Script
Parameters:
description: Weekly CMDB Quality Report
script: |
// [Include dashboard script from Step 6]
// Email results
var email = new GlideEmailOutbound();
email.setSubject('Weekly CMDB Quality Report - Score: ' + dashboard.overallScore + '%');
email.setBody(JSON.stringify(dashboard, null, 2));
email.addRecipient('[email protected]');
email.send();
例 2:一括重複排除
# 1. Identify duplicates
Tool: SN-Execute-Background-Script
Parameters:
script: [duplicate detection script from Step 2]
# 2. Review and approve merge candidates
# (Manual review step)
# 3. Execute merges (batch)
Tool: SN-Execute-Background-Script
Parameters:
description: Batch merge approved duplicates
script: |
var merges = [
{ keep: 'sys_id_1', retire: 'sys_id_2' },
{ keep: 'sys_id_3', retire: 'sys_id_4' }
];
merges.forEach(function(m) {
// [Merge logic from Step 7]
});
例 3:完全性修正キャンペーン
# 1. Export incomplete records
Tool: SN-Query-Table
Parameters:
table_name: cmdb_ci_server
query: operational_status=1^support_groupISEMPTY
fields: sys_id,name,ip_address,os
# 2. Assign to teams for remediation
# (Route to support groups based on naming/IP patterns)
# 3. Batch update when teams provide data
Tool: SN-Update-Record
Parameters:
table_name: cmdb_ci_server
sys_id: [ci_sys_id]
data:
support_group: [group_sys_id]
# 4. Re-run completeness audit to verify
関連スキル
cmdb/ci-discovery- CI の作成と分類cmdb/relationship-mapping- CI のリレーションシップの管理cmdb/impact-analysis- 品質の高い CMDB を使用した影響分析cmdb/service-graph-diagnosis- トポロジーとディスカバリーの品質ギャップの診断