mcpField
C
cmdb-search-analysis

cmdb-search-analysis

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

关于 cmdb-search-analysis

面向 ServiceNow CMDB 分析的技能,可将自然语言需求转为配置项查询,并结合关系和业务服务信息整理结果,适用于分析师、变更经理和事件响应人员。

主要功能

  1. 01将自然语言转换为结构化查询
  2. 02按类别与多项条件搜索配置项
  3. 03查询配置项关系与依赖
  4. 04关联业务服务并汇总报告
  5. 05探索配置项类别和表结构

适用场景

  1. 01查找特定环境中的服务器
  2. 02分析应用关联的配置项与依赖
  3. 03比较不同环境的配置项
  4. 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
^ANDname=x^status=1
^ORORname=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_ciGET跨所有 CI 类型搜索
/api/now/table/cmdb_ci_*GET搜索特定 CI 类表
/api/now/table/cmdb_rel_ciGET查询 CI 关系
/api/now/table/cmdb_ci_serviceGET查询业务服务
/api/now/cmdb/metaGET检索 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 - 探索表架构和字段定义

评论

支持 Markdown