netbox
January 13

Управление CurrentConfig через nbshell

Опытные пользователи Netbox наверняка сталкивались с таким мощным инструментом как Netbox Shell (построенный на базе Django Shell и представляющий собой интерпретатор iPython с расширенной функциональностью).

Управление в интерактивном режиме

Чтобы запустить nbshell необходимо открыть в командной строке папку с дистрибутивом приложения и, активировав virtual environment, выполнить команду python netbox/manage.py nbshell

Что бы получить текущую ревизию конфигурации приложения (которая и содержит динамически конфигурируемые параметры) нам понадобится ID текущей (активной) конфигурации, ее можно получить из кэша приложения:

from django.core.cache import cache

activeRevision = ConfigRevision.objects.get(pk=cache.get('config_version'))

Объект activeRevision будет содержать объект типа ConfigRevision, являющийся активной конфигурацией в данный момент ("Curren configuration"). Объект простой, в поле data содержит словарь с динамически конфигурируемыми параметрами (список всех параметров и их значение можно подсмотреть в официальной документации). Однако просто изменить текущую конфигурацию нельзя, конфигурация будет применена только к новой ревизии конфигурации, а значит нам нужно ее создать.

Однако создавать мы ее будем не с нуля, а на базе предыдущей активной конфигурации.

Для примера мы включим параметр MAINTENANCE_MODE, переведя таким образом приложение в режим обслуживания.

# Хорошим тоном будет записать смысл новой ревизии конфига в комментарий
# Заполняем все параметры из текущей конфигурации
newRevsion = ConfigRevision(comment='Enable MM', data=activeRevision.data)
# Изменяем нужный нам параметр
newRevsion.data['MAINTENANCE_MODE'] = True
# Валидируем нашу модель конфигурации на соответствие модели данных,
# заложенных разработчиком
newRevsion.full_clean()
# Сохраняем новую конфигурацию (она автоматически станет активной)
newRevsion.save()

Управление в режиме скрипта

Данный код можно склеить в одну строку, разделив строки точкой с запятой ; и передать одним аргументом для nbshell.

python netbox/manage.py nbshell -c "from django.core.cache import cache; activeRevision = ConfigRevision.objects.get(pk=cache.get('config_version')); newRevsion = ConfigRevision(comment='Enable MM', data=activeRevision.data); newRevsion.data['MAINTENANCE_MODE'] = True; newRevsion.full_clean(); newRevsion.save();"

Для мультинодовых конфигураций

не забывайте что проделывать манипуляции с конфигурациями придется для каждой ноды отдельно.

UPD: Работа с существующей конфигурацией

Если же хочется изменить какую-то текущую конфигурацию или просто сделать ее активной (например, откатиться на предыдущую), то сделать это можно через встроенный метод класса ConfigRevision - activate()

revision = ConfigRevision.object.get(pk=revisionNumber)
revision.activate()