Conjunto de dados comuns JSON padronizado para oferecer suporte a todos os conectores do Service Graph
Use a arquitetura TSOM para oferecer suporte a conectores do Service Graph padronizados usando um esquema unificado e lógica ETL reutilizável. Isso reduz o tempo de integração de novos conectores e simplifica a integração com o CMDB.
1. Defina o esquema JSON comum
Padronize a saída de todos os conectores do Service Graph para alinhar com um único formato JSON que esteja em conformidade com o esquema TNI.
- Implemente lógica de conversão no coletor ou adaptador para dados de saída no esquema comum.
- Certifique-se de que:
- As hierarquias slot-em-slot ou cartão-em-cartão são excluídas.
- As interfaces lógicas são claramente marcadas com
verdadeiro. - Os tipos de equipamento se alinham aos mapeamentos de classe de modelo.
A seguir está o conjunto de dados comum do esquema JSON que oferece suporte a todos os conectores do Service Graph do TSOM:
{
"$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. Desacople a conectividade do ETL
Separe a lógica de interação do dispositivo da lógica de transformação (ingestão de ETL). Os usuários podem desenvolver seus próprios coletores independentemente da lógica de ETL.
- Projete coletores para se concentrar somente na conectividade e na conversão de dados para o esquema unificado.
- Use ou reutilize qualquer adaptador EMS/NMS (incluindo adaptadores de terceiros, como o Atrinet).
- Envie os dados padronizados para os conjuntos de importação da ServiceNow.
3. Configure ETL genérico para atualizações do CMDB
Use um único ETL reutilizável para processar todos os conjuntos de importação padronizados e atualizar o CMDB com precisão.
Certifique-se dos seguintes pontos:
- Validar que o conjunto de importação contém dados no formato JSON padronizado.
- Use o ETL genérico do TSOM para:
- Detecte o tipo de entidade (por exemplo, slot, cartão, interface lógica).
- Mapeie cada entidade para a classe de IC correta com base na lógica de mapeamento do modelo.
- Preencha os campos, incluindo Categoria de inventário, quando aplicável.
Tratamento especial:
- Interfaces lógicas → Tabela de portas (
verdadeiro) - Conexões lógicas → Tabela de conexão lógica
- Cartões de PDU → Tabela de PDU
- Equipamento → Classe de IC baseada em modelo (mapeamento mais recente, se houver vários)
4. Configure o suporte para dispositivos compostos e de vários chassis
Modele dispositivos complexos, como roteadores de vários chassis, com relacionamentos corretos do CMDB.
- Use a construção Composto lógico para representar entidades agrupadas, como Roteador e PDU.
- Defina componentes individuais (ventilador, gestão, slot) em sua respectiva hierarquia.
- Mapeie cada entidade de acordo com a orientação de modelagem do TNI.
- Composto lógico → Contém Roteador e PDU
- PDU → Contém slots → cartões → subslots
5. Habilite a criação de entidade TNI com base na instalação
Garanta a consistência com os padrões TNI sem a criação desnecessária de registros.
- Se o TNI estiver instalado:
- Crie automaticamente uma entidade TNI para cada IC descoberto.
- Defina Categoria de inventário adequadamente (por exemplo, "Conexão lógica", "Interface").
- Se o TNI não estiver instalado: Ignore a criação da entidade TNI para evitar registros órfãos ou inválidos.