ADSM3. Systèmes IPAM / DCIM

Dans la série ADSM précédente, nous avons développé le cadre d'automatisation, compris pourquoi la virtualisation est apparue et comment elle fonctionne. Dans la dernière partie, nous avons sélectionné et justifié la conception du réseau, les rôles des appareils, des fabricants, décidés du LLD (adressage, routage, nombre de systèmes autonomes).

Nous sommes maintenant prêts à réfléchir à la façon de stocker toute cette montagne d'informations, puis de les récupérer facilement.

Non, bien sûr, il existe aujourd'hui des entreprises qui gardent une trace des adresses IP attribuées dans une feuille de calcul Excel. Mais ce n'est pas notre chemin.

Même pour les bureaux de plus petite taille dans quelques succursales, la présence d'un système de gestion centralisée de l'espace IP ne nuira pas.

La nécessité d'un système d'inventaire est évidente sans un mot.



Tous les numéros de l'ADSM:

0. ADSM. Partie zéro. Planification
1. ADSM. Première partie (qui est après zéro). Virtualisation du réseau
2. ADSM. Deuxième partie. Conception du réseau
3. ADSM. Troisième partie. Système IPAM / DCIM

Je vais consacrer cette question aux systèmes intégrés dans l'automatisation des réseaux - le système de gestion de l'espace d'adressage et le système d'inventaire.

Nous le sélectionnerons et l'installerons, nous traiterons de l'architecture, du schéma de la base de données, des interfaces d'interaction et le remplirons. Et dans les parties suivantes, nous allons commencer à écrire des scripts simples qui automatisent les opérations répétitives, comme l'ajout de nouveaux racks.

De plus, j'ai déjà publié un article séparé sur l' API RESTful , dans lequel j'ai fait un bref examen de ses principes et de son travail, nous en aurons besoin.

Table des matières


  • Architecture du système
  • Schéma de données NetBox
  • Conclusion
  • Quelques nuances d'installation de NetBox
  • Un peu sur PostgreSQL
  • Liens utiles

Aujourd'hui, le marché propose une dizaine d'outils qui mettent en œuvre cette tâche: à la fois payants et Open Source.

Pour les tâches de cette série d'articles, j'ai choisi NetBox pour les raisons suivantes:

  1. C'est gratuit
  2. Il contient les deux parties nécessaires - l'inventaire et la gestion de l'espace IP.
  3. Il a une API RESTful.
  4. Il a été développé par Digital Ocean (et plus particulièrement, aimé de tout le monde Jeremy Stretch) pour lui-même, c'est-à-dire pour les centres de données. Par conséquent, il y a presque tout ce dont vous avez besoin, et presque rien de plus.
  5. Il est activement pris en charge (Slack, Github, Google Newsletters) et est en cours de mise à jour.
  6. C'est open source

Pour les besoins de l'ADSM, j'ai déployé NetBox dans une virtualochka sur notre serveur (merci à Anton Klochkov et Miran ): http://netbox.linkmeup.ru:45127
De plus, j'ai rempli presque toutes les données dont nous aurons besoin à l'avenir.
Par conséquent, vous pouvez essayer presque tous les exemples et étudier le schéma de données en mode lecture jusqu'à ce que vous déployiez votre installation.
Un peu utile avant de commencer:




Architecture du système


  • NetBox est écrit en Python3. Ce qui est bien, car un certain nombre d'autres solutions sont écrites en php et les changer si nécessaire n'est pas si simple.
  • Le cadre du site lui-même est Django.
  • PostgreSQL est utilisé comme base de données.
  • WEB-frontend (service HTTP) - NGINX - il envoie des requêtes par procuration à Gunicron.
  • WSGI - Gunicorn - l'interface entre Nginx et l'application elle-même.
  • Cadre de documentation de l'API - Swagger.
  • Pour diaboliser NetBox - Systemd.

NetBox est un projet jeune et rapide. Par exemple, dans 2.7, ils ont abandonné supervisord et Python 2.7 pour atteindre en faveur de systemd. Il n'y a pas si longtemps, il n'y avait ni mise en cache ni Webhook.

Par conséquent, tout change rapidement et les informations contenues dans l'article peuvent devenir obsolètes au moment de la lecture.

En d'autres termes, tous les composants sont matures et testés.

Selon l'auteur, NetBox ne reflète pas l'état réel du réseau, mais la cible. Par conséquent, rien n'est chargé dans la NetBox à partir du réseau - ce réseau est configuré conformément au contenu de la NetBox.
Ainsi, NetBox agit comme la seule source de vérité (papier calque avec source unique de vérité).

Et les modifications sur le réseau doivent être déclenchées par des modifications de la NetBox.

Et cela correspond très bien à l'idéologie que je professe dans cette série d'articles - si vous voulez faire des changements sur le réseau - faites-les d'abord dans le système.



Schéma de données NetBox


Les deux tâches principales que NetBox résout sont la gestion de l'espace d'adressage et l'inventaire.

NetBox est peu susceptible de devenir le seul système d'inventaire de l'entreprise; il s'agira plutôt d'un système supplémentaire spécifique pour inventorier le réseau, en prenant les données du principal.

Évidemment, dans notre cas, il n'y aura que NetBox à des fins ADSM.
À ce stade, la plupart des données initiales dans NetBox ont déjà été entrées.
Sur ces données, je vais démontrer divers exemples de travail via l'API.
Vous pouvez simplement grimper et voir: netbox.linkmeup.ru : 45127
Et les mêmes données seront nécessaires à l'avenir, lorsque nous passerons à l'automatisation.
De manière générale, le schéma de données peut être vu par le schéma de base de données dans 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 

Caractéristiques de NetBox :

  • Gestion des adresses IP (IPAM) - Préfixes IP, adresses, VRF et VLAN
  • Supports d'équipement - Supports d'équipement organisés par site, groupe et rôle
  • Appareils - Appareils, leurs modèles, rôles, composants et déploiement
  • Connexions - Connexions réseau, console et alimentation entre les appareils
  • Virtualisation - Machines virtuelles et clusters de calcul
  • Circuits de données - Connexions des fournisseurs
  • Secrets - Stockage des informations d'identification de l'utilisateur crypté

Dans cet article, je vais aborder les choses suivantes: DCIM - Gestion de l'infrastructure du centre de données, IPAM - Gestion des adresses IP, Virtualisation, Autres belles choses.



Tout d'abord.

DCIM


La partie la plus importante est sans aucun doute quel équipement nous avons et comment il est connecté les uns aux autres. Mais tout commence là où il en est.

Régions et sites (régions / sites)


Dans le paradigme NetBox, un appareil est installé sur un site, un site appartient à une région, les régions peuvent être imbriquées. Cependant, l'appareil ne peut pas être installé simplement dans la région. S'il y a un tel besoin, un site séparé devrait être créé.

Pour notre cas, cela peut (et ressemblera) à ceci:




Je vous rappelle où et comment nous avons planifié notre réseau: ADSM2. Conception du réseau





Voyons ce que l'API permet.

Voici une liste de toutes les régions:

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

 nb.dcim.regions.all() 

Ci-après, je donnerai des exemples de curl et de pynetbox sans sortir le résultat.
N'oubliez pas la barre oblique à la fin de l'URL - sans elle, cela ne fonctionnera pas.
J'ai expliqué comment utiliser pynetbox dans un article sur l' API RESTful .
Obtenez la liste des sites:

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

 nb.dcim.sites.all() 

Liste des sites dans une région spécifique:

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

Veuillez noter que la recherche n'est pas par nom complet, mais par le soi-disant slug .
Slug est un identifiant contenant uniquement des caractères sûrs: [0-9A-Za-z-_], qui peut être utilisé dans l'URL. Il est défini lors de la création d'un objet, par exemple, «bcn» au lieu de «Barcelone».




Appareils


L'appareil lui-même a un rôle , par exemple, feuille, colonne vertébrale, bord, bordure.

C'est, évidemment, une sorte de modèle d' un fournisseur .
Par exemple, Arista .

Ainsi, un fournisseur est d'abord créé, puis à l'intérieur du modèle.

Le modèle est caractérisé par un nom, un ensemble d'interfaces de service, une interface de télécommande, un port de console et un ensemble de modules d'alimentation.

En plus des commutateurs, des routeurs et des hôtes avec des interfaces Ethernet, vous pouvez créer des serveurs de console.





Obtenez une liste de tous les appareils:

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

 nb.dcim.devices.all() 

Tous les appareils pour un site particulier:

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

Tous les appareils d'un certain modèle

 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) 

Tous les appareils avec un rôle spécifique:

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

L'appareil peut avoir différents statuts: Actif, Hors ligne, Planifié, etc.

Tous les appareils actifs:

 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 prend en charge de nombreux types d' interfaces physiques et de LAG, cependant, tous les virtuels tels que Vlan / IRB et le bouclage sont combinés sous un seul type - virtuel.
Chaque interface est liée à un appareil.

Les interfaces des appareils peuvent être connectées les unes aux autres. Celui-ci sera affiché à la fois dans l'interface et dans les réponses API (attribut connected_endpoint).



L'interface peut être dans différents modes: Tagged ou Access.

En conséquence, il peut être lancé dans la balise avec ou sans VLAN - ce site ou global.

Obtenez une liste de toutes les interfaces des appareils:

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

Obtenez une liste des VLAN d'une interface spécifique.

 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 

Notez qu'ici j'utilise déjà la méthode get au lieu du filtre . Le filtre renvoie une liste, même si le résultat est un seul objet. Get - renvoie un seul objet ou échoue si le résultat de la requête est une liste d'objets.

Par conséquent, get ne doit être utilisé que lorsque vous êtes absolument sûr que le résultat sera en une seule copie.

Ici, juste après la demande, je passe aux attributs de l'objet. Strictement parlant, c'est faux: si rien n'a été trouvé par la requête, alors pynetbox retournera None, et il n'aura pas l'attribut "untagged_vlan".

Et notez également que pynetbox n'attend pas partout une limace, quelque part et un nom.
Découvrez à quelle interface de quel appareil une interface particulière est connectée:

 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 

Découvrez le nom de l'interface de gestion:

 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) 



Ports de console


Les ports de console ne sont pas des interfaces, ils sont donc rendus comme des points de terminaison distincts.
Les ports de périphérique peuvent être associés aux ports de serveur de console.

Découvrez à quel port sur quel serveur de console un périphérique spécifique est connecté.

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

La méthode de sérialisation dans pynetbox vous permet de convertir les attributs d'une instance d'une classe en dictionnaire.


Ipam


VLAN et VRF


Ils peuvent être liés à un emplacement - utile pour le VLAN.

Lors de la création d'un VRF, vous pouvez spécifier si l'espace d'adressage est autorisé à se croiser avec d'autres VRF.

Obtenez une liste de tous les VLAN:

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

 nb.ipam.vlans.all() 

Obtenez une liste de tous les VRF:

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

 nb.ipam.vrfs.all() 



Préfixes IP


Ils ont une structure hiérarchique. Il peut appartenir à n'importe quel VRF (sinon, Global).



NetBox a une représentation visuelle très pratique des préfixes gratuits:



Vous pouvez le sélectionner simplement en cliquant sur la ligne verte.

Il peut être attaché à un emplacement. Vous pouvez sélectionner le prochain sous-préfixe gratuit de la taille requise ou la prochaine adresse IP gratuite via l'API.

La coche / paramètre «Is a pool» détermine si la 0-ème adresse de ce préfixe sera mise en évidence lors de la sélection automatique, ou si elle commencera à partir du 1er.

Obtenez une liste des préfixes IP du site de Malaga avec le rôle Underlay et une longueur 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") 

Obtenez une liste de préfixes gratuits dans la région de la Russie avec le rôle 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() 

Mettez en surbrillance le préfixe gratuit 24 suivant:

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

Lorsque nous devons sélectionner un enfant dans un objet, la méthode POST est utilisée et nous devons spécifier l'ID de l'objet parent - dans ce cas - 40 . Nous l'avons découvert en appelant à partir de l'exemple précédent.
Dans le cas de pynetbox, nous avons d'abord (dans l'exemple précédent) enregistré le résultat dans la variable préfixe , puis nous nous sommes tournés vers son attribut available_prefixes et la méthode create .
Cet exemple ne fonctionnera pas pour vous, car le jeton avec le droit d'écriture est déjà invalide.


Adresses IP


S'il existe un préfixe incluant cette adresse, il en fera partie. Ils peuvent être seuls.
Peut appartenir à n'importe quel VRF ou être dans Global.
Ils peuvent être attachés à l'interface, mais peuvent pendre en l'air.
Vous pouvez sélectionner la prochaine adresse IP libre dans le préfixe.



Pour ce faire, cliquez simplement sur la ligne verte.

Obtenez une liste d'adresses IP pour une interface spécifique:

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

Obtenez une liste de toutes les adresses IP des appareils:

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

Obtenez une liste des adresses IP de préfixe 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() 

Ici encore, vous devez spécifier l'ID du préfixe dans l'URL à partir de laquelle nous sélectionnons l'adresse - cette fois, c'est 28.
Mettez en surbrillance l'adresse IP gratuite suivante dans le préfixe:

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



Virtualisation


Nous nous battons toujours pour le titre de DC moderne. Où sans virtualisation.

NetBox n'a pas l'air et n'est pas un endroit où il vaut la peine de stocker des informations sur les machines virtuelles (vous pouvez même spéculer sur la nécessité d'y stocker des machines physiques). Cependant, cela peut nous être utile, par exemple, vous pouvez entrer des informations sur les réflecteurs de route, les machines de service, telles que NTP, Syslog, les serveurs S-Flow et les machines de contrôle.

La machine virtuelle a sa propre liste d'interfaces - elles sont différentes des interfaces des périphériques physiques et ont leur propre point de terminaison distinct.

Vous pouvez donc lister toutes les machines virtuelles:

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

 nb.virtualization.virtual_machines.all() 

Donc - de toutes les interfaces de toutes les VM:

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

 nb.virtualization.interfaces.all() 

Pour une machine virtuelle, vous ne pouvez pas spécifier l'hyperviseur / la machine physique spécifique sur laquelle elle s'exécute, mais vous pouvez spécifier un cluster. Bien que tout ne soit pas si désespéré. Continuez à lire.



Très belles choses


La fonctionnalité de base de NetBox couvre la plupart des tâches de nombreux utilisateurs, mais pas toutes. Pourtant, le produit a été initialement écrit pour résoudre les problèmes d'une entreprise particulière. Cependant, il se développe activement et les nouvelles versions sortent assez souvent . En conséquence, de nouvelles fonctions apparaissent.

Ainsi, par exemple, depuis ma première installation de NetBox il y a quelques années, des balises y sont apparues, des contextes de configuration, des webhooks, la mise en cache, supervord changé en systemd, un stockage de fichiers externe.

Attention.

Champs personnalisés


Parfois, vous souhaitez ajouter un champ à toute entité dans laquelle vous pouvez placer des données arbitraires.

Par exemple, indiquez le numéro de l'accord d'approvisionnement par lequel le commutateur a été acheté ou le nom de la machine physique sur laquelle la machine virtuelle s'exécute.

C'est là que les champs personnalisés viennent à la rescousse - juste un tel champ avec une valeur de texte qui peut être ajoutée à presque n'importe quelle entité dans NetBox.

Créer des champs personnalisés dans le panneau d'administration



Voici à quoi cela ressemble lors de la modification de l'appareil pour lequel le champ personnalisé a été créé:



Demander une liste d'appareils par valeur 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") 



Contexte de configuration


Parfois, vous voulez quelque chose de plus qu'un texte non structuré. Ensuite, le contexte de configuration vient à la rescousse.

C'est l'occasion d'introduire un ensemble de données structurées au format JSON, qui n'a nulle part ailleurs à mettre.

Il peut s'agir, par exemple, d'un ensemble de communautés BGP ou d'une liste de serveurs Syslog.

Le contexte de configuration peut être local - configuré pour un objet particulier - ou global, lorsqu'il est configuré une fois, puis s'applique à tous les objets qui remplissent certaines conditions (par exemple, situés sur le même site ou s'exécutant sur la même plate-forme).



Le contexte de configuration est automatiquement ajouté aux résultats de la requête. En même temps, les contextes local et mondial se confondent.

Par exemple, pour un appareil juste une simple fille russe, pour laquelle il existe un contexte local, la sortie contiendra la clé "config_context":

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





Balises


Il est difficile de dire quelque chose de nouveau sur les balises. Ils le sont. Ils sont pratiques pour ajouter une fonction. Par exemple, vous pouvez étiqueter les commutateurs «byada» du lot dans lequel la mémoire échoue.



Webhooks


Une chose irremplaçable lorsque vous avez besoin d'autres services pour en savoir plus sur les changements dans NetBox.
Par exemple, lors du démarrage d'un nouveau commutateur, un crochet est envoyé au système d'automatisation, qui démarre le processus de configuration et de mise en service de l'appareil.



Conclusion


Dans cet article, je n'ai pas pour objectif de considérer toutes les fonctionnalités de NetBox, je vais donc vous donner tout le reste. Comprenez, essayez.

De plus, dans le cadre de la construction du système d'automatisation, je ne parlerai que des pièces dont nous avons vraiment besoin.

Donc, ci-dessus, j'ai brièvement parlé de ce qu'est NetBox et de la façon dont les données y sont stockées.

Je répète que j'y ai déjà entré presque toutes les données nécessaires, et vous pouvez faire glisser un vidage de base de données pour vous-même.

Tout est prêt pour la prochaine étape de l'automatisation: écrire un système (ahaha, juste des scripts) pour initialiser les appareils et gérer la configuration.



Mais, avant de terminer l'article, je vais dire quelques mots sur l'installation et le fonctionnement des composants NetBox.

Quelques nuances d'installation de NetBox


Je ne décrirai pas le processus d'installation en détail - il est plus que célèbre décrit dans la documentation officielle .

Vous pouvez regarder le processus de lancement de l'image docker NetBox et de travailler dans l'interface graphique dans la vidéo de Dima Figol ( une et deux fois ) et Emil Garipov .

En général, si vous suivez strictement les étapes d'installation / démarrage, tout se passera bien.
Mais voici les nuances que vous pouvez oublier accidentellement.

  • Dans le fichier configuration.py, le paramètre ALLOWED_HOSTS doit être renseigné:
     ALLOWED_HOSTS = ['netbox.linkmeup.ru', 'localhost'] 

    Ici, vous devez spécifier tous les noms de NetBox possibles auxquels vous accéderez, par exemple, il peut y avoir une adresse IP externe ou 127.0.0.1 ou un alias DNS.
    Si cela n'est pas fait, le site Web NetBox ne s'ouvrira pas et affichera 400.
  • Dans le même fichier, SECRET_KEY doit être spécifié, que vous pouvez inventer vous-même ou générer un script.
  • La page principale affichera 502 Bad Gateway si quelque chose ne va pas avec la configuration de la base de données PostgreSQL: vérifiez l'hôte (s'il est installé sur une autre machine), le port, le nom de la base de données, le nom d'utilisateur, le mot de passe.
  • Depuis quelque temps, NetBox n'accorde par défaut aucun droit de lecture sans autorisation.

    Tout cela change dans la même configuration.py:

     EXEMPT_VIEW_PERMISSIONS = ['*'] 
  • Et les demandes d'API renverront également 200 et ne fonctionneront pas s'il n'y a pas de barre oblique dans l'URL d'API à la fin.
     curl -X GET -H "Accept: application/json; indent=4" "http://netbox.linkmeup.ru:45127/api/dcim/devices" 




Un peu sur PostgreSQL


Pour vous connecter au serveur:

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

Par exemple:

 psql -U netbox -h localhost netbox 

Pour afficher tous les tableaux:

 /dt 

Pour quitter:

 /q 

Pour un vidage de base de données:

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

Si vous ne souhaitez pas saisir de mot de passe à chaque fois:

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

Si vous avez votre propre installation et que vous ne voulez pas tout faire à la main, vous pouvez simplement le faire en effectuant un vidage de la base de données NetBox actuelle ici :

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

Si vous devez d'abord supprimer toutes les tables (et vous devez le faire), vous pouvez préparer le fichier à l'avance:

 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 



Liens utiles


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


All Articles