ADSM3. Sistemas IPAM / DCIM

En la serie ADSM anterior, desarrollamos el marco de automatización, descubrimos por qué apareció la virtualización y cómo funciona. En la última parte, seleccionamos y justificamos el diseño de la red, los roles de los dispositivos, los fabricantes, decidimos sobre LLD (direccionamiento, enrutamiento, números de sistemas autónomos).

Ahora estamos listos para pensar en cómo almacenar toda esta montaña de información y recuperarla convenientemente en el futuro.

No, por supuesto, hoy hay empresas que realizan un seguimiento de las direcciones IP asignadas en una hoja de cálculo de Excel. Pero este no es nuestro camino.

Incluso para la oficina de menor tamaño en un par de sucursales, la presencia de un sistema de gestión de espacio IP centralizado no afectará.

La necesidad de un sistema de inventario es obvia sin una palabra.



Todos los problemas de ADSM:

0. ADSM. Parte Cero. Planificacion
1. ADSM. Primera parte (que es después de cero). Virtualización de red
2. ADSM. Segunda parte Diseño de red
3. ADSM. Tercera parte Sistema IPAM / DCIM

Este tema lo dedicaré a los sistemas integrales en la automatización de redes: el sistema de gestión del espacio de direcciones y el sistema de inventario.

Lo seleccionaremos e instalaremos, nos ocuparemos de la arquitectura, el esquema de la base de datos, las interfaces de interacción y lo rellenaremos. Y en las siguientes partes, comenzaremos a escribir scripts simples que automatizan las operaciones repetitivas, como agregar nuevos bastidores.

Además, ya publiqué un artículo separado sobre la API RESTful , en el que ofrecí una breve descripción de sus principios y trabajo, lo necesitaremos.

Contenido


  • Arquitectura del sistema
  • Esquema de datos de NetBox
  • Conclusión
  • Algunos matices de la instalación de NetBox
  • Un poco sobre PostgreSQL
  • Enlaces utiles

Hoy, el mercado ofrece alrededor de una docena de herramientas que implementan esta tarea: tanto de pago como de código abierto.

Para las tareas en esta serie de artículos, elegí NetBox por las siguientes razones:

  1. Es gratis
  2. Contiene las dos partes necesarias: inventario y gestión del espacio IP.
  3. Tiene una API RESTful.
  4. Fue desarrollado por Digital Ocean (y más específicamente, querido por todos Jeremy Stretch) para sí mismo, es decir, para centros de datos. Por lo tanto, hay casi todo lo que necesita, y casi nada más.
  5. Es activamente compatible (Slack, Github, Google Newsletters) y se está actualizando.
  6. Esto es de código abierto

Para las necesidades de ADSM, implementé NetBox en un virtualochka en nuestro servidor (gracias a Anton Klochkov y Miran ): http://netbox.linkmeup.ru:45127
Además, completé casi todos los datos que necesitamos en el futuro.
Por lo tanto, puede probar casi todos los ejemplos y estudiar el esquema de datos en modo de lectura hasta que implemente su instalación.
Un poco útil antes de comenzar:




Arquitectura del sistema


  • NetBox está escrito en Python3. Lo cual es bueno, porque varias otras soluciones están escritas en php y cambiarlas si es necesario no es tan simple.
  • El marco para el sitio en sí es Django.
  • PostgreSQL se usa como la base de datos.
  • WEB-frontend (servicio HTTP) - NGINX - envía solicitudes a Gunicron.
  • WSGI - Gunicorn: la interfaz entre Nginx y la aplicación misma.
  • Marco de documentación de API - Swagger.
  • Para demonizar NetBox - Systemd.

NetBox es un proyecto joven y acelerado. Por ejemplo, en 2.7 abandonaron la supervisión y Python 2.7 buscó en favor de systemd. No hace mucho tiempo, no había almacenamiento en caché o Webhooks.

Por lo tanto, todo cambia rápidamente y la información del artículo puede quedar desactualizada en el momento de la lectura.

En otras palabras, todos los componentes son maduros y probados.

Según el autor, NetBox no refleja el estado real de la red, sino el objetivo. Por lo tanto, no se carga nada en la NetBox desde la red; esta red se configura de acuerdo con el contenido de la NetBox.
Por lo tanto, NetBox actúa como la única fuente de verdad (papel de calco con una sola fuente de verdad).

Y los cambios en la red deben ser activados por cambios en NetBox.

Y encaja muy bien con la ideología que profeso en esta serie de artículos, si desea realizar cambios en la red, primero debe hacerlos en el sistema.



Esquema de datos de NetBox


Las dos tareas principales que resuelve NetBox son la gestión del espacio de direcciones y el inventario.

Es poco probable que NetBox se convierta en el único sistema de inventario en la compañía; más bien, será un sistema adicional específico para inventariar la red, tomando datos del principal.

Obviamente, en nuestro caso, solo habrá NetBox para fines ADSM.
En este punto, la mayoría de los datos iniciales en NetBox ya se han ingresado.
Con estos datos, demostraré varios ejemplos de trabajo a través de la API.
Simplemente puedes subir y ver: netbox.linkmeup.ru : 45127
Y se necesitarán los mismos datos en el futuro, cuando pasemos a la automatización.
En términos generales, el esquema de la base de datos en Postgres puede ver el esquema de datos.

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 

Funciones de NetBox :

  • Administración de direcciones IP (IPAM) : prefijos IP, direcciones, VRF y VLAN
  • Bastidores de equipos: bastidores de equipos organizados por sitio, grupo y rol
  • Dispositivos : dispositivos, sus modelos, roles, componentes e implementación
  • Conexiones : conexiones de red, consola y alimentación entre dispositivos
  • Virtualización : máquinas virtuales y clústeres informáticos
  • Circuitos de datos - Conexiones de proveedor
  • Secretos : almacenamiento de credenciales de usuario cifrado

En este artículo tocaré las siguientes cosas: DCIM - Administración de Infraestructura del Centro de Datos, IPAM - Administración de Dirección IP, Virtualización, Cosas buenas adicionales.



Lo primero es lo primero.

DCIM


La parte más importante es, sin duda, qué equipo tenemos y cómo está conectado entre sí. Pero todo comienza donde está parado.

Regiones y sitios (regiones / sitios)


En el paradigma de NetBox, un dispositivo se instala en un sitio, un sitio pertenece a una región, las regiones se pueden anidar. Sin embargo, el dispositivo no se puede instalar simplemente en la región. Si existe tal necesidad, se debe establecer un sitio separado.

Para nuestro caso, esto puede (y se verá) así:




Les recuerdo dónde y cómo planeamos nuestra red: ADSM2. Diseño de red





Veamos qué permite la API.

Aquí hay una lista de todas las regiones:

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

 nb.dcim.regions.all() 

A continuación daré ejemplos de curl y pynetbox sin generar el resultado.
No olvides la barra diagonal al final de la URL; sin ella, no funcionará.
Hablé sobre cómo usar pynetbox en un artículo sobre la API RESTful .
Obtenga la lista de sitios:

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

 nb.dcim.sites.all() 

Lista de sitios en una región 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") 

Tenga en cuenta que la búsqueda no es por nombre completo, sino por la llamada babosa .
Slug es un identificador que contiene solo caracteres seguros: [0-9A-Za-z-_], que se pueden usar en la URL. Se establece al crear un objeto, por ejemplo, "bcn" en lugar de "Barcelona".




Dispositivos


El dispositivo en sí tiene un papel , por ejemplo, hoja, columna vertebral, borde, borde.

Obviamente, es algún tipo de modelo de algún proveedor .
Por ejemplo, Arista .

Por lo tanto, primero se crea un proveedor, luego dentro del modelo.

El modelo se caracteriza por un nombre, un conjunto de interfaces de servicio, una interfaz de control remoto, un puerto de consola y un conjunto de módulos de alimentación.

Además de conmutadores, enrutadores y hosts con interfaces Ethernet, puede crear servidores de consola.





Obtenga una lista de todos los dispositivos:

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

 nb.dcim.devices.all() 

Todos los dispositivos para un sitio en particular:

 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 los dispositivos de cierto 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 los dispositivos con un rol específico:

 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") 

El dispositivo puede estar en diferentes estados: activo, sin conexión, planificado, etc.

Todos los dispositivos activos:

 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


NetBox admite muchos tipos de interfaces físicas y LAG, sin embargo, todos los virtuales, como Vlan / IRB y loopback, se combinan en un solo tipo: virtual.
Cada interfaz está vinculada a un dispositivo.

Las interfaces del dispositivo se pueden conectar entre sí. Esto se mostrará tanto en la interfaz como en las respuestas de la API (atributo connected_endpoint).



La interfaz puede estar en varios modos: Etiquetado o Acceso.

En consecuencia, se puede iniciar en la etiqueta con o sin VLAN, este sitio o global.

Obtenga una lista de todas las interfaces de dispositivo:

 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") 

Obtenga una lista de VLAN de una interfaz 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 

Tenga en cuenta que aquí ya uso el método get en lugar del filtro . El filtro devuelve una lista, incluso si el resultado es un solo objeto. Obtener: devuelve un solo objeto o falla si el resultado de la consulta es una lista de objetos.

Por lo tanto, get debe usarse solo cuando esté absolutamente seguro de que el resultado estará en una sola copia.

Aquí, justo después de la solicitud, me dirijo a los atributos del objeto. Estrictamente hablando, esto está mal: si la solicitud no encontró nada, entonces pynetbox devolverá None y no tiene el atributo "untagged_vlan".

Y también tenga en cuenta que no en todas partes pynetbox espera babosa, en algún lugar y nombre.
Averigüe a qué interfaz de qué dispositivo está conectada una interfaz particular:

 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 el nombre de la interfaz de administración:

 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) 



Puertos de consola


Los puertos de la consola no son interfaces, por lo tanto, se representan como puntos finales separados.
Los puertos del dispositivo se pueden asociar con los puertos del servidor de consola.

Averigüe a qué puerto en qué servidor de consola está conectado un dispositivo específico.

 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() 

El método de serialización en pynetbox le permite convertir los atributos de una instancia de una clase en un diccionario.


Ipam


VLAN y VRF


Se pueden vincular a una ubicación, útil para VLAN.

Al crear un VRF, puede especificar si se permite que el espacio de direcciones se cruce con otros VRF.

Obtenga una lista de todas las VLAN:

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

 nb.ipam.vlans.all() 

Obtenga una lista de todos los VRF:

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

 nb.ipam.vrfs.all() 



Prefijos IP


Tienen una estructura jerárquica. Puede pertenecer a cualquier VRF (si no lo hace, entonces Global).



NetBox tiene una representación visual muy conveniente de prefijos gratuitos:



Puede seleccionarlo simplemente haciendo clic en la línea verde.

Se puede adjuntar a una ubicación. Puede seleccionar el siguiente sub-prefijo gratuito del tamaño requerido o la siguiente dirección IP libre a través de la API.

La marca de verificación / parámetro "Es un grupo" determina si la dirección 0 de este prefijo se resaltará durante la selección automática, o si comenzará desde el 1er.

Obtenga una lista de prefijos IP del sitio de Málaga con el rol Underlay y una longitud 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") 

Obtenga una lista de prefijos gratuitos en la región de Rusia con el rol 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() 

Resalte el siguiente prefijo 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}) 

Cuando necesitamos seleccionar algún niño dentro de un objeto, se usa el método POST y necesitamos especificar la ID del objeto padre, en este caso, 40 . Lo descubrimos llamando del ejemplo anterior.
En el caso de pynetbox, primero (en el ejemplo anterior) guardamos el resultado en la variable prefijo , y luego recurrimos a su atributo available_prefixes y al método create .
Este ejemplo no funcionará para usted, ya que el token con el derecho de escritura ya no es válido.


Direcciones IP


Si hay un prefijo que incluye esta dirección, serán parte de él. Pueden estar solos.
Puede pertenecer a cualquier VRF o estar en Global.
Se pueden conectar a la interfaz, pero pueden colgarse en el aire.
Puede seleccionar la siguiente dirección IP libre en el prefijo.



Para hacer esto, simplemente haga clic en la línea verde.

Obtenga una lista de direcciones IP para una interfaz 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) 

O:

 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") 

Obtenga una lista de todas las direcciones IP del 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") 

Obtenga una lista de direcciones IP de prefijo disponibles:

 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() 

Una vez más, debe especificar la ID del prefijo en la URL de la que seleccionamos la dirección; esta vez es 28.
Resalte la siguiente dirección IP libre en el prefijo:

 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() 



Virtualización


Todavía estamos luchando por el título de DC moderno. Donde sin virtualización.

NetBox no se ve y no es un lugar donde valga la pena almacenar información sobre máquinas virtuales (incluso puede especular sobre la necesidad de almacenar máquinas físicas en él). Sin embargo, esto puede resultarnos útil, por ejemplo, puede ingresar información sobre Reflectores de ruta, máquinas de servicio, como NTP, Syslog, servidores S-Flow y máquinas de control.

La VM tiene su propia lista de interfaces: son diferentes de las interfaces de los dispositivos físicos y tienen su propio Endpoint separado.

Para que pueda enumerar todas las máquinas virtuales:

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

 nb.virtualization.virtual_machines.all() 

Entonces, de todas las interfaces de todas las máquinas virtuales:

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

 nb.virtualization.interfaces.all() 

Para una VM, no puede especificar el hipervisor / máquina física específica en la que se está ejecutando, pero puede especificar un clúster. Aunque no todo es tan desesperado. Sigue leyendo.



Cosas extra bonitas


La funcionalidad básica de NetBox cubre la mayoría de las tareas de muchos usuarios, pero no todas. Aún así, el producto fue escrito originalmente para resolver los problemas de una empresa en particular. Sin embargo, se está desarrollando activamente y los nuevos lanzamientos salen con bastante frecuencia . En consecuencia, aparecen nuevas funciones.

Entonces, por ejemplo, desde mi primera instalación de NetBox hace un par de años, aparecieron etiquetas, contextos de configuración, webhooks, almacenamiento en caché, supervisión cambió a systemd, almacenamiento de archivos externo.

Cuidado

Campos personalizados


En ocasiones, desea agregar un campo a cualquier entidad en la que pueda colocar datos arbitrarios.

Por ejemplo, indique el número del acuerdo de suministro mediante el cual se compró el conmutador o el nombre de la máquina física en la que se ejecuta la VM.

Aquí es donde los campos personalizados vienen al rescate, solo un campo con un valor de texto que se puede agregar a casi cualquier entidad en NetBox.

Crear campos personalizados en el panel de administración



Así es como se ve al editar el dispositivo para el que se creó el campo personalizado:



Solicite una 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 configuración


A veces quieres algo más que texto no estructurado. Entonces el contexto de configuración viene al rescate.

Esta es una oportunidad para introducir un conjunto de datos estructurados en formato JSON, que no tiene otro lugar para colocar.

Esto podría ser, por ejemplo, un conjunto de comunidades BGP o una lista de servidores Syslog.

El contexto de configuración puede ser local, configurado para un objeto en particular, o global, cuando se configura una vez, y luego se aplica a todos los objetos que cumplen ciertas condiciones (por ejemplo, ubicados en el mismo sitio o que se ejecutan en la misma plataforma).



El contexto de configuración se agrega automáticamente a los resultados de la consulta. Al mismo tiempo, los contextos locales y globales se fusionan en uno.

Por ejemplo, para un dispositivo solo una simple chica rusa, para la cual hay un contexto local, la salida contendrá la clave "config_context":

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





Etiquetas


Es difícil decir algo nuevo sobre las etiquetas. Ellos son. Son convenientes para agregar cualquier característica. Por ejemplo, puede etiquetar los conmutadores "byada" del lote en el que falla la memoria.



Webhooks


Algo irremplazable cuando necesita otros servicios para conocer los cambios en NetBox.
Por ejemplo, cuando se inicia un nuevo interruptor, se envía un gancho al sistema de automatización, que inicia el proceso de configuración del dispositivo y su puesta en funcionamiento.



Conclusión


En este artículo, no pretendo considerar todas las características de NetBox, por lo que le daré todo lo demás. Comprende, prueba.

Además, como parte de la construcción del sistema de automatización, tocaré solo aquellas partes que realmente necesitamos.

Entonces, arriba, hablé brevemente sobre qué es NetBox y cómo se almacenan los datos en él.

Repito que ya ingresé casi todos los datos necesarios allí, y puede arrastrar un volcado de base de datos usted mismo.

Todo está listo para la siguiente etapa de automatización: escribir un sistema (jajaja, solo scripts) para inicializar los dispositivos y administrar la configuración.



Pero, antes de terminar el artículo, diré algunas palabras sobre la instalación y el funcionamiento de los componentes de NetBox.

Algunos matices de la instalación de NetBox


No describiré el proceso de instalación en detalle, es más que famoso en la documentación oficial .

Puede ver el proceso de lanzamiento de la imagen acoplable de NetBox y trabajar en la GUI en el video de Dima Figol ( una y dos veces ) y Emil Garipov .

En general, si sigue estrictamente los pasos de instalación / inicio, todo saldrá bien.
Pero aquí están los matices que puede olvidarse accidentalmente.

  • En el archivo configuration.py, se debe completar el parámetro ALLOWED_HOSTS :
     ALLOWED_HOSTS = ['netbox.linkmeup.ru', 'localhost'] 

    Aquí debe especificar todos los posibles nombres de NetBox a los que accederá, por ejemplo, puede haber una dirección IP externa o 127.0.0.1 o alias DNS.
    Si esto no se hace, el sitio web de NetBox no se abrirá y mostrará 400.
  • En el mismo archivo, se debe especificar SECRET_KEY , que puede inventar usted mismo o generar un script.
  • La página principal mostrará 502 Bad Gateway si algo está mal con la configuración de la base de datos PostgreSQL: verifique el host (si está instalado en otra máquina), puerto, nombre de la base de datos, nombre de usuario, contraseña.
  • Desde hace algún tiempo, NetBox no otorga por defecto ningún derecho de lectura sin autorización.

    Todo esto cambia en la misma configuración.py:

     EXEMPT_VIEW_PERMISSIONS = ['*'] 
  • Y también las solicitudes de API devolverán 200 y no funcionarán si no hay una barra diagonal en la URL de API al final.
     curl -X GET -H "Accept: application/json; indent=4" "http://netbox.linkmeup.ru:45127/api/dcim/devices" 




Un poco sobre PostgreSQL


Para conectarse al servidor:

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

Por ejemplo:

 psql -U netbox -h localhost netbox 

Para mostrar todas las tablas:

 /dt 

Para salir:

 /q 

Para un volcado de base de datos:

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

Si no desea ingresar una contraseña cada vez:

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

Si tiene su propia instalación y no desea hacer todo a mano, simplemente puede hacerlo volcando la base de datos actual de NetBox aquí :

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

Si primero necesita descartar todas las tablas (y tiene que hacer esto), puede preparar el archivo con anticipación:

 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 



Enlaces utiles


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


All Articles