모든 서비스 그래프 커넥터를 지원하기 위한 표준화된 JSON 공통 데이터 세트
통합 스키마와 재사용 가능한 ETL 논리를 사용하는 표준화된 서비스 그래프 커넥터를 지원하려면 TSOM 아키텍처를 사용합니다. 이를 통해 새 커넥터의 온보딩 시간이 단축되고 CMDB와의 통합이 단순화됩니다.
1. 공통 JSON 스키마 정의
모든 서비스 그래프 커넥터의 출력을 TNI 스키마를 준수하는 단일 JSON 형식에 맞게 표준화합니다.
다음 사항을 확인하십시오.
- 수집기 또는 어댑터에서 변환 논리를 구현하여 데이터를 공통 스키마로 출력합니다.
- 확인:
- 슬롯 상의 슬롯 또는 카드 온 카드 계층 구조는 제외됩니다.
- 논리적 인터페이스는
virtual=true로 명확하게 표시됩니다. - 장비 유형은 모델-클래스 매핑에 맞춰집니다.
주:
스키마는 사용 가능한 경우 TNI 변경 사항에 대한 런타임 적응성을 지원해야 합니다.
다음은 모든 TSOM 서비스 그래프 커넥터를 지원하는 JSON 스키마 공통 데이터 세트입니다.
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Telco Generic Schema",
"version": "2.0.1",
"oneOf": [
{
"type": "object",
"properties": {
"logical_composites": {
"type": "array",
"items": {
"$ref": "#/$defs/logical_composite"
}
}
},
"required": [
"logical_composites"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"devices": {
"type": "array",
"items": {
"$ref": "#/$defs/device"
}
}
},
"required": [
"devices"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"logical_connections": {
"type": "array",
"items": {
"$ref": "#/$defs/logical_connection"
}
}
},
"required": [
"logical_connections"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"port_relations": {
"type": "array",
"items": {
"$ref": "#/$defs/port_relation"
}
}
},
"required": [
"port_relations"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"logical_connection_relations": {
"type": "array",
"items": {
"$ref": "#/$defs/logical_connection_relation"
}
}
},
"required": [
"logical_connection_relations"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"numbers": {
"type": "array",
"items": {
"$ref": "#/$defs/number"
}
}
},
"required": [
"numbers"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"topologies": {
"type": "array",
"items": {
"$ref": "#/$defs/network_topology"
}
}
},
"required": [
"topologies"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"topology_relations": {
"type": "array",
"items": {
"$ref": "#/$defs/network_topology_relation"
}
}
},
"required": [
"topology_relations"
],
"additionalProperties": false
}
],
"$defs": {
"keyRef": {
"type": "object",
"properties": { "key": { "type": "string" }
},
"required": [ "key" ],
"additionalProperties": false
},
"optionalKeyRef": { "type": [ "object", "null" ],
"properties": {
"key": { "type": "string" }
},
"additionalProperties": false
},
"value": {
"type": "object",
"properties": {
"from": { "type": [ "integer" ], "default": 0, "minimum": 0 },
"to": { "type": [ "integer" ], "default": 0, "minimum": 0 }
},
"required": [ "from", "to" ],
"additionalProperties": false
},
"logical_composite": {
"type": "object",
"properties": {
"class": { "type": "string", "enum": [ "logical_composite" ] },
"key": { "type": "string" },
"name": { "type": [ "string", "null" ] },
"description": { "type": [ "string", "null" ] },
"devices": { "type": "array", "items": { "$ref": "#/$defs/keyRef" } },
"power_units": { "type": "array", "items": { "$ref": "#/$defs/pdu" } },
"fan_shelves": { "type": "array", "items": { "$ref": "#/$defs/fan_shelf" } } },
"required": [ "key", "name" ]
},
"pdu": {
"type": "object",
"properties": {
"class": { "type": "string", "enum": [ "pdu" ] },
"key": { "type": "string" },
"name": { "type": [ "string", "null" ] },
"description": { "type": [ "string", "null" ] },
"model_name": { "type": [ "string", "null" ] },
"model_number": { "type": [ "string", "null" ] },
"unit_position": { "type": [ "integer", "null" ], "minimum": 1 },
"slots": { "type": "array", "items": { "$ref": "#/$defs/slot" } }
},
"required": [ "key", "name" ]
},
"fan_shelf": {
"type": "object",
"properties": {
"class": { "type": "string", "enum": [ "fan_shelf" ] },
"key": { "type": "string" },
"name": { "type": [ "string", "null" ] },
"description": { "type": [ "string", "null" ] },
"slots": { "type": "array", "items": { "$ref": "#/$defs/slot" } }
},
"required": [ "key", "name" ]
},
"device": {
"type": "object",
"properties": {
"class": { "type": "string", "enum": [ "device" ] },
"key": { "type": "string" },
"name": { "type": [ "string", "null" ] },
"description": { "type": [ "string", "null" ] },
"ip_address": { "type": [ "string", "null" ] },
"mac_address": { "type": [ "string", "null" ] },
"serial_number": { "type": [ "string", "null" ] },
"model_name": { "type": [ "string", "null" ] },
"model_number": { "type": [ "string", "null" ] },
"manufacturer": { "type": [ "string", "null" ] },
"firmware_version": { "type": [ "string", "null" ] },
"slots": { "type": "array", "items": { "$ref": "#/$defs/slot" } },
"ports": { "type": "array", "items": { "$ref": "#/$defs/port" } } },
"required": [ "key", "name", "serial_number" ]
},
"slot": {
"type": "object",
"properties": {
"class": { "type": "string", "enum": [ "slot" ] },
"key": { "type": "string" },
"name": { "type": [ "string", "null" ] },
"description": { "type": [ "string", "null" ] },
"model_name": { "type": [ "string", "null" ] },
"model_number": { "type": [ "string", "null" ] },
"manufacturer": { "type": [ "string", "null" ] },
"unit_position": { "type": [ "integer", "null" ], "minimum": 1 },
"cards": { "type": "array", "items": { "$ref": "#/$defs/card" } }
},
"required": [ "key", "name" ]
},
"card": {
"type": "object",
"properties": {
"class": { "type": "string", "enum": [ "card" ] },
"key": { "type": "string" },
"name": { "type": [ "string", "null" ] },
"description": { "type": [ "string", "null" ] },
"mac_address": { "type": [ "string", "null" ] },
"serial_number": { "type": [ "string", "null" ] },
"firmware_version": { "type": [ "string", "null" ] },
"model_name": { "type": [ "string", "null" ] },
"model_number": { "type": [ "string", "null" ] },
"manufacturer": { "type": [ "string", "null" ] },
"unit_position": { "type": [ "integer", "null" ], "minimum": 1 },
"slots": { "type": "array", "items": { "$ref": "#/$defs/slot" } },
"ports": { "type": "array", "items": { "$ref": "#/$defs/port" } }
},
"required": [ "key", "name" ]
},
"port": {
"type": "object",
"properties": {
"class": { "type": "string", "enum": [ "port" ] },
"key": { "type": "string" },
"name": { "type": [ "string", "null" ] },
"description": { "type": [ "string", "null" ] },
"model_name": { "type": [ "string", "null" ] },
"ip_address": { "type": [ "string", "null" ] },
"virtual": { "type": "boolean", "default": false },
"unit_position": { "type": [ "integer", "null" ], "minimum": 1 },
"bandwidth_name": { "type": [ "string", "null" ] },
"bandwidth_group": { "type": [ "string", "null" ] },
"bandwidth": { "type": [ "integer", "null" ], "minimum": 0 },
"mtu_size": { "type": [ "integer", "null" ], "minimum": 0 }
},
"required": [ "key", "name" ]
},
"number": {
"type": "object",
"properties": {
"class": { "type": "string", "enum": [ "number" ] },
"key": { "type": "string" },
"name": { "type": [ "string", "null" ] },
"related_ci_type": { "type": "string", "enum": [ "Network Interface", "Physical Connection", "Logical Connection", "Equipment", "Topology" ] },
"related_ci": { "$ref": "#/$defs/keyRef" },
"type": { "type": "string", "enum": [ "vlan_range", "vlan_subrange", "vlan", "lag_range", "lag" ] },
"vlan_type": { "type": "string", "enum": [ "inner", "outer" ] },
"value": { "$ref": "#/$defs/value" }
},
"required": [ "key", "name", "type", "related_ci_type", "related_ci", "value" ] },
"logical_connection": {
"type": "object",
"properties": {
"class": { "type": "string", "enum": [ "logical_connection" ] },
"key": { "type": "string" },
"name": { "type": [ "string", "null" ] },
"description": { "type": [ "string", "null" ] },
"model_name": { "type": [ "string", "null" ] },
"bandwidth_group": { "type": [ "string", "null" ] },
"bandwidth_name_a_to_z": { "type": [ "string", "null" ] },
"bandwidth_name_z_to_a": { "type": [ "string", "null" ] },
"bandwidth_a_to_z": { "type": [ "integer", "null" ], "minimum": 0 },
"bandwidth_z_to_a": { "type": [ "integer", "null" ], "minimum": 0 },
"equipment_a": { "$ref": "#/$defs/optionalKeyRef" },
"equipment_z": { "$ref": "#/$defs/optionalKeyRef" },
"port_a": { "$ref": "#/$defs/keyRef" },
"port_z": { "$ref": "#/$defs/keyRef" }
},
"required": [ "key", "name", "equipment_a", "equipment_z", "port_a", "port_z" ]
},
"port_relation": {
"type": "object",
"properties": {
"class": { "type": "string", "enum": [ "port_relation" ] },
"parent": { "$ref": "#/$defs/keyRef" },
"child": { "$ref": "#/$defs/keyRef" }
},
"required": [ "parent", "child" ]
},
"logical_connection_relation": {
"type": "object",
"properties": {
"class": { "type": "string", "enum": [ "logical_connection_relation" ] },
"sequence": { "type": [ "integer", "null" ], "minimum": 1 },
"route": { "type": [ "integer", "null" ], "minimum": 1 },
"parent": { "$ref": "#/$defs/keyRef" },
"child": { "$ref": "#/$defs/keyRef" }
},
"required": [ "parent", "child" ]
},
"network_topology": {
"type": "object",
"properties": {
"class": { "type": "string", "enum": [ "network_topology" ] },
"key": { "type": "string" },
"name": { "type": "string" },
"model_name": { "type": [ "string", "null" ] },
"devices": { "type": "array", "items": { "key": "#/$defs/optionalKeyRef" } },
"logical_connections": { "type": "array", "items": { "key": "#/$defs/optionalKeyRef" } }
},
"required": [ "key", "name", "devices", "logical_connections" ]
}
}
}
2. ETL에서 연결 분리
장치 상호작용 논리를 변환 논리(ETL 수집)와 분리하여 유연성을 보장합니다. 사용자는 ETL 논리와 독립적으로 자체 수집기를 개발할 수 있습니다.
다음 사항을 확인하십시오.
- 통합 스키마로의 연결 및 데이터 변환에만 집중하도록 수집기를 설계합니다.
- EMS/NMS 어댑터(Atrinet과 같은 타사 어댑터 포함)를 사용하거나 재사용합니다.
- 표준화된 데이터를 ServiceNow 임포트 세트로 푸시합니다.
3. CMDB 업데이트에 대한 일반 ETL 구성
재사용 가능한 단일 ETL을 사용하여 표준화된 모든 임포트 세트를 처리하고 CMDB를 정확하게 업데이트합니다.
다음 사항을 확인하십시오.
- 임포트 세트에 표준화된 JSON 형식의 데이터가 포함되어 있는지 확인합니다.
- TSOM 일반 ETL을 사용하여 다음을 수행할 수 있습니다.
- 엔터티 유형(예: 슬롯, 카드, 논리적 인터페이스)을 탐지합니다.
- 모델 매핑 논리에 따라 각 엔터티를 올바른 CI 클래스에 매핑합니다.
- 해당하는 경우 인벤토리 범주를 포함한 필드를 채웁니다.
특별 처리:
- 논리적 인터페이스 → 포트 테이블(
virtual=true) - 논리적 연결 → 논리적 연결 테이블
- PDU 테이블 → PDU 카드
- 장비 → 모델 기반 CI 클래스(여러 개가 있는 경우 최신 매핑)
4. 멀티 섀시 및 복합 장치에 대한 지원 구성
올바른 CMDB 관계를 가진 멀티 섀시 라우터와 같은 복잡한 장치를 모델링합니다.
다음 사항을 확인하십시오.
- 논리 복합 구성을 사용하여 라우터 + PDU와 같은 그룹화된 엔터티를 나타냅니다.
- 해당 계층 구조에서 개별 구성요소(팬, 관리, 슬롯)를 정의합니다.
- TNI 모델링 지침에 따라 각 엔터티를 매핑합니다.
예: 7750-2s 멀티 섀시 디바이스의 경우:
- 논리 복합 →에는 라우터와 PDU가 포함되어 있습니다.
- PDU →에는 슬롯→ 카드 → 하위 슬롯이 포함되어 있습니다.
5. 설치에 따라 TNI 엔터티 생성 활성화
불필요한 기록 생성 없이 TNI 표준과의 일관성을 보장합니다.
다음 사항을 확인하십시오.
- TNI가 설치된 경우:
- 검색된 각 CI에 대해 TNI 엔터티를 자동으로 생성합니다.
- 인벤토리 범주를 적절하게 설정합니다(예: "논리적 연결", "인터페이스").
- TNI가 설치되지 않은 경우: TNI 엔터티 생성을 건너뛰어 고아 기록 또는 잘못된 기록을 방지합니다.