关于 cmdb-search-analysis
面向 ServiceNow CMDB 分析的技能,可将自然语言需求转为配置项查询,并结合关系和业务服务信息整理结果,适用于分析师、变更经理和事件响应人员。
主要功能
- 01将自然语言转换为结构化查询
- 02按类别与多项条件搜索配置项
- 03查询配置项关系与依赖
- 04关联业务服务并汇总报告
- 05探索配置项类别和表结构
适用场景
- 01查找特定环境中的服务器
- 02分析应用关联的配置项与依赖
- 03比较不同环境的配置项
- 04为事件响应整理配置项背景
MCP 相关
使用 SN-Natural-Language-Search、SN-Query-Table、SN-Discover-Table-Schema 等 MCP 工具查询 CMDB、配置项关系和业务服务。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ happy-technologies-llc/ happy-platform-skills --skill cmdb-search-analysis安装后在 Claude Code 中输入/cmdb-search-analysis确认已加载。
详细介绍
CMDB 搜索与分析
概述
此技能可对配置管理数据库(CMDB)进行智能搜索和分析,涵盖:
- 将自然语言查询转换为针对
cmdb_ci及其子表的结构化 CMDB 搜索 - 执行结合名称、类、位置、环境和运行状态的多条件搜索
- 使用
cmdb_rel_ci中的关系数据丰富搜索结果 - 通过
cmdb_ci_service关联识别相关业务服务 - 将搜索结果汇总为包含依赖关系上下文的结构化报告
- 探索 CI 类和架构,以便为查询选择最合适的表
适用场景: 用户提出以下问题时:“查找美国数据中心中所有生产数据库服务器”“哪些 CI 与 SAP 应用相关”或“显示所有业务分类为关键的 Linux 服务器”。
价值: 准确的 CMDB 搜索可减少手动浏览 CI 层级所花费的时间,并确保分析师、变更经理和事件响应人员快速找到正确的配置项。
前提条件
- 角色: 具有
itil、cmdb_read或asset访问权限 - 访问权限: 对
cmdb_ci、cmdb_rel_ci、cmdb_ci_service和 CI 子表具有读取权限 - 知识: 了解 CMDB 类层级和关系类型
- 相关技能: 用于创建关系的
cmdb/relationship-mapping,用于创建 CI 的cmdb/ci-discovery
流程
步骤 1:确定目标 CI 类
根据用户的请求,确定要查询的 CMDB 表。CMDB 使用以 cmdb_ci 为根的类层级。
发现可用的 CI 类:
使用 MCP(Claude Code/Desktop):
Tool: SN-Discover-Table-Schema
Parameters:
table_name: cmdb_ci
使用 REST API:
GET /api/now/cmdb/meta?sysparm_type=class_hierarchy&sysparm_ci_type=cmdb_ci
自然语言查询的常见类映射:
| 用户表述 | 目标表 | 备注 |
|---|---|---|
| “server” 或 “host” | cmdb_ci_server | 物理服务器和虚拟服务器 |
| “database” | cmdb_ci_db_instance | 数据库实例 |
| “application” 或 “app” | cmdb_ci_appl | 应用 CI |
| “network device” 或 “switch” | cmdb_ci_netgear | 网络设备 |
| “load balancer” | cmdb_ci_lb | 负载均衡器 |
| “storage” | cmdb_ci_storage_device | 存储阵列 |
| “virtual machine” 或 “VM” | cmdb_ci_vm_instance | 虚拟机实例 |
| “container” | cmdb_ci_container | 容器实例 |
| “service” | cmdb_ci_service | 业务服务 |
| “cluster” | cmdb_ci_cluster | 服务器或应用集群 |
步骤 2:构建搜索查询
将自然语言请求转换为 ServiceNow 编码查询字符串。
使用编码查询:
Tool: SN-Query-Table
Parameters:
query: environment=production^osLIKELinux^location.nameLIKENew York^business_criticality=1
table_name: cmdb_ci_server
limit: 25
使用结构化查询:
Tool: SN-Query-Table
Parameters:
table_name: cmdb_ci_server
query: operational_status=1^os_domainLIKELinux^location.nameLIKENew York^business_criticality=1
fields: sys_id,name,sys_class_name,ip_address,os,operational_status,environment,business_criticality,location,support_group
limit: 50
order_by: name
使用 REST API:
GET /api/now/table/cmdb_ci_server?sysparm_query=operational_status=1^os_domainLIKELinux^location.nameLIKENew%20York^business_criticality=1&sysparm_fields=sys_id,name,sys_class_name,ip_address,os,operational_status,environment,business_criticality,location,support_group&sysparm_limit=50&sysparm_display_value=true
常见查询运算符:
| 运算符 | 含义 | 示例 |
|---|---|---|
= | 等于 | operational_status=1 |
LIKE | 包含 | nameLIKEprod |
STARTSWITH | 以……开头 | nameSTARTSWITHweb |
IN | 属于列表 | sys_idINid1,id2,id3 |
!= | 不等于 | environment!=development |
ISNOTEMPTY | 有值 | ip_addressISNOTEMPTY |
^ | AND | name=x^status=1 |
^OR | OR | name=x^ORname=y |
步骤 3:使用关系数据丰富结果
对于找到的每个 CI,检索其关系,以提供依赖关系上下文。
获取特定 CI 的关系:
Tool: SN-Query-Table
Parameters:
table_name: cmdb_rel_ci
query: parent=[ci_sys_id]^ORchild=[ci_sys_id]
fields: parent,parent.name,parent.sys_class_name,child,child.name,child.sys_class_name,type.name,type.parent_descriptor,type.child_descriptor
limit: 50
使用 REST API:
GET /api/now/table/cmdb_rel_ci?sysparm_query=parent=[ci_sys_id]^ORchild=[ci_sys_id]&sysparm_fields=parent,parent.name,parent.sys_class_name,child,child.name,child.sys_class_name,type.name,type.parent_descriptor,type.child_descriptor&sysparm_limit=50&sysparm_display_value=true
批量查询多个 CI 的关系:
Tool: SN-Execute-Background-Script
Parameters:
description: Get relationships for multiple CIs from search results
script: |
var ciIds = ['sys_id_1', 'sys_id_2', 'sys_id_3']; // Replace with actual IDs
var results = [];
ciIds.forEach(function(ciId) {
var ci = new GlideRecord('cmdb_ci');
if (!ci.get(ciId)) return;
var entry = {
sys_id: ciId,
name: ci.name.toString(),
class: ci.sys_class_name.toString(),
upstream: [],
downstream: []
};
var rel = new GlideRecord('cmdb_rel_ci');
rel.addQuery('child', ciId);
rel.setLimit(20);
rel.query();
while (rel.next()) {
entry.upstream.push({
name: rel.parent.name.toString(),
class: rel.parent.sys_class_name.toString(),
relationship: rel.type.parent_descriptor.toString()
});
}
rel = new GlideRecord('cmdb_rel_ci');
rel.addQuery('parent', ciId);
rel.setLimit(20);
rel.query();
while (rel.next()) {
entry.downstream.push({
name: rel.child.name.toString(),
class: rel.child.sys_class_name.toString(),
relationship: rel.type.child_descriptor.toString()
});
}
results.push(entry);
});
gs.info(JSON.stringify(results, null, 2));
步骤 4:识别关联的业务服务
将找到的 CI 映射到其支持的业务服务。
使用 MCP:
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,service_id.business_criticality
limit: 10
使用 REST API:
GET /api/now/table/service_ci_assoc?sysparm_query=ci_id=[ci_sys_id]&sysparm_fields=service_id,service_id.name,service_id.operational_status,service_id.business_criticality&sysparm_limit=10&sysparm_display_value=true
步骤 5:生成结构化搜索报告
将搜索结果、关系和服务上下文汇总为一份全面的报告。
使用后台脚本进行完整分析:
Tool: SN-Execute-Background-Script
Parameters:
description: Generate structured CMDB search report
script: |
var searchQuery = 'nameLIKEprod-web^operational_status=1';
var targetTable = 'cmdb_ci_server';
var report = { query: searchQuery, table: targetTable, timestamp: new GlideDateTime().getDisplayValue(), results: [] };
var gr = new GlideRecord(targetTable);
gr.addEncodedQuery(searchQuery);
gr.setLimit(25);
gr.query();
while (gr.next()) {
var ciData = {
sys_id: gr.sys_id.toString(),
name: gr.name.toString(),
class: gr.sys_class_name.toString(),
ip_address: gr.ip_address ? gr.ip_address.toString() : '',
environment: gr.environment ? gr.environment.getDisplayValue() : '',
criticality: gr.business_criticality ? gr.business_criticality.getDisplayValue() : '',
status: gr.operational_status.getDisplayValue(),
support_group: gr.support_group ? gr.support_group.getDisplayValue() : '',
location: gr.location ? gr.location.getDisplayValue() : '',
relationships: { upstream: 0, downstream: 0 },
services: []
};
var upRel = new GlideAggregate('cmdb_rel_ci');
upRel.addQuery('child', gr.sys_id);
upRel.addAggregate('COUNT');
upRel.query();
if (upRel.next()) ciData.relationships.upstream = parseInt(upRel.getAggregate('COUNT'));
var downRel = new GlideAggregate('cmdb_rel_ci');
downRel.addQuery('parent', gr.sys_id);
downRel.addAggregate('COUNT');
downRel.query();
if (downRel.next()) ciData.relationships.downstream = parseInt(downRel.getAggregate('COUNT'));
var svcAssoc = new GlideRecord('service_ci_assoc');
svcAssoc.addQuery('ci_id', gr.sys_id);
svcAssoc.query();
while (svcAssoc.next()) {
ciData.services.push(svcAssoc.service_id.getDisplayValue());
}
report.results.push(ciData);
}
report.totalFound = report.results.length;
gs.info(JSON.stringify(report, null, 2));
步骤 6:跨类搜索
当用户的查询涵盖多个 CI 类时,可在基础 cmdb_ci 表或多个子表中搜索。
跨所有 CI 类型进行广泛搜索:
Tool: SN-Query-Table
Parameters:
table_name: cmdb_ci
query: nameLIKEpayment^operational_status=1
fields: sys_id,name,sys_class_name,operational_status,environment,business_criticality,support_group
limit: 50
order_by: sys_class_name,name
使用 REST API:
GET /api/now/table/cmdb_ci?sysparm_query=nameLIKEpayment^operational_status=1&sysparm_fields=sys_id,name,sys_class_name,operational_status,environment,business_criticality,support_group&sysparm_limit=50&sysparm_display_value=true
工具用法
MCP 工具参考
| 工具 | 使用时机 |
|---|---|
SN-Natural-Language-Search | 将自然语言查询转换为 CMDB 搜索 |
SN-Query-Table | 对 CMDB 表执行结构化查询 |
SN-List-CmdbCis | 按类便捷地查找常见 CI |
SN-Get-Record | 通过 sys_id 检索单条 CI 记录 |
SN-Discover-Table-Schema | 探索可用字段和 CI 类 |
SN-Execute-Background-Script | 执行包含聚合的复杂多表查询 |
REST API 参考
| 端点 | 方法 | 用途 |
|---|---|---|
/api/now/table/cmdb_ci | GET | 跨所有 CI 类型搜索 |
/api/now/table/cmdb_ci_* | GET | 搜索特定 CI 类表 |
/api/now/table/cmdb_rel_ci | GET | 查询 CI 关系 |
/api/now/table/cmdb_ci_service | GET | 查询业务服务 |
/api/now/cmdb/meta | GET | 检索 CMDB 类层次结构元数据 |
最佳实践
- 从正确的类开始: 如果已知 CI 类型,查询
cmdb_ci_server比搜索基础cmdb_ci表更快、更精准 - 使用显示值: 在 REST 调用中添加
sysparm_display_value=true,以获取易读标签,而不是 sys_id - 限制结果集: 始终设置合理的限制;CMDB 表可能包含数百万条记录
- 组合筛选条件: 使用多个条件(名称 + 环境 + 状态)缩小结果范围并减少误匹配
- 验证类层次结构: 查询前使用架构发现功能,确认哪些 CI 类中存在相应字段
- 缓存常用查询: 对于重复搜索,记录编码后的查询字符串以供重复使用
- 包含关系上下文: 缺少依赖关系上下文的原始 CI 列表用处有限;条件允许时,始终补充关系信息
- 遵循运行状态: 除非专门搜索已退役或已停用的 CI,否则使用
operational_status=1(运行中)进行筛选,将其排除
故障排除
搜索未返回结果
症状: 尽管已知 CI 存在,查询却返回空结果
原因: 表错误(CI 属于其他类)、CI 名称略有不同,或 CI 未处于运行状态
解决方案: 在基础 cmdb_ci 表中使用宽泛的 LIKE 筛选条件进行搜索,或移除 operational_status 筛选条件以包含非运行状态的 CI
搜索返回过多结果
症状: 返回数千条结果,难以确定正确的 CI
原因: 查询范围过宽(例如,nameLIKEweb 会匹配数百个 CI)
解决方案: 添加环境、位置、支持组或类筛选条件来缩小结果范围。按名称匹配时使用 STARTSWITH,而不是 LIKE。
缺少关系数据
症状: CI 显示没有关系,但显然属于某个应用程序堆栈
原因: CMDB 中未填充关系;可能尚未运行发现,或缺少手动录入的条目
解决方案: 检查是否已为此 CI 配置 Service Mapping 或 Discovery。使用 cmdb/relationship-mapping 创建缺失的关系。
找不到类
症状: 查询特定 CI 类表时出错
原因: 表名不正确,或未安装 CI 类插件
解决方案: 使用 SN-Discover-Table-Schema 检查 cmdb_ci,列出可用的子类;或者查询 sys_db_object,查找与预期名称匹配的表。
示例
示例 1:查找所有生产 Web 服务器
# 1. Search for production web servers
Tool: SN-Query-Table
Parameters:
table_name: cmdb_ci_server
query: nameLIKEweb^environment=production^operational_status=1
fields: sys_id,name,ip_address,os,environment,business_criticality,location,support_group
limit: 50
# 2. Get relationships for top result
Tool: SN-Query-Table
Parameters:
table_name: cmdb_rel_ci
query: child=[first_result_sys_id]
fields: parent.name,parent.sys_class_name,type.parent_descriptor
# 3. Find associated services
Tool: SN-Query-Table
Parameters:
table_name: service_ci_assoc
query: ci_id=[first_result_sys_id]
fields: service_id.name,service_id.business_criticality
示例 2:自然语言 CI 搜索
用户提问:“哪些数据库服务器支持薪资应用程序?”
# 1. Find the payroll application CI
Tool: SN-Query-Table
Parameters:
query: nameLIKEpayroll^ORshort_descriptionLIKEpayroll
table_name: cmdb_ci_appl
limit: 5
# 2. Find downstream database dependencies
Tool: SN-Query-Table
Parameters:
table_name: cmdb_rel_ci
query: parent=[payroll_app_sys_id]^child.sys_class_nameLIKEdb
fields: child.name,child.sys_class_name,child.ip_address,child.environment,type.child_descriptor
# Result: Lists all database CIs that the payroll application depends on
示例 3:环境对比
用户提问:“比较 CRM 系统的生产服务器和预发布服务器”
# 1. Find CRM-related servers in production
Tool: SN-Query-Table
Parameters:
table_name: cmdb_ci_server
query: nameLIKEcrm^environment=production^operational_status=1
fields: sys_id,name,ip_address,os,cpu_count,ram,disk_space
# 2. Find CRM-related servers in staging
Tool: SN-Query-Table
Parameters:
table_name: cmdb_ci_server
query: nameLIKEcrm^environment=staging^operational_status=1
fields: sys_id,name,ip_address,os,cpu_count,ram,disk_space
# 3. Compare and report differences in specs, count, and configuration
相关技能
cmdb/relationship-mapping- 创建和验证 CI 关系cmdb/ci-discovery- CI 创建与分类cmdb/data-quality- 确保 CMDB 数据准确性cmdb/impact-analysis- 使用搜索结果分析变更影响cmdb/service-graph-diagnosis- 排查 Service Graph Connector 和发现问题admin/schema-discovery- 探索表架构和字段定义