Технологии
Этот раздел довольно самоуверенный и направлен на то, чтобы познакомить вас с основными инструментами, оставив позади многие другие для краткости. Я настоятельно рекомендую позже взглянуть на список Awesome Network Automation.
Python
Python — популярный язык программирования, когда речь идет об автоматизации сети. Все популярные инструменты и библиотеки для автоматизации сети написаны на Python.
Благодаря плавной кривой обучения и огромной популярности (второй по популярности язык на GitHub после JavaScript на момент написания) Python является отличным выбором для начала программирования.
Основы Python выходят за рамки этого руководства. Я предоставил несколько онлайн-ресурсов, которые могут помочь в изучении Python, в разделе «Ссылки и дополнительная литература», которая будет в других частях сетевой автоматизации.
Чтобы эффективно использовать Python для решения базовых задач автоматизации сети, вам необходимо изучить этот набор навыков:
- Настройка Python в вашей системе
- Использование виртуальных сред и установка пакетов с помощью Pip
- Понимание основных концепций Python, таких, как:
- Переменные
- Структуры данных
- Функции
- Импорт
Как видите, это не так уж сложно, и я рекомендую вам потратить на это немного времени, потому что это значительно упростит вам путь к автоматизации.
Способы программного взаимодействия с сетевыми устройствами
Существует два основных способа программного доступа к сетевым устройствам: интерфейс командной строки и API.
CLI
Долгое время единственным API сетевых устройств был интерфейс командной строки, предназначенный для использования людьми, а не сценариями автоматизации. Вот основные недостатки использования CLI в качестве API:
- Несогласованные выходные данные. Одни и те же выходные данные команд могут отличаться от одной версии NOS (сетевой операционной системы) к другой.
- Неструктурированные данные. Данные, возвращаемые при выполнении команды в CLI, представляют собой обычный текст, что означает, что вам необходимо вручную проанализировать их (т.е. очистить CLI)
- Ненадежное выполнение команды. Вы не получаете код состояния выполненной команды и должны анализировать вывод, чтобы определить, успешно ли выполнена команда или нет.
Несмотря на то, что все больше и больше сетевых поставщиков начинают включать поддержку API в свои продукты, маловероятно, что вам не придется иметь дело с CLI во время вашего пути к автоматизации сети.
Для синтаксического анализа вывода CLI используются регулярные выражения. Не очень удобная технология мягко говоря.
«Я не знаю, кто вы. Я не знаю, что тебе нужно. Если вам нужна техническая помощь, могу сказать, что у меня нет времени. Но у меня есть очень специфический набор регулярных выражений. Регулярные выражения я приобрел за очень долгую карьеру. Регулярные выражения, отладка которых является кошмаром для таких людей, как вы. Если ты оставишь меня сейчас в покое, это будет конец. Я не буду искать вас, я не буду преследовать вас, но если вы этого не сделаете, я буду искать вас, я найду вас и буду использовать их в вашем коде ».
Цитаты самых облачных команд DevOps в Интернете
К счастью, сегодня существует множество инструментов и библиотек, которые упрощают парсинг интерфейса командной строки, выполняя большую часть тяжелой работы с регулярными выражениями.
API
Если вам повезло, и устройства в вашей сети имеют API или, возможно, даже управляются контроллером SDN, этот раздел для вас. Сетевые API делятся на две основные категории: на основе HTTP и NETCONF.
RESTful API
REST означает передачу репрезентативного состояния и определяет набор свойств и ограничений, которым должен соответствовать API, чтобы называться RESTful.
ПРИМЕЧАНИЕ. API на основе HTTP могут быть RESTful и не RESTful. API на основе HTTP, не относящиеся к RESTful, не рассматриваются, поскольку они менее распространены.
API RESTful довольно просты в использовании и понимании, поскольку они основаны на протоколе HTTP. По сути, RESTful API — это просто набор URL-адресов HTTP, по которым вы можете выполнять запросы GET и / или POST, за исключением того, что возвращаемые данные кодируются в JSON или XML, а не в HTML. Поскольку RESTful API основаны на HTTP, они по своей природе не имеют состояния. Это означает, что каждый запрос не зависит от другого и должен содержать всю необходимую информацию для правильной обработки.
Чтобы изучить RESTful API, вы можете использовать такие инструменты, как cURL или Postman, но когда вы будете готовы написать некоторый код с использованием RESTful API, вы можете использовать библиотеку Python, называемую запросами.
В Интернете есть несколько макетов REST API, которые вы можете использовать на практике. Например, kanye.rest и JSONPlaceholder.
NETCONF и RESTCONF
NETCONF — это протокол, специально разработанный для управления сетевыми устройствами. В отличие от REST, он использует SSH в качестве транспорта и в результате сохраняет состояние. Другими ключевыми отличиями NETCONF являются четкое разграничение между конфигурационными и рабочими данными и концепция хранилищ данных конфигурации. NETCONF определяет три хранилища данных: текущая конфигурация, конфигурация запуска и конфигурация кандидата. Возможно, вы знакомы со всеми тремя из них в контексте сетевых устройств. Концепция конфигурации кандидата позволяет доставлять изменение конфигурации, состоящее из множества команд, как одну транзакцию. Это означает, что если только одна команда в транзакции терпит неудачу, транзакция не завершается успешно, что позволяет избежать ситуации, когда применяется частичная конфигурация.
Изучение API-интерфейсов NETCONF не так просто и понятно, как с API-интерфейсами RESTful. Для этого вам необходимо установить интерактивный сеанс SSH с устройством и отправлять длинные команды в кодировке XML. Для программного доступа к API NETCONF существует библиотека Python ncclient.
RESTCONF — это еще один стандартный протокол, который реализует подмножество функций NETCONF (например, транзакции не поддерживаются) и использует HTTP в качестве транспорта и является RESTful.
При выборе между NETCONF и RESTCONF это рекомендуется использовать бывший для прямого взаимодействия с сетевыми устройствами, а последним для взаимодействия с SDN-контроллерами и / или дирижерами.
gRPC и gNMI
gNMI — это новое дополнение к протоколам управления сетью, основанное на gRPC Google и разработанное рабочей группой OpenConfig. Он считается более надежным преемником NETCONF и поддерживает потоковую телеметрию.
Поскольку gNMI еще не настолько развит, как NETCONF, он не очень хорошо поддерживается в Python. Хотя есть несколько библиотек, в которые вы можете заглянуть: cisco-gnmi и pygnmi.
Резюме
Вот сводная таблица, представляющая ключевые свойства типов сетевых API.
REST | NETCONF | RESTCONF | gNMI | |
RFC | — | RFC 6241 | RFC 8040 | Черновой вариант |
Транспорт | HTTP | SSH | HTTP | gRPC (HTTP / 2.0) |
Кодирование данных | XML, JSON | XML | XML, JSON | ProtoBuf (двоичный) |
Сопровождение сделки | ❌ | ✅ | ❌ | ✅ |
Библиотеки Python | Запросы | ncclient | Запросы | cisco-gnmi , pygnmi |