ADSM3. IPAM / DCIM-Systeme

In der vorherigen ADSM-Serie haben wir das Automatisierungsframework entwickelt und herausgefunden, warum die Virtualisierung angezeigt wird und wie sie funktioniert. Im letzten Teil haben wir das Netzwerkdesign, die Rollen der Geräte und Hersteller ausgewählt und begründet und uns für LLD entschieden (Adressierung, Routing, Anzahl autonomer Systeme).

Jetzt sind wir bereit zu überlegen, wie wir diesen ganzen Berg an Informationen speichern und später bequem abrufen können.

Nein, natürlich gibt es heutzutage Unternehmen, die die zugewiesenen IP-Adressen in einer Excel-Tabelle nachverfolgen. Das ist aber nicht unser Weg.

Selbst für das kleinste Büro in einigen Filialen schadet das Vorhandensein eines zentralen IP-Space-Management-Systems nicht.

Die Notwendigkeit eines Inventarsystems liegt auf der Hand.



Alle Ausgaben von ADSM:

0. ADSM. Teil Null. Planung
1. ADSM. Teil Eins (der nach Null ist). Netzwerkvirtualisierung
2. ADSM. Zweiter Teil. Netzwerkdesign
3. ADSM. Dritter Teil. IPAM / DCIM-System

Diese Ausgabe widme ich den integralen Systemen in der Netzwerkautomatisierung - dem Adressraum-Managementsystem und dem Inventarsystem.

Wir werden es auswählen und installieren, wir werden uns mit der Architektur, dem Datenbankschema, den Interaktionsschnittstellen befassen und es füllen. In den folgenden Abschnitten werden einfache Skripts geschrieben, die sich wiederholende Vorgänge automatisieren, z. B. das Hinzufügen neuer Racks.

Darüber hinaus habe ich bereits einen separaten Artikel über die RESTful-API veröffentlicht , in dem ich einen kurzen Überblick über ihre Prinzipien und ihre Arbeit gegeben habe. Wir werden sie brauchen.

Inhalt


  • Systemarchitektur
  • NetBox-Datenschema
  • Fazit
  • Einige Nuancen der Installation von NetBox
  • Ein bisschen über PostgreSQL
  • Nützliche Links

Heute bietet der Markt rund ein Dutzend Tools an, die diese Aufgabe erfüllen: sowohl kostenpflichtige als auch Open Source-Tools.

Für die Aufgaben in dieser Artikelserie habe ich mich aus folgenden Gründen für NetBox entschieden:

  1. Es ist kostenlos
  2. Es enthält beide notwendigen Teile - Inventar und IP-Speicherverwaltung.
  3. Es hat eine RESTful API.
  4. Es wurde von Digital Ocean (und insbesondere von Jeremy Stretch geliebt) für sich selbst, dh für Rechenzentren, entwickelt. Daher gibt es fast alles, was Sie brauchen, und fast nichts mehr.
  5. Es wird aktiv unterstützt (Slack, Github, Google Newsletters) und aktualisiert.
  6. Das ist Open Source

Für die Anforderungen von ADSM habe ich NetBox in einer Virtualochka auf unserem Server bereitgestellt (danke an Anton Klochkov und Miran ): http://netbox.linkmeup.ru:45127
Außerdem habe ich fast alle Daten ausgefüllt, die wir in Zukunft benötigen.
Daher können Sie fast alle Beispiele ausprobieren und das Datenschema im Lesemodus untersuchen, bis Sie Ihre Installation bereitstellen.
Ein wenig nützlich, bevor Sie anfangen:




Systemarchitektur


  • NetBox ist in Python3 geschrieben. Was gut ist, weil eine Reihe anderer Lösungen in PHP geschrieben sind und diese bei Bedarf nicht so einfach zu ändern sind.
  • Der Rahmen für die Website selbst ist Django.
  • Als Datenbank wird PostgreSQL verwendet.
  • WEB-Frontend (HTTP-Service) - NGINX - Proxy für Anfragen an Gunicron.
  • WSGI - Gunicorn - die Schnittstelle zwischen Nginx und der Anwendung selbst.
  • API-Dokumentations-Framework - Swagger.
  • NetBox - Systemd verteufeln.

NetBox ist ein junges und schnelles Projekt. In 2.7 haben sie beispielsweise supervisord und Python 2.7 aufgegeben und zugunsten von systemd danach gegriffen. Vor nicht allzu langer Zeit gab es weder Caching noch Webhooks.

Daher ändert sich alles schnell und die Informationen im Artikel können zum Zeitpunkt des Lesens veraltet sein.

Mit anderen Worten, alle Komponenten sind ausgereift und getestet.

Laut dem Autor spiegelt NetBox nicht den tatsächlichen Zustand des Netzwerks wider, sondern das Ziel. Aus diesem Grund wird aus dem Netzwerk nichts in die NetBox geladen - dieses Netzwerk wird entsprechend dem Inhalt der NetBox konfiguriert.
Somit fungiert NetBox als einzige Wahrheitsquelle (Transparentpapier mit einer einzigen Wahrheitsquelle).

Und Änderungen im Netzwerk müssen durch Änderungen an der NetBox ausgelöst werden.

Und es passt sehr gut zu der Ideologie, die ich in dieser Artikelserie bekenne - wenn Sie Änderungen im Netzwerk vornehmen möchten -, nehmen Sie sie zuerst im System vor.



NetBox-Datenschema


Die beiden Hauptaufgaben, die NetBox löst, sind Adressraumverwaltung und Inventarisierung.

Es ist unwahrscheinlich, dass NetBox das einzige Inventarsystem im Unternehmen wird, sondern ein spezielles zusätzliches System zur Inventarisierung des Netzwerks, das Daten aus dem Hauptnetzwerk entnimmt.

In unserem Fall wird es natürlich nur NetBox für ADSM-Zwecke geben.
Zu diesem Zeitpunkt wurden die meisten anfänglichen Daten in NetBox bereits eingegeben.
Anhand dieser Daten zeige ich verschiedene Beispiele für die Arbeit mit der API.
Sie können einfach klettern und sehen: netbox.linkmeup.ru : 45127
Und die gleichen Daten werden in Zukunft benötigt, wenn wir zur Automatisierung übergehen.
Im Allgemeinen kann das Datenschema vom Datenbankschema in Postgres eingesehen werden.

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 

NetBox-Funktionen :

  • IP-Adressverwaltung (IPAM) - IP-Präfixe, Adressen, VRFs und VLANs
  • Geräteracks - Geräteracks, sortiert nach Standort, Gruppe und Rolle
  • Geräte - Geräte, ihre Modelle, Rollen, Komponenten und Bereitstellung
  • Verbindungen - Netzwerk-, Konsolen- und Stromverbindungen zwischen Geräten
  • Virtualisierung - Virtuelle Maschinen und Computing-Cluster
  • Datenleitungen - Provider-Verbindungen
  • Geheimnisse - Speicherung von verschlüsselten Benutzeranmeldeinformationen

In diesem Artikel werde ich auf die folgenden Dinge eingehen: DCIM - Verwaltung der Rechenzentrumsinfrastruktur, IPAM - Verwaltung der IP-Adressen, Virtualisierung, Weitere nützliche Dinge.



Das Wichtigste zuerst.

DCIM


Der wichtigste Teil ist zweifellos, welche Ausrüstung wir haben und wie sie miteinander verbunden ist. Aber alles beginnt dort, wo es steht.

Regionen und Standorte (Regionen / Standorte)


Im NetBox-Paradigma wird ein Gerät auf einem Standort installiert, ein Standort gehört zu einer Region, Regionen können verschachtelt werden. Das Gerät kann jedoch nicht einfach in der Region installiert werden. Wenn dies erforderlich ist, sollte ein separater Standort eingerichtet werden.

In unserem Fall kann (und wird) dies so aussehen:




Ich erinnere Sie daran, wo und wie wir unser Netzwerk geplant haben: ADSM2. Netzwerkdesign





Mal sehen, was die API erlaubt.

Hier ist eine Liste aller Regionen:

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

 nb.dcim.regions.all() 

Im Folgenden werde ich Beispiele für Curl und Pynetbox geben, ohne das Ergebnis auszugeben.
Vergessen Sie nicht den Schrägstrich am Ende der URL. Ohne diesen funktioniert es nicht.
Ich habe in einem Artikel über die RESTful-API über die Verwendung von pynetbox gesprochen.
Holen Sie sich die Liste der Websites:

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

 nb.dcim.sites.all() 

Liste der Standorte in einer bestimmten Region:

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

Bitte beachten Sie, dass die Suche nicht nach dem vollständigen Namen, sondern nach der sogenannten Schnecke erfolgt .
Slug ist eine Kennung, die nur sichere Zeichen enthält: [0-9A-Za-z-_], die in der URL verwendet werden können. Es wird festgelegt, wenn ein Objekt erstellt wird, z. B. "bcn" anstelle von "Barcelona".




Geräte


Das Gerät selbst hat eine Rolle , zum Beispiel Blatt, Rücken, Kante, Rand.

Es ist offensichtlich eine Art Modell eines Anbieters .
Zum Beispiel Arista .

Auf diese Weise wird zuerst ein Kreditor erstellt und dann innerhalb des Modells.

Das Modell ist durch einen Namen, eine Reihe von Serviceschnittstellen, eine Fernsteuerungsschnittstelle, einen Konsolenport und eine Reihe von Leistungsmodulen gekennzeichnet.

Zusätzlich zu Switches, Routern und Hosts mit Ethernet-Schnittstellen können Sie Konsolenserver erstellen.





Liste aller Geräte abrufen:

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

 nb.dcim.devices.all() 

Alle Geräte für einen bestimmten Standort:

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

Alle Geräte eines bestimmten Modells

 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) 

Alle Geräte mit einer bestimmten Rolle:

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

Das Gerät kann sich in verschiedenen Status befinden: Aktiv, Offline, Geplant usw.

Alle aktiven Geräte:

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



Schnittstellen


NetBox unterstützt viele Arten von physischen Schnittstellen und LAGs. Alle virtuellen Schnittstellen wie Vlan / IRB und Loopback werden jedoch unter einem Typ zusammengefasst: Virtuell.
Jede Schnittstelle ist an ein Gerät gebunden.

Geräteschnittstellen können miteinander verbunden werden. Dies wird sowohl in der Schnittstelle als auch in den API-Antworten (Attribut connected_endpoint) angezeigt.



Die Schnittstelle kann in verschiedenen Modi betrieben werden: Tagged oder Access.

Dementsprechend kann es mit oder ohne VLANs in das Tag gestartet werden - diese Site oder global.

Liste aller Geräteschnittstellen abrufen:

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

Ruft eine Liste der VLANs einer bestimmten Schnittstelle ab.

 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 

Beachten Sie, dass ich hier bereits die Methode get anstelle von filter verwende . Filter gibt eine Liste zurück, auch wenn das Ergebnis ein einzelnes Objekt ist. Get - Gibt ein einzelnes Objekt zurück oder schlägt fehl, wenn das Abfrageergebnis eine Liste von Objekten ist.

Daher sollte get nur verwendet werden, wenn Sie absolut sicher sind, dass das Ergebnis in einer einzelnen Kopie vorliegt.

Hier wende ich mich direkt nach der Anfrage den Attributen des Objekts zu. Streng genommen ist dies falsch: Wenn durch die Anfrage nichts gefunden wurde, gibt pynetbox None zurück und hat nicht das Attribut "untagged_vlan".

Und beachten Sie auch, dass Pynetbox nicht überall irgendwo Schnecke und Namen erwartet.
Finden Sie heraus, an welche Schnittstelle von welchem ​​Gerät eine bestimmte Schnittstelle angeschlossen ist:

 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 

Ermitteln Sie den Namen der Verwaltungsschnittstelle:

 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) 



Konsolenports


Konsolenports sind keine Schnittstellen, daher werden sie als separate Endpunkte gerendert.
Geräteports können Konsolenserverports zugeordnet werden.

Finden Sie heraus, an welchem ​​Port auf welchem ​​Konsolenserver ein bestimmtes Gerät angeschlossen ist.

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

Mit der Methode serialize in pynetbox können Sie die Attribute einer Instanz einer Klasse in ein Wörterbuch konvertieren.


Ipam


VLAN und VRF


Sie können an einen Ort gebunden werden - nützlich für VLAN.

Beim Erstellen einer VRF können Sie angeben, ob sich der Adressraum mit anderen VRFs überschneiden darf.

Liste aller VLANs abrufen:

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

 nb.ipam.vlans.all() 

Liste aller VRFs abrufen:

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

 nb.ipam.vrfs.all() 



IP-Präfixe


Sie haben eine hierarchische Struktur. Es kann zu jedem VRF gehören (wenn nicht, dann Global).



NetBox bietet eine sehr praktische visuelle Darstellung der freien Präfixe:



Sie können es einfach auswählen, indem Sie auf die grüne Linie klicken.

Es kann an einen Ort angehängt werden. Sie können das nächste freie Unterpräfix der erforderlichen Größe oder die nächste freie IP-Adresse über die API auswählen.

Das Häkchen / der Parameter „Ist ein Pool“ legt fest, ob die 0-te Adresse aus diesem Präfix bei der automatischen Auswahl hervorgehoben wird oder ab dem 1. beginnt.

Erhalten Sie eine Liste der IP-Präfixe der Malaga-Site mit der Unterlegungsrolle und einer Länge von 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") 

Erhalten Sie eine Liste der kostenlosen Präfixe in der Region Russland mit der Rolle "Unterlegen":

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

 prefix.available_prefixes.list() 

Markieren Sie das folgende kostenlose 24-Präfix:

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

Wenn wir ein Kind in einem Objekt auswählen müssen, wird die POST-Methode verwendet und wir müssen die ID des übergeordneten Objekts angeben - in diesem Fall - 40 . Wir haben das durch einen Aufruf aus dem vorherigen Beispiel herausgefunden.
Im Fall von pynetbox haben wir zuerst (im vorherigen Beispiel) das Ergebnis in der Präfixvariablen gespeichert und dann das Attribut available_prefixes und die Methode create verwendet.
Dieses Beispiel funktioniert nicht für Sie, da das Token mit dem Schreibrecht bereits ungültig ist.


IP-Adressen


Wenn es ein Präfix mit dieser Adresse gibt, sind sie Teil davon. Sie können alleine sein.
Kann jeder VRF angehören oder in Global sein.
Sie können an der Schnittstelle angebracht werden, können aber in der Luft hängen.
Sie können die nächste freie IP-Adresse im Präfix auswählen.



Klicken Sie dazu einfach auf die grüne Linie.

Rufen Sie eine Liste der IP-Adressen für eine bestimmte Schnittstelle ab:

 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) 

Oder:

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

Rufen Sie eine Liste aller Geräte-IP-Adressen ab:

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

Rufen Sie eine Liste der verfügbaren Präfix-IP-Adressen ab:

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

Auch hier müssen Sie die ID des Präfixes in der URL angeben, aus der wir die Adresse auswählen - diesmal ist es 28.
Markieren Sie die folgende freie IP-Adresse im Präfix:

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



Virtualisierung


Wir kämpfen immer noch um den Titel eines modernen DC. Wo ohne Virtualisierung.

NetBox sieht nicht so aus und ist kein Ort, an dem es sich lohnt, Informationen über virtuelle Maschinen zu speichern (Sie können sogar über die Notwendigkeit spekulieren, physische Maschinen darin zu speichern). Dies kann sich jedoch als nützlich für uns herausstellen. Sie können beispielsweise Informationen zu Route Reflectors, Servicemaschinen wie NTP, Syslog, S-Flow-Servern und Steuerungsmaschinen eingeben.

Die VM verfügt über eine eigene Liste von Schnittstellen - sie unterscheiden sich von den Schnittstellen physischer Geräte und haben einen eigenen separaten Endpunkt.

So können Sie alle virtuellen Maschinen auflisten:

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

 nb.virtualization.virtual_machines.all() 

Also - von allen Schnittstellen aller VMs:

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

 nb.virtualization.interfaces.all() 

Für eine VM können Sie nicht den spezifischen Hypervisor / physischen Computer angeben, auf dem sie ausgeführt wird, aber Sie können einen Cluster angeben. Obwohl nicht alles so hoffnungslos ist. Lesen Sie weiter.



Extra nettes Zeug


Die Grundfunktionalität von NetBox deckt die meisten Aufgaben vieler Benutzer ab, jedoch nicht alle. Dennoch wurde das Produkt ursprünglich geschrieben, um die Probleme eines bestimmten Unternehmens zu lösen. Es wird jedoch aktiv weiterentwickelt und es erscheinen ziemlich oft neue Releases. Dementsprechend erscheinen neue Funktionen.

Zum Beispiel sind seit meiner ersten Installation von NetBox vor ein paar Jahren Tags darin erschienen, Konfigurationskontexte, Webhooks, Caching, Supervisord wurden in systemd geändert, externer Dateispeicher.

Pass auf.

Benutzerdefinierte Felder


Manchmal möchten Sie jedem Objekt ein Feld hinzufügen, in das Sie beliebige Daten einfügen können.

Geben Sie beispielsweise die Nummer der Liefervereinbarung an, mit der der Switch gekauft wurde, oder den Namen der physischen Maschine, auf der die VM ausgeführt wird.

Hier kommen benutzerdefinierte Felder zum Einsatz - ein solches Feld mit einem Textwert, der zu fast jeder Entität in NetBox hinzugefügt werden kann.

Erstellen Sie benutzerdefinierte Felder im Admin-Bereich



So sieht es aus, wenn Sie das Gerät bearbeiten, für das das benutzerdefinierte Feld erstellt wurde:



Fordern Sie eine Liste der Geräte mit dem Wert custom_field an

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



Konfigurationskontext


Manchmal möchten Sie mehr als nur unstrukturierten Text. Dann kommt der Konfigurationskontext zur Rettung.

Dies ist eine Gelegenheit, einen Satz strukturierter Daten im JSON-Format einzuführen, der nirgendwo anders zu platzieren ist.

Dies kann beispielsweise eine Reihe von BGP-Communities oder eine Liste von Syslog-Servern sein.

Der Konfigurationskontext kann lokal (für ein bestimmtes Objekt konfiguriert) oder global (bei einmaliger Konfiguration) sein und dann auf alle Objekte angewendet werden, die bestimmte Bedingungen erfüllen (z. B. auf derselben Site oder auf derselben Plattform ausgeführt).



Der Konfigurationskontext wird automatisch zu den Abfrageergebnissen hinzugefügt. Gleichzeitig verschmelzen lokale und globale Kontexte zu einem.

Beispielsweise enthält die Ausgabe für ein Gerät, das nur ein einfaches russisches Mädchen ist und für das es einen lokalen Kontext gibt, den Schlüssel „config_context“:

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





Tags


Es ist schwer, etwas Neues über Tags zu sagen. Sie sind. Sie eignen sich zum Hinzufügen beliebiger Funktionen. Beispielsweise können Sie "byada" -Schalter aus dem Stapel markieren, in dem der Speicher ausfällt.



Webhooks


Eine unersetzliche Sache, wenn Sie andere Dienste benötigen, um sich über Änderungen in NetBox zu informieren.
Wenn Sie beispielsweise einen neuen Switch starten, wird ein Hook an das Automatisierungssystem gesendet, der den Prozess des Einrichtens und der Inbetriebnahme des Geräts startet.



Fazit


In diesem Artikel möchte ich nicht alle Funktionen von NetBox berücksichtigen, daher werde ich Ihnen alles Weitere geben. Verstehe, versuche es.

Darüber hinaus werde ich im Rahmen des Aufbaus des Automatisierungssystems nur die Teile ansprechen, die wir wirklich benötigen.

Deshalb habe ich oben kurz darüber gesprochen, was NetBox ist und wie Daten darin gespeichert werden.

Ich wiederhole, dass ich dort bereits fast alle erforderlichen Daten eingegeben habe und Sie einen Datenbank-Dump für sich selbst ziehen können.

Alles ist bereit für die nächste Stufe der Automatisierung: Schreiben eines Systems (ahaha, nur Skripte), um die Geräte zu initialisieren und die Konfiguration zu verwalten.



Bevor ich den Artikel abschließe, möchte ich noch ein paar Worte zur Installation und zum Betrieb von NetBox-Komponenten sagen.

Einige Nuancen der Installation von NetBox


Ich werde den Installationsprozess nicht im Detail beschreiben - er ist mehr als berühmt in der offiziellen Dokumentation .

Im Video von Dima Figol ( ein- und zweimal ) und Emil Garipov können Sie sehen, wie das NetBox-Docker-Image gestartet und in der GUI gearbeitet wird.

Wenn Sie die Installations- / Startschritte genau befolgen, funktioniert im Allgemeinen alles.
Aber hier sind die Nuancen, die Sie versehentlich vergessen können.

  • In der Datei configuration.py muss der Parameter ALLOWED_HOSTS gefüllt sein:
     ALLOWED_HOSTS = ['netbox.linkmeup.ru', 'localhost'] 

    Hier müssen Sie alle möglichen NetBox-Namen angeben, auf die Sie zugreifen möchten. Es kann sich beispielsweise um eine externe IP-Adresse oder einen 127.0.0.1- oder DNS-Alias ​​handeln.
    Andernfalls wird die NetBox-Website nicht geöffnet und 400 angezeigt.
  • In derselben Datei muss SECRET_KEY angegeben werden, den Sie selbst erfinden oder ein Skript generieren können.
  • Auf der Hauptseite wird 502 Bad Gateway angezeigt, wenn beim Einrichten der PostgreSQL-Datenbank ein Fehler auftritt: Überprüfen Sie den Host (falls auf einem anderen Computer installiert), den Port, den Datenbanknamen, den Benutzernamen und das Kennwort.
  • NetBox gewährt seit einiger Zeit standardmäßig keine Leserechte mehr ohne Berechtigung.

    Dies alles ändert sich in der gleichen configuration.py:

     EXEMPT_VIEW_PERMISSIONS = ['*'] 
  • Außerdem geben API-Anforderungen 200 zurück und funktionieren nicht, wenn die API-URL am Ende keinen Schrägstrich enthält.
     curl -X GET -H "Accept: application/json; indent=4" "http://netbox.linkmeup.ru:45127/api/dcim/devices" 




Ein bisschen über PostgreSQL


So stellen Sie eine Verbindung zum Server her:

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

Zum Beispiel:

 psql -U netbox -h localhost netbox 

So zeigen Sie alle Tabellen an:

 /dt 

So beenden Sie:

 /q 

Für einen Datenbankspeicherauszug:

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

Wenn Sie nicht jedes Mal ein Passwort eingeben möchten:

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

Wenn Sie eine eigene Installation haben und nicht alles von Hand machen möchten, können Sie dies einfach tun, indem Sie hier einen Speicherauszug der aktuellen NetBox-Datenbank erstellen:

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

Wenn Sie zuerst alle Tabellen löschen müssen (und Sie müssen dies tun), können Sie die Datei im Voraus vorbereiten:

 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 



Nützliche Links


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


All Articles