Годами любое изменение в сети означало один и тот же ритуал. Открыть терминал, зайти по SSH на один MikroTik, вставить правило файрвола, перепрыгнуть на следующий роутер, вставить снова и тихо надеяться, что ты нигде не промахнулся с точкой с запятой. В удачный день это занимало два часа. Это история о том, как MikroTik, Terraform и подход "сеть как код" превратили этот ритуал в двадцатиминутный pull request, без единой опечатки в SSH.
Эпоха "зашёл по SSH и молись"
Представь сорок роутеров, настроенных полностью вручную. Копируешь правило с одной коробки на другую, тут поправил IP, там комментарий, и убеждаешь себя, что с точками с запятой всё в порядке. Никакого version control. Никакого отката. Никакого audit trail. Только окно терминала и то, что ты сумел запомнить.
Сценарий провала всегда одинаковый. Что-то падает в 23:00, и ты пытаешься вспомнить, какое правило трогал три часа назад, на каком роутере, и доехал ли твой фикс с двенадцатого устройства до тринадцатого. Если изменение уронило сеть, "откатить" означало заново набрать старый конфиг по памяти. Это не инженерия. Это рулетка.
А знания не жили нигде. Стоило единственному человеку, который понимал схему NAT, уйти в отпуск, и сеть уходила вместе с ним.
Почему про сетевое железо забывают
Серверы получили Infrastructure as Code годы назад. Мы версионируем конфиги приложений, шаблонизируем Kubernetes, ревьюим Terraform для облака в pull request'ах. А сетевые устройства почему-то так и застряли в мире "зашёл и молись": к ним относились как к особым ручным питомцам, которых разрешено трогать только сеньору.
Но ведь у RouterOS есть API. Если у устройства есть API, его можно автоматизировать. Не было ни одной весомой причины держать роутеры вне Git. Была только привычка.
Как это устроено: Terraform разговаривает с RouterOS
Так что я заменил весь ритуал на Terraform-провайдер, который напрямую обращается к MikroTik RouterOS API. Правила файрвола, NAT, DHCP, VLAN, всё описано в HCL и лежит в репозитории, как любая другая инфраструктура.
Несколько Python-скриптов берут на себя то, что Terraform делает неуклюже: массовые операции по десяткам роутеров и слой валидации, который отрабатывает до того, как что-либо будет применено. Эта валидация, тихий герой. Она ловит кривое правило, пересекающиеся подсети, опечатку, раньше, чем они доберутся до живого устройства.
И каждое изменение проходит через pull request. Кто-то читает diff. Кто-то апрувит. Сеть чувствует изменение только после того, как на него посмотрел человек, а не посреди марафона copy-paste в два часа ночи.
Что реально изменилось
Разница "до и после" оказалась совсем не тонкой.
- Время на изменение: с 2-3 часов до 15-20 минут.
- Откат: с "набери заново по памяти" до одного
git revert. - Ошибки: валидация ловит их до применения, а не продакшн ловит их за тебя.
- Audit trail: полная история каждого изменения, на каждом роутере, каждый раз.
git blameпрекрасно работает и для сетевых конфигов. - Онбординг: новый инженер читает HCL в первый же день и понимает всю топологию, вместо того чтобы копаться в истории SSH и спрашивать "кто менял NAT в прошлый четверг?".
Последний пункт важнее экономии времени. Сеть перестала быть племенным знанием и стала тем, что можно просто взять и прочитать.
Скучно, это и есть цель
Вот что меня удивило. Сетевые операции из стрессовых стали скучными. Ни ночного адреналина, ни молитв над точками с запятой, ни археологических раскопок в поисках того, что же изменилось. Просто diff, ревью, apply.
А в сетях скучно, это ровно то, что нужно. Скучно значит предсказуемо. Предсказуемо значит, что штука, на которой держится вся компания, не преподносит сюрпризов в полночь.
Если этого нет в Git, этого не существует
MikroTik, Cisco, Juniper, вендор почти не важен. Принцип один и тот же: опиши в коде, версионируй, ревьюй, применяй безопасно. Конфиг, который живёт в голове у одного человека, умирает в тот момент, когда этот человек уходит в отпуск. Конфиг, который живёт в Git, скучный, версионированный и восстановимый за минуты.
Так что остаётся один настоящий вопрос, который я продолжаю задавать другим инженерам: твой сетевой конфиг в Git или в чьей-то голове?