lae.netbox
:role-auteur: lae :role-nom: netbox :role: {role-auteur}.{role-nom} :gh-nom: {role-auteur}/ansible-role-{role-nom} :netbox-version: 3.7.3 = {role} :toc: :toc-placement: préambule ifdef::env-github[] :caption-astuce: :ampoule: :caption-avertissement: :avertissement: endif::[]
ifdef::env-github[] image:https://img.shields.io/badge/role-{role}-blue?style=for-the-badge[Rôle Ansible Galaxy,link=https://galaxy.ansible.com/{role-auteur}/{role-nom}] endif::env-github[]
Déploie et configure https://github.com/netbox-community/netbox[NetBox], un outil de gestion d'adresses IP (IPAM) et de gestion d'infrastructures de centre de données (DCIM).
Ce rôle déploiera NetBox dans son propre environnement virtuel soit par un fichier d'archive de version, soit via git en utilisant uWSGI comme serveur d'application.
Prend en charge CentOS 7, 8 / RHEL 9 / Debian 9, 10, 11, 12 / Ubuntu 16, 18, 20 et 22.
Notez que ce rôle a quelques particularités et diffère des instructions d'installation de la documentation de NetBox. Les principales différences sont :
- Utilise systemd fourni par la distribution au lieu de supervisord
- Utilise uWSGI comme serveur d'application au lieu de gunicorn
- Renforce le service NetBox/uWSGI (voir
templates/netbox.service.j2
) - Effectue un rechargement à chaud lors des mises à jour et des modifications de configuration
== Démarrage rapide
Si vous avez Ansible installé et que vous utilisez les valeurs par défaut :
[source,bash,subs="attributes"]
ansible-galaxy install geerlingguy.postgresql davidwittman.redis {role} ansible-galaxy collection install community.postgresql ansible-playbook -i votre.serveur.fqdn, ~/.ansible/roles/{role}/examples/playbook_single_host_deploy.yml -K
Cela déploiera NetBox et PostgreSQL sur votre.serveur.fqdn
; une fois terminé, il devrait être accessible sur le port 80. Modifiez si nécessaire. Lisez ci-dessous pour plus d'informations.
Vous pouvez également utiliser Vagrant, si vous le souhaitez, pour lancer NetBox à localhost:8080
:
[source,bash,subs="attributes"]
ansible-galaxy install geerlingguy.postgresql davidwittman.redis {role} ansible-galaxy collection install community.postgresql cd ~/.ansible/roles/{role}/ vagrant up
== Support/Contribution
Si vous souhaitez contribuer à ce rôle, veuillez lire DEVELOPING.md
pour
le flux de travail de ce dépôt et des instructions (optionnelles) pour mettre en place un
environnement de développement. Ce rôle utilise le rôle lae.travis-lxc
lors des tests
sous Travis CI, dont vous trouverez les définitions dans le répertoire tests/
.
ifeval::["{role-auteur}" == "lae"] Pour du soutien ou si vous voulez contribuer à ce rôle mais que vous avez besoin de conseils, n'hésitez pas à demander sur le serveur Discord de @lae : https://discord.gg/cjqr6Fg
endif::[] == Prérequis
=== PostgreSQL
Ce rôle ne configure pas un serveur PostgreSQL (mais créera une base de données si nécessaire), donc vous devrez mettre en place un serveur PostgreSQL et créer un utilisateur de base de données séparément de ce rôle. Consultez la section Exemple de Playbook.
De plus, pour Ansible 2.10+, vous devrez peut-être installer la collection community.postgresql
.
Il est recommandé de spécifier ceci dans le fichier requirements.yml
de votre playbook.
Par exemple :
[source,yaml]
collections:
- name: community.postgresql version: 3.4.0
AVERTISSEMENT : NetBox v2.2.0+ nécessite au minimum PostgreSQL 9.4, qui peut ne pas être disponible dans les dépôts de votre distribution. Vous voudrez peut-être utiliser un rôle pour cela.
=== Redis
Ce rôle ne configure pas ni ne gère une instance Redis. Vous pouvez soit
installer redis-server
via une tâche dans pre_tasks
dans votre playbook, soit utiliser un
rôle d'installation Redis tel que
https://galaxy.ansible.com/davidwittman/redis[DavidWittman.redis].
AVERTISSEMENT : NetBox v2.9.0+ nécessite Redis 4.0 au minimum. Le rôle suggéré ci-dessus par défaut à une version 2.8, donc assurez-vous de spécifier une version plus récente dans une variable de rôle ou de déployer Redis 4.0+ d'une autre manière.
== Variables du Rôle
ASTUCE : Consultez examples/
pour quelques playbooks que vous pourriez écrire pour différents scénarios.
AVERTISSEMENT : Quelques variables de rôle sont obligatoires. Cherchez les requises en gras ci-dessous.
[source,yaml]
netbox_stable: false netbox_git: false
Il est obligatoire de définir l'une des variables ci-dessus sur true
. netbox_stable
indique au rôle de déployer en extrayant les versions tarball depuis GitHub, tandis que
netbox_git
indique au rôle de cloner un dépôt git NetBox - elles sont mutuellement exclusives.
[source,yaml,subs="attributes"]
netbox_stable_version: {netbox-version} netbox_stable_uri: "https://github.com/netbox-community/netbox/archive/v{{ netbox_stable_version }}.tar.gz"
Celles-ci peuvent être configurées pour figer une version (par exemple incrémenter pour déclencher une mise à jour) ou déployer à l'aide d'un tarball situé ailleurs. Utiles lorsque vous avez besoin de modifier quelque chose dans une version ou que vous déployez localement derrière un pare-feu.
[source,yaml]
netbox_git_version: develop netbox_git_uri: "https://github.com/netbox-community/netbox.git"
netbox_git_version
peut être n'importe quelle référence valide dans un dépôt git.
netbox_git_uri
peut être utilisé pour pointer vers par exemple un dépôt sur site ou un fork.
[source,yaml]
netbox_superuser_enabled: true netbox_superuser_username: admin #netbox_superuser_password: changeme netbox_superuser_email: admin@localhost netbox_superuser_create_token: false
Ces variables sont utilisées pour configurer un compte super utilisateur local. Désactivez ceci
si vous ne souhaitez pas en créer un (lors de l'utilisation de LDAP par exemple - bien qu'avoir un
super utilisateur local puisse toujours être avantageux dans ce cas). Lorsqu'il est activé, il est
obligatoire de définir le mot de passe du super utilisateur. Ce rôle créera un nouveau super utilisateur
si l'utilisateur n'existe pas, ou modifiera un utilisateur existant s'il n'est pas un
super utilisateur/si son email ou son mot de passe sont différents. (Oui, vous pouvez l'utiliser pour réinitialiser
le mot de passe de votre super utilisateur si vous l'oubliez.) netbox_superuser_create_token
peut
être utilisé pour générer un jeton API aléatoire pour le super utilisateur, si nécessaire.
[source,yaml]
netbox_database: netbox netbox_database_user: netbox #netbox_database_password: changeme #netbox_database_host: localhost netbox_database_port: 5432 #netbox_database_socket: /var/run/postgresql
Il est obligatoire de configurer soit un répertoire de socket (pour communiquer via des sockets UNIX) soit un hôte/mot de passe (pour utiliser TCP/IP). Voir la section Exemple de Playbook pour plus d'informations sur la configuration de la base de données.
Notez que celles-ci sont utilisées pour configurer DATABASE
dans configuration.py
.
[source,yaml]
netbox_database_conn_age: 300
Pour configurer NetBox pour garder les connexions à la base de données ouvertes plus longtemps qu'une seule requête,
définissez netbox_database_conn_age
sur votre durée maximale préférée, en secondes.
300 secondes (5 minutes) est généralement un bon nombre pour commencer.
[source,yaml]
netbox_database_maintenance: postgres
Si la base de données postgres est configurée pour n'autoriser l'accès qu'à certaines tables de la DB pour l'utilisateur configuré avec NetBox, vous pouvez définir netbox_database_maintenance
pour remplacer la base de données par défaut utilisée pour la vérification de connexion par une table différente de la table par défaut postgres
. C'est une table vide dans chaque base de données postgres par défaut, mais certaines configurations pourraient bloquer l'accès à cette table, donc une table différente (c'est-à-dire netbox_prod
) peut être utilisée ici à la place.
[source,yaml]
Exemple d'utilisation, par défaut est dict vide
netbox_database_options: sslmode: require isolation_level: 3
Si vous devez définir d'autres mots clés de paramètres PostgreSQL, vous pouvez le faire ici. Pour des cas comme https://docs.djangoproject.com/en/3.1/ref/databases/#isolation-level[niveaux d'isolation], la valeur numérique doit être utilisée
au lieu de la constante :
psycopg2.extensions.ISOLATION_LEVEL_SERIALIZABLE
contre 3
.
N'ajoutez des choses ici que si vous savez vraiment ce que vous faites.
[source,yaml]
netbox_redis_host: 127.0.0.1 netbox_redis_port: 6379 netbox_redis_password: '' netbox_redis_database: 0 netbox_redis_default_timeout: 300 netbox_redis_ssl_enabled: false netbox_redis_insecure_skip_tls_verify: false
netbox_redis_cache_host: "{{ netbox_redis_host }}" netbox_redis_cache_port: "{{ netbox_redis_port }}" netbox_redis_cache_database: 1 netbox_redis_cache_password: "{{ netbox_redis_password }}" netbox_redis_cache_default_timeout: "{{ netbox_redis_default_timeout }}" netbox_redis_cache_ssl_enabled: "{{ netbox_redis_ssl_enabled }}" netbox_redis_cache_insecure_skip_tls_verify: "{{ netbox_redis_insecure_skip_tls_verify }}"
Ceci remplit le dictionnaire de configuration REDIS
dans configuration.py
. Utilisez le
deuxième ensemble de variables si vous souhaitez séparer votre base de données de cache de votre
base de données de webhooks.
[source,yaml]
netbox_redis_sentinels:
- { host: '192.168.0.1', port: '5000' },
- { host: '192.168.0.2', port: '5000' } netbox_redis_sentinel_service: 'netbox' netbox_redis_password: '' netbox_redis_database: 0 netbox_redis_default_timeout: 300 netbox_redis_ssl_enabled: false
netbox_redis_cache_sentinels: "{{ netbox_redis_sentinels }}" netbox_redis_cache_sentinel_service: "{{ netbox_redis_sentinel_service }}" netbox_redis_cache_database: 1 netbox_redis_cache_password: "{{ netbox_redis_password }}" netbox_redis_cache_default_timeout: "{{ netbox_redis_default_timeout }}" netbox_redis_cache_ssl_enabled: "{{ netbox_redis_ssl_enabled }}"
Utilisez cette syntaxe si votre Redis est installé avec une architecture de sentinelles (plusieurs nœuds). Utilisez le deuxième ensemble de variables si vous souhaitez séparer votre base de données de cache de votre base de données de webhooks.
[source,yaml]
netbox_rqworker_processes: 1
Précisez combien de travailleurs de file d'attente de requêtes doivent être lancés par le service systemd. Vous pouvez laisser cela à la valeur par défaut de 1, sauf si vous avez un grand nombre de rapports, de scripts et d'autres tâches en arrière-plan.
[source,yaml]
netbox_config: #SECRET_KEY: ALLOWED_HOSTS: - localhost - 127.0.0.1 #NAPALM_USERNAME: #NAPALM_PASSWORD: MEDIA_ROOT: "{{ netbox_shared_path }}/media" REPORTS_ROOT: "{{ netbox_shared_path }}/reports" SCRIPTS_ROOT: "{{ netbox_shared_path }}/scripts"
Ceci est un dictionnaire de paramètres utilisés pour modéliser configuration.py
de NetBox.
See http://netbox.readthedocs.io/en/stable/configuration/mandatory-settings/[Paramètres obligatoires]
et http://netbox.readthedocs.io/en/stable/configuration/optional-settings/[Paramètres optionnels]
de la documentation de NetBox pour plus de détails, ainsi que
examples/netbox_config.yml
dans ce dépôt.
Il n'est pas nécessaire de définir SECRET_KEY
ici - ce rôle créera automatiquement
un pour vous à {{ netbox_shared_path }}/generated_secret_key
. Le SECRET_KEY
sera ensuite
lu à partir de ce fichier lors des exécutions ultérieures, sauf si vous le définissez plus tard dans votre playbook. Notez que vous devriez définir le
SECRET_KEY
si vous déployez plusieurs instances de NetBox derrière un équilibreur de charge.
Si vous avez activé l'intégration NAPALM dans ce rôle, vous devrez également configurer les informations d'identification NAPALM ici.
MEDIA_ROOT
/REPORTS_ROOT
/SCRIPTS_ROOT
, bien que non obligatoires dans la documentation de NetBox,
sont obligatoires dans ce rôle pour éviter de perdre ces fichiers lors des
mises à niveau (ce rôle ne met pas à niveau NetBox en place). Il doit être défini sur un
répertoire permanent qui ne sera pas perdu lors des mises à niveau (le par défaut, énoncé ci-dessus,
peut être utilisé sans problème). Ce rôle tentera de créer ces répertoires
et de changer leur propriété selon ce que netbox_user
est défini.
[source,yaml]
netbox_scripts: [] netbox_reports: []
https://netbox.readthedocs.io/en/stable/additional-features/custom-scripts/[Scripts]
et https://netbox.readthedocs.io/en/stable/additional-features/reports/[Rapports]
à télécharger pour utilisation au sein de NetBox. Ce sont des listes de dictionnaires avec un
attribut src
, spécifiant le chemin local vers le script ou le rapport, et un
attribut name
, spécifiant le nom du module (nom du script/rapport). Par exemple :
[source,yaml]
Exemple
netbox_scripts:
- src: netbox_scripts/migrate_application.py name: migrate_application netbox_reports:
- src: netbox_reports/devices.py name: devices
Cela copiera netbox_scripts/migrate_application.py
depuis votre
répertoire de playbook vers {{ netbox_config.SCRIPTS_ROOT }}/migrate_application.py
et
netbox_reports/devices.py
vers {{ netbox.config.REPORTS_ROOT }}/devices.py
.
[source,yaml]
netbox_pip_packages: []
Exemple :
netbox_pip_packages:
- https://github.com/steffann/netbox-example-plugin.git
- netbox-topology-views
Ceci est une liste de paquets supplémentaires à installer via pip
dans
l'environnement virtuel de NetBox. Vous pouvez spécifier tout artefact valide que pip
comprend.
Si vous listez des plugins ici, assurez-vous d'inclure les configurations de plugins appropriées dans la variable de rôle netbox_config
. Lisez
https://netbox.readthedocs.io/en/stable/plugins/[Plugins] pour plus d'infos.
[source,yaml]
netbox_user: netbox netbox_group: netbox netbox_home: /srv/netbox netbox_releases_path: "{{ netbox_home }}/releases" netbox_git_repo_path: "{{ netbox_releases_path }}/git-repo" netbox_git_deploy_path: "{{ netbox_releases_path }}/git-deploy" netbox_stable_path: "{{ netbox_releases_path }}/netbox-{{ netbox_stable_version }}" netbox_current_path: "{{ netbox_home }}/current" netbox_shared_path: "{{ netbox_home }}/shared"
Ce sont tous des détails de déploiement que vous pouvez modifier pour changer l'utilisateur de l'application et les emplacements de stockage de l'application. netbox_releases_path
stocke tous
les déploiements de NetBox que vous avez jamais réalisés. netbox_git_repo_path
est l'endroit où le dépôt Git
sera cloné et doit rester intact, tandis que
netbox_git_deploy_path
est l'endroit où une archive git
utilisant la référence
netbox_git_version
sera extraite. netbox_stable_path
est le dossier extrait d'un tarball de version. netbox_current_path
sera
liée symboliquement à la version sélectionnée et utilisée dans les fichiers de service/configuration comme
emplacement d'installation de NetBox. netbox_shared_path
est destiné à stocker
des fichiers de configuration et d'autres contenus "partagés", comme les journaux.
[source,yaml]
netbox_socket: "127.0.0.1:8000" netbox_protocol: http netbox_processes: "{{ ansible_processor_vcpus }}"
netbox_socket
définit à quoi le service uWSGI se liera et peut être défini sur
n'importe quelle adresse valide de https://www.freedesktop.org/software/systemd/man/systemd.socket.html#ListenStream=[ListenStream] (socket systemd). Définissez netbox_protocol
sur uwsgi
si vous voulez que uWSGI parle WSGI (par exemple si vous exécutez nginx comme un équilibreur de charge).
netbox_processes
définit combien de travailleurs NetBox uWSGI lancera pour traiter
les demandes.
[source,yaml]
netbox_application_log: "file:{{ netbox_shared_path }}/application.log" netbox_requests_log: "file:{{ netbox_shared_path }}/requests.log"
Ceci définit où les journaux seront stockés. Vous pouvez utiliser des installations de journalisation externes
au lieu de fichiers locaux si vous le souhaitez,
http://uwsgi-docs.readthedocs.io/en/latest/Logging.html#pluggable-loggers[tant que uWSGI le prend en charge]. Le journal des applications se rapporte à logger
et
le journal des requêtes à req-logger
.
[source,yaml]
netbox_ldap_enabled: false netbox_ldap_config_template: netbox_ldap_config.py.j2
Activez netbox_ldap_enabled
pour true
pour configurer l'authentification LDAP pour
NetBox. netbox_ldap_config_template
doit être le chemin vers votre modèle - par défaut, Ansible
cherchera dans le répertoire templates/
de votre playbook pour cela.
Vous pouvez trouver un exemple dans examples/
. Vous devrez également définir
netbox_config.REMOTE_AUTH_BACKEND
sur netbox.authentication.LDAPBackend
.
ASTUCE : Par défaut, un super utilisateur local (non-LDAP) sera toujours créé par ce
rôle. Si cela n'est pas souhaitable, envisagez de désactiver netbox_superuser_enabled
.
[source,yaml]
netbox_napalm_enabled: false netbox_napalm_packages:
- napalm
Activez netbox_napalm_enabled
pour activer l'intégration NAPALM dans NetBox. Vous devez
définir NAPALM_USERNAME
et NAPALM_PASSWORD
dans la variable netbox_config
pour pouvoir utiliser NAPALM. Ajoutez des bibliothèques python NAPALM supplémentaires en les listant dans
netbox_napalm_packages
(par exemple, napalm-eos
).
[source,yaml] netbox_metrics_enabled: false
Activez netbox_metrics_enabled
pour true
pour activer les métriques de l'application (via
https://github.com/korfuri/django-prometheus[django-prometheus]). Cela ajoute
des éléments de configuration pertinents pour un bon traitement des métriques.
(https://netbox.readthedocs.io/en/stable/additional-features/prometheus-metrics/[plus d'infos]).
[source,yaml]
netbox_metrics_dir: netbox_metrics netbox_metrics_path: "/run/{{ netbox_metrics_dir }}"
Le nom du répertoire où les fichiers de métriques sont stockés peut être défini avec
netbox_metrics_dir
. Cependant, netbox_metrics_path
doit rester par défaut
(voir ci-dessus) pour fonctionner avec systemd
et le paramètre RuntimeDirectory
(qui pointe uniquement vers /run
).
[source,yaml] netbox_keep_uwsgi_updated: false
Activez netbox_keep_uwsgi_updated
pour true
si vous souhaitez vous assurer que votre serveur uwsgi
est à jour, sinon uwsgi ne sera pas mis à jour lors des exécutions suivantes de votre playbook.
[source,yaml] netbox_uwsgi_options: {}
Précisez des options de configuration supplémentaires à insérer dans uwsgi.ini
ici. Il est
prévu que ce soit un dictionnaire de paires clé/valeur, par exemple buffer-size: 65535
.
[source,yaml] netbox_uwsgi_in_venv: false
Activez netbox_uwsgi_in_venv
pour true
si vous souhaitez que uwsgi
soit installé dans le même environnement virtuel que NetBox. Sinon, il sera installé à l'échelle du système dans le chemin de bibliothèque de la version de python utilisée pour créer l'environnement virtuel (comportement normal/ancien).
AVERTISSEMENT : Il est possible que cela devienne le comportement par défaut dans une version ultérieure de ce rôle (je pense qu'après des tests plus croisés sur des plateformes). Voir https://github.com/lae/ansible-role-netbox/issues/144[problème #144] pour plus de détails.
[source,yaml] netbox_install_epel: true
Activez netbox_install_epel
pour false
si vous ne voulez pas que ce rôle installe
le dépôt Fedora EPEL pour vous. Cela peut être utile pour les environnements d'entreprise où
les dépôts du système sont gérés/mirroités par l'entreprise.
[source,yaml]
netbox_packages: [] netbox_python_packages: [] netbox_python_binary: /usr/bin/python{{ some version }} netbox_ldap_packages: []
Ces variables sont générées dynamiquement en fonction de la distribution cible. Vous
pouvez vérifier les valeurs par défaut sous le répertoire vars/
. Vous pouvez utiliser
ces variables pour cibler un système d'exploitation non pris en charge (bien qu'il ne faille pas
hésiter à ouvrir une PR pour ajouter le support !) ou pour spécifier un interpréteur Python personnalisé
(par exemple PyPy) à utiliser pour le déploiement. Cependant, notez que le support par
ce rôle peut être limité pour les installations Python alternatives.
== Exemple de Playbook
Ce qui suit installe PostgreSQL et crée un utilisateur avec le rôle Postgres robuste de @geerlingguy, puis procède à déployer et configurer NetBox en utilisant un socket unix local pour communiquer avec le serveur Postgres avec l'utilisateur de base de données netbox par défaut.
[source,yaml,subs="attributes"]
- hosts: netbox.idolactiviti.es
become: yes
roles:
- geerlingguy.postgresql
- davidwittman.redis
- {role}
vars:
netbox_stable: true
netbox_database_socket: "{{ postgresql_unix_socket_directories[0] }}"
netbox_superuser_password: netbox
netbox_socket: "0.0.0.0:80"
netbox_config:
ALLOWED_HOSTS:
- netbox.idolactiviti.es MEDIA_ROOT: "{{ netbox_shared_path }}/media" REPORTS_ROOT: "{{ netbox_shared_path }}/reports" SCRIPTS_ROOT: "{{ netbox_shared_path }}/scripts" postgresql_users:
- name: "{{ netbox_database_user }}" role_attr_flags: CREATEDB,NOSUPERUSER redis_bind: 127.0.0.1 redis_version: 6.0.9 redis_checksum: sha256:dc2bdcf81c620e9f09cfd12e85d3bc631c897b2db7a55218fd8a65eaa37f86dd
Notez l'attribut CREATEDB
.
En supposant que vous avez déjà un serveur PG en cours d'exécution avec l'utilisateur netbox_prod_user
créé, qui possède une base de données appelée netbox_prod
, et qui permet l'hôte sur lequel vous
installez NetBox de s'authentifier avec lui par TCP :
[source,yaml,subs="attributes"]
- hosts: netbox.idolactiviti.es
become: yes
roles:
- davidwittman.redis
- {role}
vars:
netbox_stable: true
netbox_superuser_password: netbox
netbox_socket: "0.0.0.0:80"
netbox_config:
ALLOWED_HOSTS:
- "{{ inventory_hostname }}" MEDIA_ROOT: "{{ netbox_shared_path }}/media" REPORTS_ROOT: "{{ netbox_shared_path }}/reports" SCRIPTS_ROOT: "{{ netbox_shared_path }}/scripts" netbox_database_host: pg-netbox.idolactiviti.es netbox_database_port: 15432 netbox_database: netbox_prod netbox_database_user: netbox_prod_user netbox_database_password: "very_secure_password_for_prod" netbox_database_maintenance: netbox_prod redis_bind: 127.0.0.1 redis_version: 6.0.9 redis_checksum: sha256:dc2bdcf81c620e9f09cfd12e85d3bc631c897b2db7a55218fd8a65eaa37f86dd
Consultez le répertoire examples/
pour plus d'informations.
== Dépannage
=== uWSGI réinitialisant les connexions TCP
Lorsque netbox_protocol
est défini sur http
, uWSGI peut présenter un comportement étrange
et réinitialiser les connexions TCP apparemment au hasard. Cela peut se manifester par une
erreur "connexion réinitialisée par le pair", par exemple lors de l'utilisation de l'API avec
https://github.com/netbox-community/pynetbox[pynetbox]. Si vous êtes concerné par
cela, essayez de changer netbox_protocol
en uwsgi
et d'utiliser un équilibreur de charge, ou
d'ajuster vos netbox_uwsgi_options
comme suit. Consultez https://github.com/lae/ansible-role-netbox/issues/130#issuecomment-847571006[cette discussion GitHub] pour des informations connexes
[source,yaml,subs="attributes"]
netbox_uwsgi_options: http-keepalive: "true" http-auto-chunked: "true" add-header: "Connection: Close"
Installs and configures NetBox, a DCIM suite, in a production setting.
ansible-galaxy install lae.netbox