netbox
:role-author: lae :role-name: netbox :role: {role-author}.{role-name} :gh-name: {role-author}/ansible-role-{role-name} :netbox-version: 3.7.3 = {role} :toc: :toc-placement: preamble ifdef::env-github[] :tip-caption: :bulb: :warning-caption: :warning: endif::[]
ifdef::env-github[] image:https://img.shields.io/badge/role-{role}-blue?style=for-the-badge[Ansible Galaxy Role,link=https://galaxy.ansible.com/{role-author}/{role-name}] endif::env-github[]
Устанавливает и настраивает https://github.com/netbox-community/netbox[NetBox], инструмент управления IP-адресами (IPAM) и управления инфраструктурой центров обработки данных (DCIM).
Эта роль будет развертывать NetBox в своем собственном виртуальном окружении либо с помощью tarball-версии, либо через git, используя uWSGI в качестве сервера приложений.
Поддерживает CentOS 7,8 / RHEL 9 / Debian 9,10,11,12 / Ubuntu 16, 18, 20 и 22.
Обратите внимание, что эта роль немного отличается от инструкций по установке в документации NetBox. Основные отличия:
- Использует системный
systemd
, предоставленный дистрибутивом, вместоsupervisord
- Использует uWSGI в качестве сервера приложений вместо gunicorn
- Ужесточает сервис NetBox/uWSGI (см.
templates/netbox.service.j2
) - Поддерживает горячую перезагрузку при обновлениях и изменениях конфигурации
== Быстрый старт
Предполагая, что у вас установлен Ansible и вы используете настройки по умолчанию:
[source,bash,subs="attributes"]
ansible-galaxy install geerlingguy.postgresql davidwittman.redis {role} ansible-galaxy collection install community.postgresql ansible-playbook -i ваш.сервер.домен, ~/.ansible/roles/{role}/examples/playbook_single_host_deploy.yml -K
Это развернет NetBox и PostgreSQL на ваш.сервер.домен
; по завершении установки
к нему можно будет получить доступ на порту 80. Измените при необходимости. Читайте ниже для получения дополнительной информации.
Вы также можете использовать Vagrant, если предпочитаете, для запуска 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
== Поддержка/Участие в разработке
Если вы хотите внести вклад в эту роль, пожалуйста, прочитайте DEVELOPING.md
для
узнавания рабочего процесса этого репозитория и (по желанию) инструкций по настройке
развивающей среды. Эта роль использует роль lae.travis-lxc
при тестировании
в Travis CI, определения можно найти в директории tests/
.
ifeval::["{role-author}" == "lae"] Для поддержки или если вы хотите внести вклад в эту роль, но нуждаетесь в помощи, пожалуйста, задавайте вопросы на сервере Discord @lae: https://discord.gg/cjqr6Fg
endif::[] == Пререквизиты
=== PostgreSQL
Эта роль не настраивает сервер PostgreSQL (но создаст базу данных при необходимости), поэтому вам нужно будет настроить сервер PostgreSQL и создать пользователя базы данных отдельно от этой роли. Посмотрите раздел Пример плейбука.
Кроме того, для Ansible 2.10+ вам может потребоваться установить коллекцию community.postgresql
.
Рекомендуется указать это в файле requirements.yml
вашего плейбука.
Например:
[source,yaml]
collections:
- name: community.postgresql version: 3.4.0
ПРЕДУПРЕЖДЕНИЕ: NetBox v2.2.0+ требует минимум PostgreSQL 9.4, который может быть недоступен в репозиториях вашего дистрибутива. Вам может понадобиться использовать для этого роль.
=== Redis
Эта роль не настраивает и не управляет экземпляром Redis. Вы можете либо
установить redis-server
через задачу в pre_tasks
в вашем плейбуке, либо использовать
роль установки Redis, такую как
https://galaxy.ansible.com/davidwittman/redis[DavidWittman.redis].
ПРЕДУПРЕЖДЕНИЕ: NetBox v2.9.0+ требует минимум Redis 4.0. Роль, предложенная выше, по умолчанию использует версию 2.8, поэтому убедитесь, что вы указываете более новую версию в переменной роли или развертываете Redis 4.0+ другим способом.
== Переменные роли
СОВЕТ: Смотрите examples/
для примеров плейбуков, которые вы можете написать для различных сценариев.
ПРЕДУПРЕЖДЕНИЕ: Некоторые переменные роли обязательны. Ищите выделенные обязательные ниже.
[source,yaml]
netbox_stable: false netbox_git: false
Обязательно установить одну из вышеуказанных переменных в true
. netbox_stable
указывает роли развернуть с помощью извлечения версий tarball с GitHub, в то время как
netbox_git
указывает роли клонировать репозиторий NetBox - они взаимно исключают друг друга.
[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"
Эти параметры могут быть настроены на конкретную версию (например, увеличить, чтобы инициировать обновление) или развернуть с использованием tarball, расположенного где-то еще. Полезно, когда вам нужно изменить что-то в выпуске или развернуть локально за фаерволом.
[source,yaml]
netbox_git_version: develop netbox_git_uri: "https://github.com/netbox-community/netbox.git"
netbox_git_version
может быть любым допустимым идентификатором в репозитории git.
netbox_git_uri
может использоваться для указания, например, на локальный репозиторий или форк.
[source,yaml]
netbox_superuser_enabled: true netbox_superuser_username: admin #netbox_superuser_password: changeme netbox_superuser_email: admin@localhost netbox_superuser_create_token: false
Эти переменные используются для настройки локальной учетной записи суперпользователя. Отключите это,
если вы не хотите его создавать (например, при использовании LDAP - хотя наличие
локального суперпользователя может быть полезным и в этом случае). При включении это
обязательно установить пароль суперпользователя. Эта роль создаст нового суперпользователя,
если пользователь не существует, или изменит существующего пользователя, если он не является
суперпользователем/имеет другой адрес электронной почты или пароль. (Да, вы можете использовать это для сброса
пароля суперпользователя, если забудете его). netbox_superuser_create_token
может
использоваться для генерации случайного API токена для суперпользователя, если это необходимо.
[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
Обязательно настроить либо каталог сокета (для общения через UNIX-сокеты), либо хост/пароль (для использования TCP/IP). См. раздел Пример плейбука для получения дополнительной информации о настройке базы данных.
Обратите внимание, что это используется для настройки DATABASE
в configuration.py
.
[source,yaml]
netbox_database_conn_age: 300
Чтобы настроить NetBox на поддержание открытых соединений с базой данных дольше одного запроса,
установите netbox_database_conn_age
на ваше предпочтительное максимальное время жизни соединения в секундах.
300 секунд (5 минут) - это обычно хорошее число для начала.
[source,yaml]
netbox_database_maintenance: postgres
Если база данных postgres настроена так, чтобы разрешать доступ только к определенным таблицам БД для пользователя, настроенного с помощью Netbox, вы можете установить netbox_database_maintenance
для замены используемой по умолчанию базы данных для проверки соединений на другую таблицу, отличную от postgres
. Это пустая таблица по умолчанию в каждой базе данных postgres, но некоторые конфигурации могут блокировать доступ к этой таблице, поэтому здесь можно использовать другую таблицу (т.е. netbox_prod
).
[source,yaml]
Пример использования, по умолчанию пустой словарь
netbox_database_options: sslmode: require isolation_level: 3
Если вам нужно установить любые другие параметры PostgreSQL, вы можете сделать это здесь. Например, для случаев, таких как https://docs.djangoproject.com/en/3.1/ref/databases/#isolation-level[уровни изоляции] необходимо использовать числовое значение
вместо константы:
psycopg2.extensions.ISOLATION_LEVEL_SERIALIZABLE
против 3
.
Добавляйте сюда только в том случае, если вы действительно знаете, что делаете.
[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 }}"
Это заполняет словарь конфигурации REDIS
в configuration.py
. Используйте
вторую группу переменных, если хотите разделить вашу кешированную базу данных от базы данных вебхуков.
[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 }}"
Используйте этот синтаксис, если ваш redis установлен с архитектурой сенсоров (несколько узлов). Используйте вторую группу переменных, если хотите разделить вашу кешированную базу данных от базы данных вебхуков.
[source,yaml]
netbox_rqworker_processes: 1
Укажите, сколько процессов обработки запросов очередь должна быть запущена сервисом systemd. Вы можете оставить это по умолчанию 1, если у вас не так много отчетов, скриптов и других фоновых задач.
[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"
Это словарь настроек, используемый для шаблонизации configuration.py
NetBox.
См. http://netbox.readthedocs.io/en/stable/configuration/mandatory-settings/[Обязательные настройки]
и http://netbox.readthedocs.io/en/stable/configuration/optional-settings/[Необязательные настройки]
из документации NetBox для получения дополнительных сведений, а также
examples/netbox_config.yml
в этом репозитории.
Нет необходимости определять SECRET_KEY
здесь - эта роль автоматически
создаст его для вас по адресу {{ netbox_shared_path }}/generated_secret_key
. Затем
SECRET_KEY
будет считываться из этого файла при последующих запусках, если вы
позже не установите его в своем плейбуке. Обратите внимание, что вам стоит определить
SECRET_KEY
, если вы развертываете несколько экземпляров NetBox за одним балансировщиком нагрузки.
Если вы активировали интеграцию NAPALM в этой роли, вам также нужно будет настроить учетные данные NAPALM здесь.
MEDIA_ROOT
/REPORTS_ROOT
/SCRIPTS_ROOT
, хотя и не обязательны в документации NetBox, обязательны в этой роли, чтобы предотвратить потерю этих файлов во время обновлений (эта роль не обновляет NetBox на месте). Должно быть установлено на каталог, который постоянен и не теряется при обновлении (по умолчанию, указанный выше, можно использовать без проблем). Эта роль попытается создать эти каталоги
и изменить их владельца на того, кого установлено netbox_user
.
[source,yaml]
netbox_scripts: [] netbox_reports: []
https://netbox.readthedocs.io/en/stable/additional-features/custom-scripts/[Скрипты]
и https://netbox.readthedocs.io/en/stable/additional-features/reports/[Отчеты]
для загрузки для использования в NetBox. Это должны быть списки словарей с атрибутом
src
, указывающим на локальный путь к скрипту или отчету, и атрибутом name
, указывающим на имя модуля (имя скрипта/отчета). Например:
[source,yaml]
Пример
netbox_scripts:
- src: netbox_scripts/migrate_application.py name: migrate_application netbox_reports:
- src: netbox_reports/devices.py name: devices
Это скопирует netbox_scripts/migrate_application.py
из каталога вашего плейбука
в {{ netbox_config.SCRIPTS_ROOT }}/migrate_application.py
и
netbox_reports/devices.py
в {{ netbox.config.REPORTS_ROOT }}/devices.py
.
[source,yaml]
netbox_pip_packages: []
Пример:
netbox_pip_packages:
- https://github.com/steffann/netbox-example-plugin.git
- netbox-topology-views
Это список дополнительных пакетов для установки через pip
в виртуальном окружении NetBox.
Вы можете указать любой допустимый артефакт, который понимает pip
.
Если вы укажете какие-либо плагины здесь, обязательно включите соответствующие настройки плагинов в переменной роли netbox_config
. Читайте
https://netbox.readthedocs.io/en/stable/plugins/[Плагины] для получения дополнительной информации.
[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"
Это все детали развертывания, которые вы можете изменить, чтобы изменить пользователя приложения и места хранения приложения. netbox_releases_path
хранит все
версии NetBox, которые вы когда-либо развертывали. netbox_git_repo_path
- это место, куда будет клонирован репозиторий Git, и он должен оставаться нетронутым - тогда как
netbox_git_deploy_path
- это место, куда будет извлечен архив git
с использованием ссылки
netbox_git_version
. netbox_stable_path
- это извлеченная папка из tarball-версии. netbox_current_path
будет
символически связано с выбранной версией и используется в службах/файлах конфигурации как
местоположение, где установлен NetBox. netbox_shared_path
предназначен для хранения файлов конфигурации и другого "общего" контента, такого как журналы.
[source,yaml]
netbox_socket: "127.0.0.1:8000" netbox_protocol: http netbox_processes: "{{ ansible_processor_vcpus }}"
netbox_socket
определяет, к чему будет привязан сервис uWSGI, и может быть установлен на
любой допустимый https://www.freedesktop.org/software/systemd/man/systemd.socket.html#ListenStream=[ListenStream]
адрес (сокет systemd). Установите netbox_protocol
на uwsgi
, если вы хотите, чтобы uWSGI
говорил WSGI (например, если вы используете nginx в качестве балансировщика нагрузки).
netbox_processes
определяет, сколько рабочих процессов NetBox uWSGI будут запущены для обслуживания
запросов.
[source,yaml]
netbox_application_log: "file:{{ netbox_shared_path }}/application.log" netbox_requests_log: "file:{{ netbox_shared_path }}/requests.log"
Это определяет, где будут храниться журналы. Вы можете использовать внешние средства ведения журналов
вместо локальных файлов, если хотите,
http://uwsgi-docs.readthedocs.io/en/latest/Logging.html#pluggable-loggers[при условии что uWSGI это поддерживает]. Журнал приложений соответствует logger
, а
журнал запросов - req-logger
.
[source,yaml]
netbox_ldap_enabled: false netbox_ldap_config_template: netbox_ldap_config.py.j2
Переключите netbox_ldap_enabled
на true
, чтобы настроить аутентификацию LDAP для
NetBox. netbox_ldap_config_template
должен быть путем к вашему шаблону - по
умолчанию Ansible будет искать в каталоге templates/
вашего плейбука. Вы можете найти пример в examples/
. Вам также потребуется установить
netbox_config.REMOTE_AUTH_BACKEND
на netbox.authentication.LDAPBackend
.
СОВЕТ: По умолчанию эта роль все равно будет создавать локального (недоступного по LDAP) суперпользователя. Если это нежелательно, подумайте о том, чтобы отключить netbox_superuser_enabled
.
[source,yaml]
netbox_napalm_enabled: false netbox_napalm_packages:
- napalm
Переключите netbox_napalm_enabled
, чтобы активировать интеграцию NAPALM в NetBox. Вы должны
определить NAPALM_USERNAME
и NAPALM_PASSWORD
в переменной netbox_config
,
чтобы иметь возможность использовать NAPALM. Добавьте дополнительные библиотеки Python NAPALM, перечислив их в
netbox_napalm_packages
(например, napalm-eos
).
[source,yaml] netbox_metrics_enabled: false
Переключите netbox_metrics_enabled
на true
, чтобы активировать метрики приложения (через
https://github.com/korfuri/django-prometheus[django-prometheus]). Это добавляет
соответствующие элементы конфигурации для надлежащей обработки метрик.
(https://netbox.readthedocs.io/en/stable/additional-features/prometheus-metrics/[больше
информации]).
[source,yaml]
netbox_metrics_dir: netbox_metrics netbox_metrics_path: "/run/{{ netbox_metrics_dir }}"
Имя каталога, в котором хранятся файлы метрик, можно задать через
netbox_metrics_dir
. Однако netbox_metrics_path
должен оставаться по умолчанию
(как указано выше), чтобы работать с systemd
и параметром RuntimeDirectory
(который указывает только на /run
).
[source,yaml] netbox_keep_uwsgi_updated: false
Переключите netbox_keep_uwsgi_updated
на true
, если вы хотите убедиться, что ваш сервер uwsgi является последней версией, иначе uwsgi не будет обновляться при последующих
запусках вашего плейбука.
[source,yaml] netbox_uwsgi_options: {}
Укажите дополнительные параметры конфигурации для вставки в uwsgi.ini
здесь. Это
ожидается в качестве словаря пар "ключ/значение", например, buffer-size: 65535
.
[source,yaml] netbox_uwsgi_in_venv: false
Переключите netbox_uwsgi_in_venv
на true
, если вы хотите, чтобы uwsgi
был установлен в том же виртуальном окружении, что и NetBox. В противном случае он будет установлен по всему системе в библиотечный путь используемой версии Python, используемой для создания виртуального окружения (нормальное/устаревшее поведение).
ПРЕДУПРЕЖДЕНИЕ: Возможно, это станет стандартом в более поздних версиях этой роли (я предполагаю, после дальнейшего кросс-платформенного тестирования). Смотрите https://github.com/lae/ansible-role-netbox/issues/144[проблема №144] для получения дополнительной информации.
[source,yaml] netbox_install_epel: true
Переключите netbox_install_epel
на false
, если вы не хотите, чтобы эта роль устанавливала
Fedora EPEL за вас. Это может быть полезно для корпоративных сред, где
репозитории системы управляются/реплицируются предприятием.
[source,yaml]
netbox_packages: [] netbox_python_packages: [] netbox_python_binary: /usr/bin/python{{ some version }} netbox_ldap_packages: []
Эти переменные динамически генерируются на основе целевого дистрибутива. Вы
можете проверить значения по умолчанию под директорией vars/
. Вы можете использовать
эти переменные для указания неподдерживаемой операционной системы (хотя не стесняйтесь
открыть PR для добавления поддержки!) или для указания пользовательского интерпретатора Python
(например, PyPy), который будет использоваться для развертывания. Однако обратите внимание, что поддержка этой роли для альтернативных установок Python может быть ограничена.
== Пример плейбука
Следующий пример устанавливает PostgreSQL и создает пользователя с помощью надежной роли @geerlingguy для Postgres, затем переходит к развертыванию и настройке NetBox, используя локальный unix сокет для общения с сервером Postgres с использованием пользователя базы данных по умолчанию netbox.
[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
Обратите внимание на атрибут CREATEDB
.
Предполагая, что у вас уже запущен сервер PG с созданным пользователем netbox_prod_user
,
который владеет базой данных под названием netbox_prod
, и он разрешает хосту, на котором вы
устанавливаете NetBox, аутентифицироваться с ним по 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: "очень_секретный_пароль_для_prod" netbox_database_maintenance: netbox_prod redis_bind: 127.0.0.1 redis_version: 6.0.9 redis_checksum: sha256:dc2bdcf81c620e9f09cfd12e85d3bc631c897b2db7a55218fd8a65eaa37f86dd
Смотрите директорию examples/
для получения большего количества примеров.
== Устранение неполадок
=== uWSGI сбрасывает TCP соединения
Когда netbox_protocol
установлен на http
, uWSGI может вести себя странно
и сбрасывать TCP соединения, казалось бы, случайным образом. Это может проявляться в
ошибке "connection reset by peer", например, при работе с API, используя
https://github.com/netbox-community/pynetbox[pynetbox]. Если у вас есть такая проблема,
попробуйте переключить netbox_protocol
на uwsgi
и использовать балансировщик нагрузки или
откорректировать ваши netbox_uwsgi_options
, как показано ниже. См. https://github.com/lae/ansible-role-netbox/issues/130#issuecomment-847571006[это обсуждение на GitHub]
для связанной темы
[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/ansible-role-netbox