OPS Автоматизация сети: API, Python, Ansible, NetDevOps
Настроить один роутер руками — навык. Настроить двести одинаково, без ошибок, к утру — уже невозможно вручную. Здесь заканчивается «кликающий инженер» и начинается NetDevOps: сеть описывают кодом, катят через pipeline и хранят в git, как обычную инфраструктуру. Это блок автоматизации CCNA 200-301 и — главное — прямой мост из СПД в DevOps. Тот самый переход, ради которого ты шёл «снизу»: ты уже понимаешь пакеты, теперь добавишь код.
- Почему CLI/SNMP не годятся для автоматизации и что пришло: NETCONF/RESTCONF, YANG, gNMI
- Форматы данных: JSON / XML / YAML — язык машин
- REST API: методы, коды ответа, токены — как программно управлять контроллером
- Python для сети: requests, Netmiko/NAPALM
- Ansible: playbook, inventory, идемпотентность — декларативно
- SDN / controller-based: control vs data plane, southbound/northbound
- Infrastructure as Code и CI/CD для сети (NetDevOps)
- Мини-лаба с настоящим REST API и плейбук безопасного массового изменения
Модуль 11: у Junos модель candidate→commit→rollback — концептуальный предок «инфраструктуры как кода». Модуль 17: структурированные данные и telemetry (YANG/gNMI) — сегодня они же несут конфигурацию. Модуль 15/16: одну и ту же настройку на сотнях устройств руками не раскатать — вот зачем автоматизация. Это финал трека: собираем всё в «сеть как код».
1. Заявка: «добавить VLAN на 200 коммутаторов к утру»
Руками — это 200 SSH-сессий, копипаст, неизбежные опечатки и пропуски. Автоматизацией — один прогон на несколько минут, одинаково на всех, с проверкой. Разница между «инженер, которого хватает на 20 устройств» и «инженер, который управляет тысячами» — вот в этом модуле.
2. Почему CLI не масштабируется
Ручной CLI упирается в три стены, и каждую закрывает автоматизация:
| Проблема ручного CLI | Что даёт автоматизация |
|---|---|
| Не масштабируется: 200 устройств × ручной ввод | один прогон на все сразу |
| Человеческие ошибки: опечатки, пропуски | один проверенный шаблон, применённый одинаково |
| Нет воспроизводимости и истории «кто что менял» | конфиг в git: ревью, история, откат |
| CLI-вывод — текст для человека, парсить хрупко | структурированные данные (JSON/XML) через API |
3. API устройств: NETCONF, RESTCONF, gNMI
CLI придуман для человека — его формат меняется между версиями, и скрипт, парсящий «простыню», ломается. Поэтому появились программные интерфейсы со структурированными данными, описанными моделями YANG (единая схема, что у устройства можно читать/менять):
- NETCONF — управление конфигурацией по XML поверх SSH; есть candidate/commit и rollback (как у Junos из модуля 11).
- RESTCONF — то же по HTTP (REST-стиль), данные в JSON/XML — проще для веб-мира.
- gNMI — современный gRPC-интерфейс: и конфигурация, и стриминговая телеметрия (модуль 17).
Суть одна: машина говорит с машиной структурированными данными, без парсинга текста.
4. Форматы данных: JSON, XML, YAML
Автоматизация — это перекладывание структурированных данных. Три формата, которые надо узнавать:
JSON — в REST-ответах и телеметрии; YAML — в Ansible-плейбуках и inventory; XML — в NETCONF. Все три описывают одни и те же вложенные «ключ → значение», просто разным синтаксисом.
5. REST API — как программно управлять сетью
Контроллеры (Cisco Catalyst/DNA Center, облачные панели, SDN) управляются по REST API поверх HTTPS. Клиент шлёт запрос методом, сервер возвращает данные и код статуса:
| Метод | Действие | |
|---|---|---|
GET | прочитать ресурс | GET /api/vlans → список |
POST | создать | POST /api/vlans (тело — JSON) |
PUT/PATCH | изменить | PUT /api/vlans/55 |
DELETE | удалить | DELETE /api/vlans/55 |
Коды ответа: 2xx — успех (200 OK, 201 Created), 4xx — ошибка клиента (401 не авторизован, 403 запрещено, 404 не найдено), 5xx — ошибка сервера. Доступ обычно по токену (сначала логин → получил токен → шлёшь его в заголовке).
6. Python для сети
Python — лингва франка сетевой автоматизации. Три кита:
- requests — HTTP/REST к контроллерам и сервисам.
- Netmiko — если устройство умеет только SSH/CLI: шлёт команды и аккуратно собирает вывод (мост из «старого мира» в скрипты).
- NAPALM — единый интерфейс к разным вендорам (get facts, загрузка конфигурации, diff, откат) — пишешь код один раз, работает на Cisco/Juniper/Arista.
7. Ansible — декларативно и идемпотентно
Ansible описывает желаемое состояние в YAML-playbook и приводит к нему устройства из inventory (список хостов). Не нужен агент на устройстве — Ansible ходит по SSH/API. Ключевое свойство — идемпотентность:
changed=0).
Никаких «дважды применил — сломал». Прогон предсказуем и безопасен.ansible-playbook.8. SDN и controller-based networking
Классически «мозг» (принятие решений — control plane) и «мышцы» (пересылка пакетов — data plane) живут в каждом устройстве. SDN (Software-Defined Networking) выносит мозг в контроллер: он держит общую картину и раздаёт политику, а устройства только пересылают трафик.
Для CCNA достаточно понимать разделение плоскостей и идею northbound/southbound; на практике это Cisco SD-Access/DNA Center, Meraki, а в ЦОД — фабрики с контроллером.
9. NetDevOps: сеть как код в CI/CD
Финальная сборка идей — Infrastructure as Code для сети:
10. Мини-лаба: потрогай настоящий REST API
Что понять: ты сейчас сделал ровно то, что делает сетевая автоматизация — запросил ресурс по REST и получил JSON, готовый к обработке, без единой строки парсинга «простыни». Отсюда до «GET список VLAN с контроллера» — один шаг.
11. Плейбук: безопасно катить изменение на парк
Прежде чем идти по шагам, договоримся о главном принципе зрелой автоматизации — единый источник правды (source of truth). Желаемое состояние сети живёт в одном месте: конфигурации и переменные — в git, инвентарь устройств (адреса, роли, площадки) — в системе вроде NetBox. Устройство больше не «источник истины», а его отражение: если чей-то ручной хотфикс разошёлся с git, это дрейф конфигурации — его находят регулярным сравнением (diff) и возвращают сеть к описанному состоянию. Без этого принципа автоматизация быстро превращается в генератор сюрпризов: скрипт уверенно катит «правильный» конфиг поверх чужой ночной правки. С ним — каждое изменение проходит один и тот же безопасный конвейер:
--check (dry-run) покажет, что изменится, ничего
не применяя. Проверь на тестовом устройстве.12. Частые ошибки и вопрос с собеседования
1) Парсить CLI-вывод регулярками вместо API → ломается на новой версии IOS. 2) Не использовать dry-run/canary → одна ошибка кладёт весь парк. 3) Хранить пароли/токены в открытом виде в репозитории → утечка (нужны vault/секреты). 4) Забыть про идемпотентность и «слепо» гнать команды → непредсказуемый результат при повторе.
13. Словарик модуля
| Термин | По-английски | Смысл в одну строку |
|---|---|---|
| Императивно/декларативно | imperative / declarative | «введи команды» vs «вот желаемое состояние» |
| Идемпотентность | idempotency | повтор не делает лишних изменений |
| IaC | infrastructure as code | конфигурация в git: ревью, история, откат |
| NETCONF/RESTCONF | NETCONF/RESTCONF | API управления конфигом (XML/JSON, модели YANG) |
| YANG | YANG | модель данных: что у устройства можно читать/менять |
| REST API | REST | GET/POST/PUT/DELETE поверх HTTP, коды 2xx/4xx/5xx |
| JSON / YAML / XML | — | форматы структурированных данных |
| Netmiko / NAPALM | — | Python-библиотеки для CLI/мультивендорной автоматизации |
| Ansible playbook | playbook | YAML-описание желаемого состояния |
| SDN / control plane | software-defined networking | «мозг» в контроллере, устройства — пересылка |
| Southbound/Northbound | — | API контроллера вниз (к железу) и вверх (к приложениям) |
1. Скрипт на регулярках, разбирающий вывод show ip int brief, сломался после апгрейда IOS. Как надо было?
Не парсить текст, а брать структурированные данные через API (RESTCONF/NETCONF по YANG) или, если только CLI, — через библиотеки вроде Netmiko/TextFSM с готовыми шаблонами. Текстовый вывод меняется между версиями; API — стабильный контракт. Отсюда правило: «данные для машины — из API, не из глаз».
2. Playbook добавляет VLAN. Его случайно запустили дважды. Что произойдёт при идемпотентности?
Ничего плохого: первый прогон добавит VLAN (changed=1), второй увидит, что он уже есть, и не сделает изменений (changed=0). В этом смысл декларативности — описано желаемое состояние, а не «слепые» команды, которые при повторе могли бы навредить.
3. Нужно раскатать рискованное изменение на 200 устройств. Как минимизировать риск?
Ревью diff в git → dry-run (--check) → тест в лабе → canary (1–2 устройства, потом
небольшая группа, потом всё) → держать путь отката (прошлая версия в git, бэкап конфигов). Не
«всё разом на живую» — так одна ошибка не кладёт всю сеть.
4. Чем «мозг» в SDN-контроллере отличается от обычной сети, и что такое northbound?
В обычной сети control plane (решения) есть в каждом устройстве; в SDN он вынесен в контроллер с общей картиной, а устройства — только data plane (пересылка). Northbound — это REST API контроллера «вверх», через который приложения/автоматизация управляют всей сетью как единым целым; southbound — «вниз», к устройствам (NETCONF/OpenFlow).
🎓 Ты прошёл трек уровня CCNA → CCNP
От электрического импульса в кабеле — до автоматизации сети кодом. Ты умеешь считать подсети, поднимать OSPF и BGP, читать дампы, строить услуги оператора, защищать порты, наблюдать за сетью и программировать её. Это фундамент, которого нет у большинства, кто приходит в DevOps «сверху». Дальше — этап II маршрута: DevOps. Он уже проложен: Linux вглубь, Bash/Python, Git, Docker, Nginx и Облако AWS — а твоя сетевая база (VPC, маршрутизация, security groups) станет там суперсилой. Один клик «Продолжить» ждёт на дашборде, а вся карта маршрута — на этапе II. Не забывай про повторение — знания держатся, когда к ним возвращаешься.