Сценарии¶
В реальной жизни их, конечно, будет много. Я же опишу самые необходимые:
- 0. Проверка сети
- 1. Ввод нового оборудования
- 2. Переконфигурация из-за изменений переменных в инвентарной системе
- 3. Переконфигурация из-за изменения дизайна
- 4. Сбор информации с устройств
- 5. Снятие и возврат нагрузки
- 6. Обновление ПО
- 7. Удаление устройства
- 8. Замена устройства
Распишем каждый из них детально.
0. Проверка сети¶
- Человек или сервис приходит в ручку NetAPI с запросом, в теле которого указаны параметры теста. Например, ICMP, устройство-источник, адрес назначения, VRF, число проб, размер пакета.
- NetAPI формирует запрос в NetGet, чтобы тот собрал данные с сети/устройства. И тот собирает.
- Результаты теста возвращаются клиенту.
1. Ввод нового оборудования¶
В зависимости от скорости роста, возможно, самый важный сценарий - быстро запускать новые узлы (стойки, филиалы, офисы), поскольку обычно занимает больше всего времени.
- Человек или часть системы, реализующей нечто а-ля ZTP, приходит в NetAPI для инициализации устройства.Устройство идентифицируется по своему серийнику или инвентарному номеру, и ему должна быть задана роль, чтобы было понятно, с какой конфигурацией его наливать.
Ручка дёргает конкретное приложение, отвечающее за этот шаг
Приложение создаёт устройство в NetBox и прописывает его
- Имя
- Серийник
- Локацию
- Вендор/модель
- Роль в сети
- Присущие ему свойства: список интерфейсов, консольных портов, комментарии.
Приложение определяет и при необходимости создаёт MGMT-интерфейс
Приложение выделяет MGMT IP.
На данном шаге устройство в минимальном виде заведено в инвентарной системе, и заполнены необходимые для первичной настройки параметры. - Далее другая часть процесса, а-ля ZTP, приходит в ручку NetAPI в поисках первоначального конфига
- Ручка дёргает конкретное приложение
- Приложение собирает данные из NetBox и, возможно, внешних систем
- Приложение рендерит конфиг, возвращает его клиенту и заодно складывает его в git-репозиторий.
- Клиент каким-то образом доставляет конфигурацию до устройства - это может быть ZTP или пропихивание конфига через консольный порт. Идентификатором устройства тут выступает серийник.
После этого шага появляется удалённый SSH-доступ на устройство.Теперь по какому-то триггеру запускается конвейер ввода устройства в эксплуатацию.Триггером может быть:- Чьё-то ручное действие - например, нажатие кнопки в интерфейсе - и сигнал в NetAPI.
- Обращение к ручке ввода в NetAPI от системы ZTP после завершения.
- Факт появления доступа по SSH на устройство - например, кроняка пытается доступиться до железки, которая помечена как «для ввода».
Заполняются данные в NetBox, которые в дальнейшем будут служить переменными для генерации конфигурации.
Система посылает в NetGet запрос на сбор данных о LLDP с данного свитча.
Информация о соседях вносится в NetBox, порты связываются друг с другом.
При необходимости создаются сабинтерфейсы или интерфейсы добавляются в LAG.
- Вычисляются (или выделяются) P2P IP-адреса.Необходимые изменения выполняются и на соседнем устройстве.Этот шаг позволяет, во-первых, подготовить данные для настройки IP-адресов, во-вторых, визуализировать топологию при необходимости, в-третьих, собрать в будущем информацию о BGP-соседях, если на узле используется BGP.
Система создаёт набор виртуальных интерфейсов и выделяет IP-адреса. Например, loopback’и и VLAN-интерфейсы.
Заполняет другие необходимые данные. Например, ASN, IS-IS Network Entity, настройки l2-интерфейсов.
- Обновление данных в NetBox инициирует запрос в NetAPI на запуск конвейера для вычисления и деплоя новой конфигурации. Это может быть, например, Web-hook, отправленный самим Netbox’ом.Речь здесь идёт обо всех устройствах, конфигурация которых меняется в результате ввода новых устройств. Добавляется новый Leaf - поменяется конфигурация Spine.
- NetAPI через Диспетчера адресует задачу на ConfMan, который вычисляет вендор-агностик конфигурацию.Для этого система берёт формализованную модель конфигурации данных (питоновские объекты, yaml итд) и подставляет в неё данные из NetBox.Результатом может быть словарь, тот же yaml или питоновский объект.
Система генерит конфиг для списка устройств. Результатом может быть текст, содержащий последовательность CLI-команд, NETCONF XML, набор объектов для YANG, Protobuf для gNMI.
- Выполняются лабораторные тесты CI/CD. Они могут быть в симуляторе, вроде Batfish, виртуальном стенде или всамделишной небольшой железной лабе, мимикрирующей под настоящую сеть.Даже для типовой операции, вроде описываемого ввода новых, серверов разумно их делать, ведь данные в SoT изменились - и выкатка может разломать сеть.Проходят ручные проверки и подтверждения.Это немного сколькзий момент. С одной стороны я всё же не верю, что в обозримом будущем на сеть новый конфиг можно катить без человеческого подтверждения, как это давно происходит в мире WEB-приложений.С другой - когда изменения катятся на тысячу устройств, пойди глазами всё просмотри. Поэтому всё же CI/CD и канареечные деплои - это то, к чему мы будем стремиться.Опционально этот шаг может выполняться в git-репозитории. Хотя заставлять человека переходить во внешний относительно основной системы автоматизации сервис - негуманно. Впрочем как первые шаги разработки такой системы - вполне нормально.
Я всё же не верю, что в обозримом будущем на сеть новый конфиг можно катить без человеческого подтверждения, как это давно происходит в мире WEB-приложений.
По факту сгенерированного конфига или полученных апрувов формируется задача в Dispatcher для Carrier’а на доставку и применение конфигурации на сеть.
- Диспетчер диспетчеризирует и следит за выполнением каждой конкретной задачи и всей транзакции целиком.Он несёт полную ответственность за то, когда выполняется задача и с каким статусом она завершается.
- В случае успешной транзакции Диспетчер обращается в ручки NetAPI, чтобы провести ряд тестов, проверяющих две вещи:Запускаются какие-то пинги. Проверяется маршрутная информация на сети - сравнивается с бейзлайном (например, состояние, как было до деплоя). Последнее предполагает, что мы либо собрали состояние перед обновлением, либо есть некая база данных с временными рядами (TSDB - Time Series Data Base), содержащая срезы исторических данных.Есть тесты, падение которых вызовет аварию, но операция будет считаться завершённой. А есть те, после которых произойдёт автоматический откат всей транзакции. Лучше не сделать ничего, чем сделать хорошо, но наполовину.
В случае успешных тестов в NetBox и/или иных системах проставляются индикаторы успешного ввода, новое устройство заводится в мониторинги и другие системы.
С результатами Диспетчер идёт в ручку NetAPI и сообщает, что ввод завершён успешно, либо нет.
2. Переконфигурация из-за изменений переменных в инвентарной системе¶
Триггером может быть Web-hook от SoT или опять же кроняка, которая следит за изменениями в этом SoT.
Не забываем про версионирование - изменения переменных в SoT фактически ведёт к изменению версии конфигурации сети. Мажорное, минорное или патч - это предмет жарких дискуссий, судьёй которому будет semver.
3. Переконфигурация из-за изменения дизайна¶
Впрочем, тут возможна специфика: изменения дизайна несут риски, поэтому неплохо бы добавить шаг проведения тестов в лабе с помощью CI/CD.
С точки зрения версионирования - инженер, меняющий дизайн и коммитящий изменения в гит, сам определяет насколько это важное обновление.
4. Сбор информации с устройств¶
Из любопытных идей для оптимизации: NetGet видится очень активноиспользуемым компонентом - вплоть до того, что мониторинг будет ходить в него, чтобы собрать счётчики и состояние сети - и, возможно, ему стоило бы держать открытыми и прогретыми сессии со всем флотом сетевых устройств. С использованием asyncio данные будут собираться просто в мгновение ока. А шардирование сетевых элементов по разным worker’ам позволит не упираться в лимиты.
5. Снятие и возврат нагрузки¶
Этот сценарий не является самостоятельным, если мы говорим про окончательное решение вопроса автоматизации - это, скорее, ручка, к которой мы будем обращаться из других сценариев.
Но для сравнительно простых устройств, каковыми являются торы, спайны и суперспайны или один из маршрутизаторов в ISP на резервированном канале, сделать это выглядит несложным.
Это может быть реализовано как две ручки: для снятия нагрузки и для возврата - так и как одна: выполняющая полный цикл.
Клиент приходит в ручку NetAPI. А тот запускает конвейер увода нагрузки
Приложение определяет список сервисов, которые нужно погасить (L2/L3VPN, базовая маршрутизация, MPLS итд)
- Приложение формирует список действий, которые нужно совершить.Например:
- Плавно увести трафик с помощью BGP gshut community или ISIS overload bit (или ещё чего-то
- Убедиться в отсутствии трафика на интерфейсах
- Выключить BGP-сессии в нужном порядке (сначала сервисные, потом транспортные
- Выключить интерфейсы
- Убедиться в отсутствии активных аварий по сервисам
Зафиксировать статус задачи.
Клиент может начинать выполнять запланированные работы. Клиентом может быть другой конвейер.
6. Обновление ПО¶
Клиент приходит в ручку NetAPI
Запускается конвейер снятия нагрузки
Запускается конвейер обновления ПО:
- Залить файлы ПО
- Проверить контрольную сумму
- Обновить прошивку, указать загрузочные файлы, перезагрузить устройство и провести иные мероприятия
- После обновления проверить версию ПО
Запустить конвейер возврата нагрузки.
7. Удаление устройства¶
Это весьма частый сценарий. Особенно если рассматривать переезд старого устройства в новую роль или локацию, как удаление и создание нового.
Клиент приходит в NetAPI. Тот дёргает приложение, отвечающее за удаление устройства.
Приложение проверяет, что нагрузка на устройстве ниже определённого порога.
Приложение обращается в NetAPI в ручку снятия нагрузки.
Приложение ищет все зависящие от этого устройства объекты в SoT. Как пример:
- Интерфейсы
- IP-адреса
- Подсети
- Интерфейсы соседних устройств
- P2P-адреса соседних устройств
- Итд.
Приложение удаляет их все.
- Изменения в SoT триггерят запуск уже известного нам конвейера. Как вы видите он весьма и весьма универсален.Как результат - настройки соседних устройств, относящиеся к удаляемому, так же удаляются в процессе деплоя новой конфигурации.Само же устройство затирается к заводским настройкам. Кроме того оно удаляется из всех мониторингов и других систем.
Устройство удаляется из БД или помечается каким-то образом, если нужно сохранить о нём информацию.
8. Замена устройства¶
- Удаление текущего устройства
- Добавление нового
Но нам важны несколько вещей:
- Имя нового устройства должно быть таким же, как и у прежнего
- Сохранить MGMT IP
- Сохранить и другие атрибуты: лупбэки, вланы, ASN, итд
- Скорее всего, и конфигурацию
Не факт, что это всё необходимо, но, скорее всего, так.
Поэтому я бы всё же рассматривал замену устройства на сети как
- Удаление старого устройства
- Добавление нового с определённым набором атрибутов, значение которых хотим зафиксировать, и которые в противном случае определялись/выделялись бы автоматически.
Опять же мы тут опускаем вопросы подавления аварийных сообщений, коммита изменений в репы и подобные.