Привет, Хабр! В этой статье мы хотели бы поговорить об автоматизации сетевой инфраструктуры.
Будет представлена рабочая схема сети, которая работает в одной небольшой, но очень гордой компании.
Все совпадения с реальным сетевым оборудованием случайны.
Мы рассмотрим случай, произошедший в этой сети, который мог привести к остановке бизнеса на длительное время и серьезным финансовым потерям.
Решение данного случая очень хорошо вписывается в концепцию «Автоматизация сетевой инфраструктуры».
Используя средства автоматизации, мы покажем, как можно эффективно решать сложные задачи за короткое время, и поразмышляем, почему эти проблемы нужно решать так, а не иначе (через консоль).
Отказ от ответственности Нашими основными инструментами автоматизации являются Ansible (как инструмент автоматизации) и Git (как репозиторий для сборников сценариев Ansible).
Сразу хочу оговориться, что это не вводная статья, где мы говорим о логике Ansible или Git, а объясняем базовые вещи (например, что такое роли\задачи\модули\файлы инвентаря\переменные в Ansible, или что происходит, когда вы вводите команды git push или git commit).
Эта история не о том, как можно попрактиковаться в Ansible и настроить NTP или SMTP на своем оборудовании.
Это история о том, как можно быстро и желательно без ошибок решить сетевую проблему.
Также желательно хорошо понимать, как работает сеть, в частности, что такое стек протоколов TCP/IP, OSPF, BGP. Мы также исключим из уравнения выбор Ansible и Git. Если вам все же необходимо выбрать конкретное решение, настоятельно рекомендуем прочитать книгу «Программирование и автоматизация сетей.
Навыки сетевого инженера нового поколения» Джейсона Эдельмана, Скотта С.
Лоу и Мэтта Освальта.
Теперь к делу.
Постановка задачи
Представим ситуацию: 3 часа ночи вы крепко спите и видите сны.Телефонный звонок.
Технический директор звонит: - Да? — ###, ####, #####, кластер фаервола упал и не поднимается!!! Ты трешь глаза, пытаясь осмыслить происходящее и представить, как такое вообще могло произойти.
По телефону слышно, как рвутся волосы на голове директора, и он просит перезвонить, потому что по второй линии ему звонит генерал.
Через полчаса вы собрали первые вступительные записи дежурной смены, разбудили всех, кого можно было разбудить.
В итоге технический директор не врал, все как есть, основной кластер фаерволов упал, и никакие элементарные телодвижения не приводят его в чувство.
Все услуги, которые предлагает компания, не работают. Выбирайте задачу на свой вкус, каждый запомнит что-то свое.
Например, после ночного обновления при отсутствии большой нагрузки все работало хорошо, и все довольные легли спать.
Трафик начал идти, а буферы интерфейса начали переполняться из-за ошибки в драйвере сетевой карты.
Джеки Чан может хорошо описать ситуацию.
Спасибо, Джеки.
Не очень приятная ситуация, не так ли? Оставим на время нашу сеть, братан, с его грустными мыслями.
Давайте обсудим, как будут развиваться события дальше.
Предлагаем следующий порядок изложения материала.
- Давайте посмотрим на сетевую диаграмму и посмотрим, как она работает;
- Мы опишем, как мы переносим настройки с одного роутера на другой с помощью Ansible;
- Давайте поговорим об автоматизации ИТ-инфраструктуры в целом.
Схема и описание сети
СхемаДавайте рассмотрим логическую схему нашей организации.
Мы не будем называть конкретных производителей оборудования; для целей данной статьи это не имеет значения (Внимательный читатель догадается, какое оборудование используется) .
Это лишь одно из хороших преимуществ работы с Ansible; при настройке нас вообще не волнует, что это за оборудование.
Для понимания, это оборудование известных производителей, таких как Cisco, Juniper, Check Point, Fortinet, Palo Alto. можно заменить на свой вариант. У нас есть две основные задачи по перемещению трафика:
- Обеспечить публикацию наших услуг, которые являются бизнесом компании;
- Обеспечить связь с филиалами, удаленным дата-центром и сторонними организациями (партнерами и клиентами), а также доступ филиалов к сети Интернет через центральный офис.
- Два пограничных маршрутизатора (БРД-01, БРД-02);
- Кластер межсетевых экранов (FW-CLUSTER);
- Основной переключатель (L3-CORE);
- Маршрутизатор, который станет спасательным кругом (по мере решения проблемы перенесем настройки сети из FW-CLUSTER в АВАРИЙНЫЙ) (АВАРИЙНЫЙ);
- Коммутаторы для управления сетевой инфраструктурой (L2-MGMT);
- Виртуальная машина с Git и Ansible (VM-АВТОМАТИЗАЦИЯ);
- Ноутбук, на котором ведется тестирование и разработка плейбуков для Ansible (Laptop-Automation).
- Зона 0 – зона, включающая маршрутизаторы, отвечающие за передачу трафика в зоне EXCHANGE;
- Зона 1 – зона, включающая маршрутизаторы, отвечающие за работу сервисов компании;
- Область 2 – область, включающая маршрутизаторы, отвечающие за маршрутизацию трафика управления;
- Зона N – зоны филиальных сетей.
Часть белых адресов маршрутизируется напрямую в FW-CLUSTER (адреса, на которых работают сервисы компании), часть маршрутизируется через зону EXCHANGE (внутренние сервисы компании, требующие внешние IP-адреса, и внешние NAT-адреса для офисов).
Далее трафик идет на созданные на L3-CORE виртуальные маршрутизаторы с белыми и серыми адресами (зонами безопасности).
Сеть управления использует выделенные коммутаторы и представляет собой физически выделенную сеть.
Сеть управления также разделена на зоны безопасности.
АВАРИЙНЫЙ маршрутизатор физически и логически дублирует FW-КЛАСТЕР.
Все интерфейсы на нем отключены кроме тех, которые смотрят в сеть управления.
Автоматизация и ее описание
Мы разобрались, как работает сеть.Теперь пошагово рассмотрим, что мы будем делать для перевода трафика с FW-CLUSTER на EMERGENCY:
- Отключаем интерфейсы на коммутаторе ядра (L3-CORE), которые подключают его к FW-CLUSTER;
- Отключаем интерфейсы на коммутаторе ядра L2-MGMT, которые подключают его к FW-CLUSTER;
- Настраиваем АВАРИЙНЫЙ роутер (по умолчанию на нем отключены все интерфейсы, кроме связанных с L2-MGMT):
- Включаем интерфейсы АВАРИЙНО;
- Настраиваем внешний IP-адрес (для NAT), который был на FW-кластере;
- Генерируем gARP-запросы, чтобы мак-адреса в arp-таблицах L3-CORE менялись с FW-Cluster на EMERGENCY;
- Мы регистрируем маршрут по умолчанию как статический для BRD-01, BRD-02;
- Создание правил NAT;
- Поднимите уровень до АВАРИЙНОЙ зоны OSPF 1;
- Поднимите уровень до АВАРИЙНОЙ зоны OSPF 2;
- Изменяем стоимость маршрутов в Зоне 1 на 10;
- Мы меняем стоимость маршрута по умолчанию в Зоне 1 на 10;
- Меняем IP-адреса, связанные с L2-MGMT (на те, что были на FW-CLUSTER);
- Генерируем gARP-запросы, чтобы мак-адреса в arp-таблицах L2-MGMT менялись с FW-CLUSTER на EMERGENCY.
Три часа ночи, колоссальный стресс, ошибка на любом этапе могут привести к новым проблемам.
Готовы вводить команды через CLI? Да? Ладно, пойди хотя бы ополосни лицо, выпей кофейку и соберись с силой воли.
Брюс, пожалуйста, помоги ребятам.
Что ж, мы продолжаем совершенствовать нашу автоматизацию.
Ниже приведена диаграмма того, как работает плейбук в терминах Ansible. Эта схема отражает то, что мы описали чуть выше, это просто конкретная реализация в Ansible.
На этом этапе мы поняли, что нужно сделать, разработали плейбук, провели тестирование и теперь готовы его запустить.
Еще одно небольшое лирическое отступление.
Легкость этой истории не должна вводить вас в заблуждение.
Процесс написания пьес оказался не таким простым и быстрым, как могло показаться.
Тестирование заняло довольно много времени, был создан виртуальный стенд, решение тестировалось много раз, было проведено около 100 тестов.
Запускаем.
Есть ощущение, что все происходит очень медленно, где-то ошибка, что-то в итоге не работает. Ощущение прыжка с парашютом, но парашют не хочет сразу раскрываться.
это нормально.
Далее читаем результат выполненных операций Ansible playbook (IP-адреса заменены в целях секретности):
Готовый! На самом деле он не совсем готов, не забывайте про конвергенцию протоколов динамической маршрутизации и загрузку большого количества маршрутов в FIB. Мы никак не можем на это повлиять.[xxx@emergency ansible]$ ansible-playbook -i /etc/ansible/inventories/prod_inventory.ini /etc/ansible/playbooks/emergency_on.yml PLAY [------->Emergency on VCF] ******************************************************** TASK [vcf_junos_emergency_on : Disable PROD interfaces to FW-CLUSTER] ********************* changed: [vcf] PLAY [------->Emergency on MGMT-CORE] ************************************************ TASK [mgmt_junos_emergency_on : Disable MGMT interfaces to FW-CLUSTER] ****************** changed: [m9-03-sw-03-mgmt-core] PLAY [------->Emergency on] **************************************************** TASK [mk_routeros_emergency_on : Enable EXT-INTERNET interface] ************************** changed: [m9-04-r-04] TASK [mk_routeros_emergency_on : Generate gARP for EXT-INTERNET interface] **************** changed: [m9-04-r-04] TASK [mk_routeros_emergency_on : Enable static default route to EXT-INTERNET] **************** changed: [m9-04-r-04] TASK [mk_routeros_emergency_on : Change NAT rule to EXT-INTERNET interface] **************** changed: [m9-04-r-04] => (item=12) changed: [m9-04-r-04] => (item=14) changed: [m9-04-r-04] => (item=15) changed: [m9-04-r-04] => (item=16) changed: [m9-04-r-04] => (item=17) TASK [mk_routeros_emergency_on : Enable OSPF Area 1 PROD] ****************************** changed: [m9-04-r-04] TASK [mk_routeros_emergency_on : Enable OSPF Area 2 MGMT] ***************************** changed: [m9-04-r-04] TASK [mk_routeros_emergency_on : Change OSPF Area 1 interfaces costs to 10] ***************** changed: [m9-04-r-04] => (item=VLAN-1001) changed: [m9-04-r-04] => (item=VLAN-1002) changed: [m9-04-r-04] => (item=VLAN-1003) changed: [m9-04-r-04] => (item=VLAN-1004) changed: [m9-04-r-04] => (item=VLAN-1005) changed: [m9-04-r-04] => (item=VLAN-1006) changed: [m9-04-r-04] => (item=VLAN-1007) changed: [m9-04-r-04] => (item=VLAN-1008) changed: [m9-04-r-04] => (item=VLAN-1009) changed: [m9-04-r-04] => (item=VLAN-1010) changed: [m9-04-r-04] => (item=VLAN-1011) changed: [m9-04-r-04] => (item=VLAN-1012) changed: [m9-04-r-04] => (item=VLAN-1013) changed: [m9-04-r-04] => (item=VLAN-1100) TASK [mk_routeros_emergency_on : Change OSPF area1 default cost for to 10] ****************** changed: [m9-04-r-04] TASK [mk_routeros_emergency_on : Change MGMT interfaces ip addresses] ******************** changed: [m9-04-r-04] => (item={u'ip': u'х.
х.
n.254', u'name': u'VLAN-803'}) changed: [m9-04-r-04] => (item={u'ip': u'х.
х.
n+1.254', u'name': u'VLAN-805'}) changed: [m9-04-r-04] => (item={u'ip': u'х.
х.
n+2.254', u'name': u'VLAN-807'}) changed: [m9-04-r-04] => (item={u'ip': u'х.
х.
n+3.254', u'name': u'VLAN-809'}) changed: [m9-04-r-04] => (item={u'ip': u'х.
х.
n+4.254', u'name': u'VLAN-820'}) changed: [m9-04-r-04] => (item={u'ip': u'х.
х.
n+5.254', u'name': u'VLAN-822'}) changed: [m9-04-r-04] => (item={u'ip': u'х.
х.
n+6.254', u'name': u'VLAN-823'}) changed: [m9-04-r-04] => (item={u'ip': u'х.
х.
n+7.254', u'name': u'VLAN-824'}) changed: [m9-04-r-04] => (item={u'ip': u'х.
х.
n+8.254', u'name': u'VLAN-850'}) changed: [m9-04-r-04] => (item={u'ip': u'х.
х.
n+9.254', u'name': u'VLAN-851'}) changed: [m9-04-r-04] => (item={u'ip': u'х.
х.
n+10.254', u'name': u'VLAN-852'}) changed: [m9-04-r-04] => (item={u'ip': u'х.
х.
n+11.254', u'name': u'VLAN-853'}) changed: [m9-04-r-04] => (item={u'ip': u'х.
х.
n+12.254', u'name': u'VLAN-870'}) changed: [m9-04-r-04] => (item={u'ip': u'х.
х.
n+13.254', u'name': u'VLAN-898'}) changed: [m9-04-r-04] => (item={u'ip': u'х.
х.
n+14.254', u'name': u'VLAN-899'}) TASK [mk_routeros_emergency_on : Generate gARPs for MGMT interfaces] ********************* changed: [m9-04-r-04] => (item={u'ip': u'х.
х.
n.254', u'name': u'VLAN-803'}) changed: [m9-04-r-04] => (item={u'ip': u'х.
х.
n+1.254', u'name': u'VLAN-805'}) changed: [m9-04-r-04] => (item={u'ip': u'х.
х.
n+2.254', u'name': u'VLAN-807'}) changed: [m9-04-r-04] => (item={u'ip': u'х.
х.
n+3.254', u'name': u'VLAN-809'}) changed: [m9-04-r-04] => (item={u'ip': u'х.
х.
n+4.254', u'name': u'VLAN-820'}) changed: [m9-04-r-04] => (item={u'ip': u'х.
х.
n+5.254', u'name': u'VLAN-822'}) changed: [m9-04-r-04] => (item={u'ip': u'х.
х.
n+6.254', u'name': u'VLAN-823'}) changed: [m9-04-r-04] => (item={u'ip': u'х.
х.
n+7.254', u'name': u'VLAN-824'}) changed: [m9-04-r-04] => (item={u'ip': u'х.
х.
n+8.254', u'name': u'VLAN-850'}) changed: [m9-04-r-04] => (item={u'ip': u'х.
х.
n+9.254', u'name': u'VLAN-851'}) changed: [m9-04-r-04] => (item={u'ip': u'х.
х.
n+10.254', u'name': u'VLAN-852'}) changed: [m9-04-r-04] => (item={u'ip': u'х.
х.
n+11.254', u'name': u'VLAN-853'}) changed: [m9-04-r-04] => (item={u'ip': u'х.
х.
n+12.254', u'name': u'VLAN-870'}) changed: [m9-04-r-04] => (item={u'ip': u'х.
х.
n+13.254', u'name': u'VLAN-898'}) changed: [m9-04-r-04] => (item={u'ip': u'х.
х.
n+14.254', u'name': u'VLAN-899'}) PLAY RECAP ************************************************************************
Ждем.
Это сработало.
Теперь все готово.
А в деревне Вилабахо (которая не хочет автоматизировать настройку сети) продолжают мыть посуду.
Брюс (правда, уже другой, но не менее крутой) пытается понять, насколько еще будет происходить ручная перенастройка оборудования.
Еще хотелось бы остановиться на одном важном моменте.
Как нам вернуть все обратно? Через некоторое время мы вернем к жизни наш FW-КЛАСТЕР.
Это основное оборудование, а не резервное, на нем должна работать сеть.
Чувствуете, как сетевики начинают выгорать? Технический директор выслушает тысячу аргументов, почему этого делать нельзя, почему это можно сделать позже.
К сожалению, так работает сеть из кучи патчей, кусков и остатков былой роскоши.
Получается лоскутное одеяло.
Наша задача в целом, не в этой конкретной ситуации, а вообще в принципе, как ИТ-специалистов, — довести работу сети до красивого английского слова «consistency», оно очень многогранное, его можно перевести как: согласованность.
, последовательность, логика, связность, системность, сопоставимость, связность.
Это все о нем.
Только в таком состоянии сеть управляема, мы четко понимаем, что и как работает, четко понимаем, что нужно изменить, если необходимо, четко знаем, куда смотреть, если возникнут проблемы.
И только в такой сети можно выполнять трюки, подобные тем, которые мы только что описали.
Собственно, был подготовлен еще один плейбук, который вернул настройки в исходное состояние.
Логика его работы та же (важно помнить, что порядок выполнения задач очень важен), чтобы не удлинять и без того немаленькую статью, мы решили не публиковать листинг выполнения плейбука.
После проведения таких упражнений вы почувствуете себя намного спокойнее и увереннее в будущем, к тому же любые костыли, которые вы там нагромоздили, сразу же проявят себя.
Любой может написать нам и получить исходники всего написанного кода вместе со всеми книгами.
Контакты в профиле.
выводы
На наш взгляд, процессы, которые можно автоматизировать, еще не выкристаллизовались.Исходя из того, с чем мы столкнулись и что обсуждают наши западные коллеги, пока просматриваются следующие темы:
- Предоставление устройств;
- Сбор данных;
- Составление отчетов;
- Поиск неисправностей;
- Согласие.
Еще хотелось бы немного поговорить об автоматизации.
Каким оно должно быть в нашем понимании:
- Система должна жить без человека, совершенствуясь при этом человеком.
Система не должна зависеть от людей;
- «Операция должна быть экспертной.
Нет класса специалистов, выполняющих рутинные задачи.
Есть специалисты, которые автоматизировали всю рутину и решают только сложные задачи;
- Рутинные/стандартные задачи выполняются автоматически «одним нажатием кнопки», ресурсы не тратятся зря.
Результат таких задач всегда предсказуем и понятен.
- Прозрачность ИТ-инфраструктуры (Меньше рисков эксплуатации, модернизации, внедрения.
Меньше простоев в год);
- Возможность планирования ИТ-ресурсов (Система планирования мощностей - видно сколько потребляется, видно сколько ресурсов требуется в единой системе, а не по письмам и визитам в верхние отделы);
- Возможность сокращения количества ИТ-персонала.
Мы заинтересованы в обсуждении и предложении решений по теме автоматизации ИТ-инфраструктуры.
Теги: #информационная безопасность #Сетевые технологии #git #Системное администрирование #сеть #автоматизация сети #asible
-
Как Попасть В Поисковые Системы В 2004 Году
19 Oct, 24 -
Жж-Сообщество
19 Oct, 24 -
Облегченная Криптография Интернета Вещей
19 Oct, 24 -
Создайте Свой Анонимайзер За 10 Минут
19 Oct, 24