ADSM3. Sistemas IPAM / DCIM

Na série ADSM anterior, desenvolvemos a estrutura de automação, descobrimos por que a virtualização apareceu e como ela funciona. Na última parte, selecionamos e justificamos o design da rede, os papéis dos dispositivos, fabricantes, decididos pelo LLD (endereçamento, roteamento, número de sistemas autônomos).

Agora, estamos prontos para pensar em como armazenar toda essa montanha de informações e recuperá-las convenientemente no futuro.

Não, é claro, hoje existem empresas que controlam os endereços IP alocados em uma planilha do Excel. Mas este não é o nosso caminho.

Mesmo para o escritório de menor tamanho em algumas filiais, a presença de um sistema centralizado de gerenciamento de espaço IP não prejudicará.

A necessidade de um sistema de inventário é óbvia sem uma palavra.



Todas as edições do ADSM:

0. ADSM. Parte zero. Planejamento
1. ADSM. Parte Um (que é depois de zero). Virtualização de rede
2. ADSM. Parte Dois. Projeto de rede
3. ADSM. Parte Três. Sistema IPAM / DCIM

Esta edição dedicarei aos sistemas integrais de automação de rede - o sistema de gerenciamento de espaço de endereço e o sistema de inventário.

Vamos selecioná-lo e instalá-lo, lidaremos com a arquitetura, o esquema do banco de dados, as interfaces de interação e o preencheremos. E nas partes a seguir, começaremos a escrever scripts simples que automatizam operações repetitivas, como adicionar novos racks.

Além disso, eu já publiquei um artigo separado sobre a API RESTful , no qual fiz uma breve revisão de seus princípios e trabalho, precisaremos disso.

Conteúdo


  • Arquitetura do sistema
  • Esquema de dados NetBox
  • Conclusão
  • Algumas nuances da instalação do NetBox
  • Um pouco sobre o PostgreSQL
  • Links úteis

Hoje, o mercado oferece cerca de uma dúzia de ferramentas que implementam essa tarefa: paga e de código aberto.

Para as tarefas desta série de artigos, escolhi o NetBox pelos seguintes motivos:

  1. É grátis
  2. Ele contém as duas partes necessárias - inventário e gerenciamento de espaço IP.
  3. Possui uma API RESTful.
  4. Foi desenvolvido pela Digital Ocean (e mais especificamente, amado por todos os Jeremy Stretch) para si próprio, ou seja, para data centers. Portanto, há quase tudo que você precisa e quase nada mais.
  5. É suportado ativamente (Slack, Github, Google Newsletters) e está sendo atualizado.
  6. Este é um código aberto

Para as necessidades do ADSM, implantei o NetBox em um virtualochka em nosso servidor (graças a Anton Klochkov e Miran ): http://netbox.linkmeup.ru:45127
Além disso, preenchi quase todos os dados que precisamos no futuro.
Portanto, você pode tentar quase todos os exemplos e estudar o esquema de dados no modo de leitura até implantar sua instalação.
Um pouco útil antes de começar:




Arquitetura do sistema


  • O NetBox é escrito em Python3. O que é bom, porque várias outras soluções são escritas em php e alterá-las, se necessário, não é tão simples.
  • A estrutura do site em si é o Django.
  • O PostgreSQL é usado como banco de dados.
  • WEB-frontend (serviço HTTP) - NGINX - proxies solicitações ao Gunicron.
  • WSGI - Gunicorn - a interface entre o Nginx e o próprio aplicativo.
  • Estrutura de documentação da API - Swagger.
  • Para demonizar o NetBox - Systemd.

O NetBox é um projeto jovem e rápido. Por exemplo, no 2.7 eles abandonaram o supervisord e o Python 2.7 o alcançou em favor do systemd. Não faz muito tempo, não havia cache ou Webhooks.

Portanto, tudo muda rapidamente e as informações no artigo podem ficar desatualizadas no momento da leitura.

Em outras palavras, todos os componentes estão maduros e testados.

Segundo o autor, o NetBox não reflete o estado real da rede, mas o destino. Portanto, nada é carregado no NetBox a partir da rede - essa rede é configurada de acordo com o conteúdo do NetBox.
Assim, o NetBox atua como a única fonte de verdade (papel vegetal com fonte única de verdade).

E as alterações na rede devem ser acionadas por alterações na NetBox.

E isso se encaixa muito bem na ideologia que professo nesta série de artigos - se você deseja fazer alterações na rede - primeiro faça-as no sistema.



Esquema de dados NetBox


As duas tarefas principais que o NetBox resolve são gerenciamento e inventário do espaço de endereço.

É improvável que o NetBox se torne o único sistema de inventário da empresa; será um sistema adicional específico para o inventário da rede, retirando dados do sistema principal.

Obviamente, no nosso caso, haverá apenas o NetBox para fins de ADSM.
Neste ponto, a maioria dos dados iniciais no NetBox já foi inserida.
Com esses dados, demonstrarei vários exemplos de trabalho através da API.
Você pode simplesmente subir e ver: netbox.linkmeup.ru : 45127
E os mesmos dados serão necessários no futuro, quando passarmos para a automação.
Em termos gerais, o esquema de dados pode ser visto pelo esquema de banco de dados no Postgres.

List of relations Schema | Name | Type | Owner --------+------------------------------------+-------+-------- public | auth_group | table | netbox public | auth_group_permissions | table | netbox public | auth_permission | table | netbox public | auth_user | table | netbox public | auth_user_groups | table | netbox public | auth_user_user_permissions | table | netbox public | circuits_circuit | table | netbox public | circuits_circuittermination | table | netbox public | circuits_circuittype | table | netbox public | circuits_provider | table | netbox public | dcim_cable | table | netbox public | dcim_consoleport | table | netbox public | dcim_consoleporttemplate | table | netbox public | dcim_consoleserverport | table | netbox public | dcim_consoleserverporttemplate | table | netbox public | dcim_device | table | netbox public | dcim_devicebay | table | netbox public | dcim_devicebaytemplate | table | netbox public | dcim_devicerole | table | netbox public | dcim_devicetype | table | netbox public | dcim_frontport | table | netbox public | dcim_frontporttemplate | table | netbox public | dcim_interface | table | netbox public | dcim_interface_tagged_vlans | table | netbox public | dcim_interfacetemplate | table | netbox public | dcim_inventoryitem | table | netbox public | dcim_manufacturer | table | netbox public | dcim_platform | table | netbox public | dcim_powerfeed | table | netbox public | dcim_poweroutlet | table | netbox public | dcim_poweroutlettemplate | table | netbox public | dcim_powerpanel | table | netbox public | dcim_powerport | table | netbox public | dcim_powerporttemplate | table | netbox public | dcim_rack | table | netbox public | dcim_rackgroup | table | netbox public | dcim_rackreservation | table | netbox public | dcim_rackrole | table | netbox public | dcim_rearport | table | netbox public | dcim_rearporttemplate | table | netbox public | dcim_region | table | netbox public | dcim_site | table | netbox public | dcim_virtualchassis | table | netbox public | django_admin_log | table | netbox public | django_content_type | table | netbox public | django_migrations | table | netbox public | django_session | table | netbox public | extras_configcontext | table | netbox public | extras_configcontext_platforms | table | netbox public | extras_configcontext_regions | table | netbox public | extras_configcontext_roles | table | netbox public | extras_configcontext_sites | table | netbox public | extras_configcontext_tags | table | netbox public | extras_configcontext_tenant_groups | table | netbox public | extras_configcontext_tenants | table | netbox public | extras_customfield | table | netbox public | extras_customfield_obj_type | table | netbox public | extras_customfieldchoice | table | netbox public | extras_customfieldvalue | table | netbox public | extras_customlink | table | netbox public | extras_exporttemplate | table | netbox public | extras_graph | table | netbox public | extras_imageattachment | table | netbox public | extras_objectchange | table | netbox public | extras_reportresult | table | netbox public | extras_tag | table | netbox public | extras_taggeditem | table | netbox public | extras_webhook | table | netbox public | extras_webhook_obj_type | table | netbox public | ipam_aggregate | table | netbox public | ipam_ipaddress | table | netbox public | ipam_prefix | table | netbox public | ipam_rir | table | netbox public | ipam_role | table | netbox public | ipam_service | table | netbox public | ipam_service_ipaddresses | table | netbox public | ipam_vlan | table | netbox public | ipam_vlangroup | table | netbox public | ipam_vrf | table | netbox public | secrets_secret | table | netbox public | secrets_secretrole | table | netbox public | secrets_secretrole_groups | table | netbox public | secrets_secretrole_users | table | netbox public | secrets_sessionkey | table | netbox public | secrets_userkey | table | netbox public | taggit_tag | table | netbox public | taggit_taggeditem | table | netbox public | tenancy_tenant | table | netbox public | tenancy_tenantgroup | table | netbox public | users_token | table | netbox public | virtualization_cluster | table | netbox public | virtualization_clustergroup | table | netbox public | virtualization_clustertype | table | netbox public | virtualization_virtualmachine | table | netbox 

Recursos do NetBox :

  • Gerenciamento de endereço IP (IPAM) - prefixos IP, endereços, VRFs e VLANs
  • Racks de equipamentos - racks de equipamentos organizados por site, grupo e função
  • Dispositivos - dispositivos, seus modelos, funções, componentes e implantação
  • Conexões - conexões de rede, console e energia entre dispositivos
  • Virtualização - Máquinas Virtuais e Clusters de Computação
  • Circuitos de dados - Conexões do provedor
  • Segredos - Armazenamento de credenciais de usuário criptografado

Neste artigo, abordarei o seguinte: DCIM - Gerenciamento de infraestrutura de datacenter, IPAM - Gerenciamento de endereço IP, Virtualização, Coisas legais adicionais.



Primeiras coisas primeiro.

DCIM


A parte mais importante é, sem dúvida, o equipamento que temos e como ele está conectado. Mas tudo começa onde está.

Regiões e sites (regiões / sites)


No paradigma NetBox, um dispositivo é instalado em um site, um site pertence a uma região e regiões podem ser aninhadas. No entanto, o dispositivo não pode ser instalado simplesmente na região. Se houver tal necessidade, um site separado deve ser estabelecido.

Para o nosso caso, isso pode (e será) parecer com o seguinte:




Lembro onde e como planejamos nossa rede: ADSM2. Projeto de rede





Vamos ver o que a API permite.

Aqui está uma lista de todas as regiões:

 curl -X GET "http://netbox.linkmeup.ru:45127/api/dcim/regions/" -H "Accept: application/json; indent=4" 

 nb.dcim.regions.all() 

A seguir, darei exemplos de curl e pynetbox sem gerar o resultado.
Não se esqueça da barra no final do URL - sem ela, não funcionará.
Eu falei sobre como usar o pynetbox em um artigo sobre a API RESTful .
Obtenha a lista de sites:

 curl -X GET "http://netbox.linkmeup.ru:45127/api/dcim/sites/" -H "Accept: application/json; indent=4" 

 nb.dcim.sites.all() 

Lista de sites em uma região específica:

 curl -X GET "http://netbox.linkmeup.ru:45127/api/dcim/sites/?region=ru" -H "Accept: application/json; indent=4" 

 nb.dcim.sites.filter(region="ru") 

Observe que a pesquisa não é por nome completo, mas pela chamada lesma .
Slug é um identificador que contém apenas caracteres seguros: [0-9A-Za-z-_], que pode ser usado no URL. É definido ao criar um objeto, por exemplo, "bcn" em vez de "Barcelona".




Aparelhos


O dispositivo em si tem uma função , por exemplo, folha, coluna, borda, borda.

Obviamente, é algum tipo de modelo de algum fornecedor .
Por exemplo, Arista .

Assim, um fornecedor é criado primeiro e depois dentro do modelo.

O modelo é caracterizado por um nome, um conjunto de interfaces de serviço, uma interface de controle remoto, uma porta de console e um conjunto de módulos de energia.

Além de comutadores, roteadores e hosts com interfaces Ethernet, você pode criar servidores de console.





Obtenha uma lista de todos os dispositivos:

 curl -X GET "http://netbox.linkmeup.ru:45127/api/dcim/devices/" -H "Accept: application/json; indent=4" 

 nb.dcim.devices.all() 

Todos os dispositivos para um site específico:

 curl -X GET "http://netbox.linkmeup.ru:45127/api/dcim/devices/?site=mlg" -H "Accept: application/json; indent=4" 

 nb.dcim.devices.filter(site="mlg") 

Todos os dispositivos de um determinado modelo

 curl -X GET "http://netbox.linkmeup.ru:45127/api/dcim/devices/?model=veos" -H "Accept: application/json; indent=4" 

 nb.dcim.devices.filter(device_type_id=2) 

Todos os dispositivos com uma função específica:

 curl -X GET "http://netbox.linkmeup.ru:45127/api/dcim/devices/?role=leaf" -H "Accept: application/json; indent=4" 

 nb.dcim.devices.filter(role="leaf") 

O dispositivo pode estar em diferentes status: Ativo, Off-line, Planejado, etc.

Todos os dispositivos ativos:

 curl -X GET "http://netbox.linkmeup.ru:45127/api/dcim/devices/?status=active" -H "Accept: application/json; indent=4" 

 nb.dcim.devices.filter(status="active") 



Interfaces


O NetBox suporta muitos tipos de interfaces físicas e LAGs, no entanto, todas as virtuais, como Vlan / IRB e loopback, são combinadas sob um tipo - Virtual.
Cada interface está vinculada a um dispositivo.

As interfaces do dispositivo podem ser conectadas entre si. Isso será exibido na interface e nas respostas da API (atributo linked_endpoint).



A interface pode estar em vários modos: Marcado ou Acesso.

Consequentemente, ele pode ser lançado na tag com ou sem VLANs - neste site ou global.

Obtenha uma lista de todas as interfaces de dispositivos:

 curl -X GET "http://netbox.linkmeup.ru:45127/api/dcim/interfaces/?device=mlg-leaf-0" -H "Accept: application/json; indent=4" 

 nb.dcim.interfaces.filter(device="mlg-leaf-0") 

Obtenha uma lista de VLANs de uma interface específica.

 curl -X GET "http://netbox.linkmeup.ru:45127/api/dcim/interfaces/?device=mlg-leaf-0&name=Ethernet7" -H "Accept: application/json; indent=4" 

 nb.dcim.interfaces.get(device="mlg-leaf-0", name="Ethernet7").untagged_vlan.vid 

Observe que aqui eu já uso o método get em vez do filtro . Filtro retorna uma lista, mesmo se o resultado for um único objeto. Get - retorna um único objeto ou falha se o resultado da consulta for uma lista de objetos.

Portanto, get deve ser usado apenas quando você tiver certeza absoluta de que o resultado estará em uma única cópia.

Aqui, logo após a solicitação, viro para os atributos do objeto. A rigor, isso está errado: se nada foi encontrado pela solicitação, o pynetbox retornará None e não possui o atributo "untagged_vlan".

E também observe que nem em todos os lugares o pynetbox espera slug, algum lugar e nome.
Descubra a qual interface de qual dispositivo uma interface específica está conectada:

 curl -X GET "http://netbox.linkmeup.ru:45127/api/dcim/interfaces/?device=mlg-leaf-0&name=Ethernet1" -H "Accept: application/json; indent=4" 

 iface = nb.dcim.interfaces.get(device="mlg-leaf-0", name="Ethernet1") iface.connected_endpoint.device iface.connected_endpoint.name 

Descubra o nome da interface de gerenciamento:

 curl -X GET "http://netbox.linkmeup.ru:45127/api/dcim/interfaces/?device=mlg-leaf-0&mgmt_only=true" -H "Accept: application/json; indent=4" 

 nb.dcim.interfaces.get(device="mlg-leaf-0", mgmt_only=True) 



Portas do console


As portas do console não são interfaces, portanto, elas são renderizadas como terminais separados.
As portas do dispositivo podem ser associadas às portas do servidor do console.

Descubra em qual porta o servidor do console ao qual um dispositivo específico está conectado.

 curl -X GET "http://netbox.linkmeup.ru:45127/api/dcim/console-ports/?device=mlg-leaf-0" -H "Accept: application/json; indent=4" 

 nb.dcim.console_ports.get(device="mlg-leaf-0").serialize() 

O método serialize no pynetbox permite converter os atributos de uma instância de uma classe em um dicionário.


Ipam


VLAN e VRF


Eles podem ser vinculados a um local - útil para VLAN.

Ao criar um VRF, você pode especificar se o espaço de endereço pode cruzar com outros VRFs.

Obtenha uma lista de todas as VLANs:

 curl -X GET "http://netbox.linkmeup.ru:45127/api/ipam/vlans/" -H "Accept: application/json; indent=4" 

 nb.ipam.vlans.all() 

Obtenha uma lista de todos os VRFs:

 curl -X GET "http://netbox.linkmeup.ru:45127/api/ipam/vrfs/" -H "Accept: application/json; indent=4" 

 nb.ipam.vrfs.all() 



Prefixos de IP


Eles têm uma estrutura hierárquica. Pode pertencer a qualquer VRF (se não, então Global).



O NetBox tem uma representação visual muito conveniente de prefixos gratuitos:



Você pode selecioná-lo simplesmente clicando na linha verde.

Pode ser anexado a um local. Você pode selecionar o próximo sub-prefixo gratuito do tamanho necessário ou o próximo endereço IP gratuito por meio da API.

A marca de seleção / parâmetro "É um pool" determina se o 0-ésimo endereço desse prefixo será destacado durante a seleção automática ou se será iniciado a partir do 1º.

Obtenha uma lista de prefixos de IP do site Málaga com a função Underlay e um comprimento de 19:

 curl -X GET "http://netbox.linkmeup.ru:45127/api/ipam/prefixes/?site=mlg&role=underlay&mask_length=19" -H "Accept: application/json; indent=4" 

 prefix = nb.ipam.prefixes.get(site="mlg", role="underlay", mask_length="19") 

Obtenha uma lista de prefixos gratuitos na região da Rússia com a função Underlay:

 curl -X GET "http://netbox.linkmeup.ru:45127/api/ipam/prefixes/40/available-prefixes/" -H "Accept: application/json; indent=4" 

 prefix.available_prefixes.list() 

Destaque o seguinte prefixo gratuito 24:

 curl -X POST "http://netbox.linkmeup.ru:45127/api/ipam/prefixes/40/available-prefixes/" \ -H "accept: application/json" \ -H "Content-Type: application/json" \ -H "Authorization: TOKEN a9aae70d65c928a554f9a038b9d4703a1583594f" \ -d "{\"prefix_length\": 24}" 

 prefix.available_prefixes.create({"prefix_length":24}) 

Quando precisamos selecionar algum filho dentro de um objeto, o método POST é usado e precisamos especificar o ID do objeto pai - neste caso - 40 . Descobrimos ligando do exemplo anterior.
No caso de pynetbox, primeiro (no exemplo anterior) salvamos o resultado na variável prefix e depois voltamos para o atributo available_prefixes e o método create .
Este exemplo não funcionará para você, pois o token com o direito de gravação já é inválido.


Endereços IP


Se houver um prefixo incluindo este endereço, eles farão parte dele. Eles podem estar por conta própria.
Pode pertencer a qualquer VRF ou estar na Global.
Eles podem ser conectados à interface, mas podem ficar no ar.
Você pode selecionar o próximo endereço IP gratuito no prefixo.



Para fazer isso, basta clicar na linha verde.

Obtenha uma lista de endereços IP para uma interface específica:

 curl -X GET "http://netbox.linkmeup.ru:45127/api/ipam/ip-addresses/?interface_id=8" -H "Accept: application/json; indent=4" 

 nb.ipam.ip_addresses.filter(interface_id=8) 

Ou:

 curl -X GET "http://netbox.linkmeup.ru:45127/api/ipam/ip-addresses/?device=mlg-leaf-0&interface=Ethernet1" -H "Accept: application/json; indent=4" 

 nb.ipam.ip_addresses.filter(device="mlg-leaf-0", interface="Ethernet1") 

Obtenha uma lista de todos os endereços IP do dispositivo:

 curl -X GET "http://netbox.linkmeup.ru:45127/api/ipam/ip-addresses/?device=mlg-leaf-0" -H "Accept: application/json; indent=4" 

 nb.ipam.ip_addresses.filter(device="mlg-leaf-0") 

Obtenha uma lista dos endereços IP de prefixo disponíveis:

 curl -X GET "http://netbox.linkmeup.ru:45127/api/ipam/prefixes/28/available-ips/" -H "Accept: application/json; indent=4" 

 prefix = nb.ipam.prefixes.get(site="mlg", role="leaf-loopbacks") prefix.available_ips.list() 

Aqui, novamente, você precisa especificar o ID do prefixo no URL a partir do qual selecionamos o endereço - desta vez, é 28.
Destaque o seguinte endereço IP gratuito no prefixo:

 curl -X POST "http://netbox.linkmeup.ru:45127/api/ipam/prefixes/28/available-ips/" \ -H "accept: application/json" \ -H "Content-Type: application/json" \ -H "Authorization: TOKEN a9aae70d65c928a554f9a038b9d4703a1583594f" 

 prefix.available_ips.create() 



Virtualização


Ainda estamos lutando pelo título da DC moderna. Onde sem virtualização.

O NetBox não parece e não é um lugar onde vale a pena armazenar informações sobre máquinas virtuais (você pode até especular sobre a necessidade de armazenar máquinas físicas nele). No entanto, isso pode ser útil para nós, por exemplo, é possível inserir informações sobre refletores de rota, máquinas de serviço, como NTP, Syslog, servidores S-Flow e máquinas de controle.

A VM possui sua própria lista de interfaces - elas são diferentes das interfaces de dispositivos físicos e têm seu próprio ponto de extremidade separado.

Então você pode listar todas as máquinas virtuais:

 curl -X GET "http://netbox.linkmeup.ru:45127/api/virtualization/virtual-machines/" -H "Accept: application/json; indent=4" 

 nb.virtualization.virtual_machines.all() 

Então - de todas as interfaces de todas as VMs:

 curl -X GET "http://netbox.linkmeup.ru:45127/api/virtualization/interfaces/" -H "Accept: application/json; indent=4" 

 nb.virtualization.interfaces.all() 

Para uma VM, não é possível especificar o hypervisor / máquina física específica na qual está sendo executada, mas é possível especificar um cluster. Embora nem tudo seja tão desesperador. Continue lendo.



Extra nice stuff


A funcionalidade básica do NetBox cobre a maioria das tarefas de muitos usuários, mas não todas. Ainda assim, o produto foi originalmente escrito para resolver os problemas de uma empresa em particular. No entanto, está desenvolvendo ativamente e novos lançamentos são lançados com bastante frequência . Assim, novas funções aparecem.

Assim, por exemplo, desde a minha primeira instalação do NetBox há alguns anos, surgiram tags, contextos de configuração, webhooks, cache, supervisord alterados para systemd, armazenamento externo de arquivos.

Cuidado.

Campos personalizados


Às vezes, você deseja adicionar um campo a qualquer entidade na qual você pode colocar dados arbitrários.

Por exemplo, indique o número do contrato de fornecimento pelo qual o switch foi comprado ou o nome da máquina física na qual a VM está sendo executada.

É aqui que os campos personalizados são resgatados - exatamente um campo com um valor de texto que pode ser adicionado a quase qualquer entidade na NetBox.

Crie campos personalizados no painel de administração



É assim que aparece ao editar o dispositivo para o qual o campo personalizado foi criado:



Solicitar uma lista de dispositivos por valor custom_field

 curl -X GET "http://netbox.linkmeup.ru:45127/api/dcim/devices/?cf_contract_number=0123456789" -H "Accept: application/json; indent=4" 

 nb.dcim.devices.filter(cf_contract_number="0123456789") 



Contexto de configuração


Às vezes, você quer algo mais que texto não estruturado. Em seguida, o contexto de configuração é resgatado.

Esta é uma oportunidade para introduzir um conjunto de dados estruturados no formato JSON, que não tem mais para colocar.

Pode ser, por exemplo, um conjunto de comunidades BGP ou uma lista de servidores Syslog.

O contexto de configuração pode ser local - configurado para um objeto específico - ou global, quando é configurado uma vez e, em seguida, se aplica a todos os objetos que atendem a determinadas condições (por exemplo, localizadas no mesmo site ou em execução na mesma plataforma).



O contexto de configuração é adicionado automaticamente aos resultados da consulta. Ao mesmo tempo, os contextos local e global se fundem em um.

Por exemplo, para um dispositivo apenas uma garota russa simples, para a qual existe um contexto local, a saída conterá a chave "config_context":

 curl -X GET "http://netbox.linkmeup.ru:45127/api/dcim/devices/?q=russian" -H "Accept: application/json; indent=4" 





Tags


É difícil dizer algo novo sobre tags. Eles são Eles são convenientes para adicionar qualquer recurso. Por exemplo, você pode marcar as opções "byada" do lote em que a memória falha.



Webhooks


Uma coisa insubstituível quando você precisa de outros serviços para aprender sobre as alterações no NetBox.
Por exemplo, ao iniciar um novo comutador, um gancho é enviado ao sistema de automação, que inicia o processo de configuração e colocação do dispositivo.



Conclusão


Neste artigo, não pretendo considerar todos os recursos do NetBox; portanto, darei tudo o mais para você. Entenda, tente.

Além disso, como parte da construção do sistema de automação, tocarei apenas nas partes que realmente precisamos.

Então, acima, eu falei brevemente sobre o que é o NetBox e como os dados são armazenados nele.

Repito que já inseri quase todos os dados necessários lá e você pode arrastar um despejo de banco de dados para si mesmo.

Tudo está pronto para o próximo estágio de automação: escrever um sistema (ahaha, apenas scripts) para inicializar os dispositivos e gerenciar a configuração.



Mas, antes de terminar o artigo, direi algumas palavras sobre a instalação e operação dos componentes NetBox.

Algumas nuances da instalação do NetBox


Não descreverei o processo de instalação em detalhes - ele é mais do que famoso na documentação oficial .

Você pode ver o processo de inicialização da imagem do docker NetBox e trabalhar na GUI no vídeo de Dima Figol ( uma e duas vezes ) e Emil Garipov .

Em geral, se você seguir rigorosamente as etapas de instalação / inicialização, tudo dará certo.
Mas aqui estão as nuances que você pode esquecer acidentalmente.

  • No arquivo configuration.py, o parâmetro ALLOWED_HOSTS deve ser preenchido:
     ALLOWED_HOSTS = ['netbox.linkmeup.ru', 'localhost'] 

    Aqui você precisa especificar todos os nomes possíveis de NetBox aos quais você acessará, por exemplo, pode haver um endereço IP externo ou 127.0.0.1 ou alias de DNS.
    Se isso não for feito, o site da NetBox não abrirá e exibirá 400.
  • No mesmo arquivo, SECRET_KEY deve ser especificado, o qual você pode inventar ou gerar um script.
  • A página principal mostrará 502 Bad Gateway se algo estiver errado com a configuração do banco de dados PostgreSQL: verifique o host (se instalado em outra máquina), porta, nome do banco de dados, nome de usuário e senha.
  • Por algum tempo, o NetBox, por padrão, não concede direitos de leitura sem autorização.

    Tudo isso muda na mesma configuration.py:

     EXEMPT_VIEW_PERMISSIONS = ['*'] 
  • E também as solicitações de API retornarão 200 e não funcionarão se não houver uma barra no URL da API no final.
     curl -X GET -H "Accept: application/json; indent=4" "http://netbox.linkmeup.ru:45127/api/dcim/devices" 




Um pouco sobre o PostgreSQL


Para se conectar ao servidor:

 psql -U <i>username</i> -h <i>hostname</i> <i>db_name</i> 

Por exemplo:

 psql -U netbox -h localhost netbox 

Para exibir todas as tabelas:

 /dt 

Para sair:

 /q 

Para um despejo de banco de dados:

 pg_dump -U <i>username</i> -h <i>hostname</i> <i>db_name</i> > netbox.sql 

Se você não quiser inserir uma senha todas as vezes:

 echo *:*:*:<i>username</i>:<i>password</i> > ~/.pgpass chmod 600 ~/.pgpass 

Se você possui sua própria instalação e não deseja fazer tudo manualmente, basta fazer um despejo do banco de dados atual do NetBox aqui :

 psql -U <i>username</i> -h <i>hostname</i> <i>db_name</i> < netbox_initial_db.sql 

Se você primeiro precisar descartar todas as tabelas (e precisar fazer isso), poderá preparar o arquivo com antecedência:

 psql -U <i>username</i> -h <i>hostname</i> <i>db_name</i> \o drop_all_tables.sql select 'drop table ' || tablename || ' cascade;' from pg_tables; \q psql -U <i>username</i> -h <i>hostname</i> <i>db_name</i> -f drop_all_tables.sql 



Links úteis


Source: https://habr.com/ru/post/pt486000/


All Articles