ProHoster > Блог > Администрирование > Автоматизация сетевых сервисов или как собрать виртуальную лабораторию при помощи OpenDaylight, Postman и Vrnetlab
Автоматизация сетевых сервисов или как собрать виртуальную лабораторию при помощи OpenDaylight, Postman и Vrnetlab
В этой статье я расскажу, как настроить OpenDaylight для работы с сетевым оборудованием, а также покажу, как с помощью Postman и простых RESTCONF запросов этим оборудованием можно управлять. Работать с железом мы не будем, а вместо этого развернем небольшие виртуальные лаборатории с одним-единственным роутером с помощью Vrnetlab поверх Ubuntu 20.04 LTS.
Подробную настройку я покажу сначала на примере роутера Juniper vMX 20.1R1.11, а затем мы сравним ее с настройкой Cisco xRV9000 7.0.2.
Содержание
Необходимые знания
Часть 1: кратко обсуждаем OpenDaylight (далее по тексту ODL), Postman и Vrnetlab и зачем они нам потребуются
Часть 2: описание виртуальной лаборатории
Часть 3: настраиваем OpenDaylight
Часть 4: настраиваем Vrnetlab
Часть 5: с помощью Postman подключаем виртуальный роутер (Juniper vMX) к ODL
Часть 6: получаем и изменяем конфигурацию роутера с помощью Postman и ODL
Часть 7: добавляем Cisco xRV9000
Заключение
P.S.
Список Литературы
Необходимые знания
Для того, чтобы статья не превратилась в простыню, некоторые технические подробности я опустил (со ссылками на литературу, где про них можно почитать).
В связи с чем, предлагаю вам темы, которые хорошо бы (но почти не обязательно) знать перед прочтением:
Открытая SDN платформа для управления и автоматизации всевозможных сетей, поддерживаемая Linux Foundation
Java inside
Основан на Model-Driven Service Abstraction Level (MD-SAL)
Использует YANG модели для автоматического создания RESTCONF API сетевых устройств
Основной модуль для управления сетью. Именно через него мы будем общаться с подключенными устройствами. Управляется через свой собственный API.
Более подробно про OpenDaylight можно прочитать здесь.
Инструмент для тестирования API
Простой и удобный для использования интерфейс
В нашем случае он нам интересен как средство для отправки REST запросов на API OpenDaylight’а. Можно, конечно, и вручную запросы отправлять, но в Postman все выглядит очень наглядно и для наших целей подходит как нельзя лучше.
Для желающих покопаться: по нему написано много обучающих материалов (например).
Инструмент для развертывания виртуальных роутеров в Docker’е
Поддерживает: Cisco XRv, Juniper vMX, Arista vEOS, Nokia VSR и др.
Open Source
Очень интересный, но малоизвестный инструмент. В нашем случае с его помощью мы запустим Juniper vMX и Cisco xRV9000 на обычной Ubuntu 20.04 LTS.
В рамках этого туториала мы будем настраиваить следующую систему:
Как это работает
Juniper vMX поднимается в Docker контейнере (средствами Vrnetlab) и функционирует как самый обычный виртуальный роутер.
ODL подключен к роутеру и позволяет управлять им.
Postman запущен на отдельной машине и через него мы отправляем команды ODL: на подключение/удаление роутера, изменение конфигурации и тп.
Комментарий к устройству системы
Juniper vMX и ODL требуют довольно много ресурсов для своей стабильной работы. Один только vMX просит 6 Gb оперативной памяти и 4 ядра. Поэтому было принято решение вынести всех "тяжеловесов" на отдельную машину (Heulett Packard Enterprise MicroServer ProLiant Gen8, Ubuntu 20.04 LTS). Роутер, конечно, на ней не "летает", но для небольших экспериментов производительности хватает.
Часть 3: настраиваем OpenDaylight
Актуальная версия ODL на момент написания статьи — Magnesium SR1
1) Устанавливаем Java OpenJDK 11 (за более подробной установкой сюда)
ubuntu:~$ sudo apt install default-jdk
2) Находим и скачиваем свежую сборку ODLотсюда
3) Разархивируем скачанный архив
4) Переходим в полученную директорию
5) Запускаем ./bin/karaf
На этом шаге ODL должен запуститься и мы окажемся в консоли (Для доступа извне используется порт 8181, чем мы воспользуемся далее).
Далее устанавливаем ODL Features, предназначенные для работы с протоколами NETCONF и RESTCONF. Для этого в консоли ODL выполняем:
Каждый роутер, который поддерживается Vrnetlab, имеет свою уникальную процедуру настройки. В случае Juniper vMX нам достаточно закинуть .tgz архив с роутером (скачать его можно с официального сайта) в директорию vmx и выполнить команду make:
ubuntu:~$ cd ~/vrnetlab/vmx
ubuntu:~$ # Копируем в эту директорию .tgz архив с роутером
ubuntu:~$ sudo make
Сборка образа vMX займет порядка 10-20 минут. Самое время сходить заварить кофе!
"Это связано с тем, что при первом запуске VCP (Control Plane) считывает файл конфигурации, который определяет, будет ли он работать в качестве VRR VCP в vMX. Ранее этот запуск выполнялся во время запуска Docker, но это означало, что VCP всегда перезапускался один раз, прежде чем виртуальный маршрутизатор становился доступным, что приводило к длительному времени загрузки (около 5 минут). Теперь первый запуск VCP выполняется во время сборки образа Docker, и поскольку сборка Docker не может быть запущена с параметром —privileged, это означает, что qemu работает без аппаратного ускорения KVM и, таким образом, сборка занимает очень много времени. Во время этого процесса выводится много логов, так что, по крайней мере, вы сможете увидеть, что происходит. Я думаю, что длительная сборка не так страшна, потому что образ мы создаем один раз, а запускаем множество."
После можно будет увидеть image нашего роутера в Docker:
ubuntu:~$ sudo docker image list
REPOSITORY TAG IMAGE ID CREATED SIZE
vrnetlab/vr-vmx 20.1R1.11 b1b2369b453c 3 weeks ago 4.43GB
debian stretch 614bb74b620e 7 weeks ago 101MB
Запускаем контейнер vr-vmx
Запускаем командой:
ubuntu:~$ sudo docker run -d --privileged --name jun01 b1b2369b453c
Далее можем посмотреть информацию об активных контейнерах:
ubuntu:~$ sudo docker container list
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
120f882c8712 b1b2369b453c "/launch.py" 2 minutes ago Up 2 minutes (unhealthy) 22/tcp, 830/tcp, 5000/tcp, 10000-10099/tcp, 161/udp jun01
Подключаемся к роутеру
IP-адрес сетевого интерфейса роутера можно получить следующей командой:
По умолчанию, Vrnetlab создает у роутера пользователя vrnetlab/VR-netlab9.
Подключаемся с помощью ssh:
ubuntu:~$ ssh [email protected]
The authenticity of host '172.17.0.2 (172.17.0.2)' can't be established.
ECDSA key fingerprint is SHA256:g9Sfg/k5qGBTOX96WiCWyoJJO9FxjzXYspRoDPv+C0Y.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '172.17.0.2' (ECDSA) to the list of known hosts.
Password:
--- JUNOS 20.1R1.11 Kernel 64-bit JNPR-11.0-20200219.fb120e7_buil
vrnetlab> show version
Model: vmx
Junos: 20.1R1.11
На этом настройка роутера завершена.
Рекомендации по установке для роутеров различных вендоров можно найти на github проекта в соответствующих директориях.
Часть 5: Postman — подключаем роутер к OpenDaylight
Установка Postman
Для установки достаточно скачать приложение отсюда.
Подключение роутера к ODL
Создадим PUT запрос:
Строка запроса:
PUT http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01
Это внутренние пространства имен XML (XML namespace) для ODL в соответствии с которыми он создает node.
Далее, соответственно, имя роутера — это node-id, адрес роутера — host и тд.
Самая интересная строчка — последняя. Schema-cache-directory создает директорию, в которую выкачиваются все файлы YANG Schema подключенного роутера. Найти их можно в $ODL_ROOT/cache/jun01_cache.
Проверяем подключение роутера
Создадим GET запрос:
Строка запроса:
GET http://10.132.1.202:8181/restconf/operational/network-topology:network-topology/topology/topology-netconf/
На вкладке Authorization необходимо выставить параметр Basic Auth и логин/пароль: admin/admin.
Отправляем. Должны получить статус "200 OK" и список всех поддерживаемых устройством YANG Schema:
Комментарий: Чтобы увидеть последнее, в моем случае необходимо было подождать порядка 10 минут после выполнения PUT, пока все YANG sсhema выгрузятся на ODL. До этого момента при выполнении данного GET запроса будет выведено следующее:
На вкладке Authorization необходимо выставить параметр Basic Auth и логин/пароль: admin/admin.
Часть 6: Изменяем конфигурацию роутера
Получаем конфигурацию
Создадим GET запрос:
Строка запроса:
GET http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01/yang-ext:mount/
На вкладке Authorization необходимо выставить параметр Basic Auth и логин/пароль: admin/admin.
Отправляем. Должны получить статус "200 OK" и конфигурацию роутера:
Создаем конфигурацию
В качестве примера создадим следующую конфигурацию и поизменяем ее:
protocols {
bgp {
disable;
shutdown;
}
}
Создадим POST запрос:
Строка запроса:
POST http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01/yang-ext:mount/junos-conf-root:configuration/junos-conf-protocols:protocols
На вкладке Authorization необходимо выставить параметр Basic Auth и логин/пароль: admin/admin.
На вкладке Headers необходимо добавить два заголовка:
Accept application/xml
Content-Type application/xml
После отправки должны получить статус "204 No Content"
Чтобы проверить, что конфигурация изменилась, можно воспользоваться предыдущим запросом. Но для примера мы создадим еще один, который выведет нам информацию только о сконфигурированных на роутере протоколах.
Создадим GET запрос:
Строка запроса:
GET http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01/yang-ext:mount/junos-conf-root:configuration/junos-conf-protocols:protocols
На вкладке Authorization необходимо выставить параметр Basic Auth и логин/пароль: admin/admin.
После выполнения запроса увидим следующее:
Изменяем конфигурацию
Изменим информацию о протоколе BGP. После наших действий она будет выглядеть следующим образом:
protocols {
bgp {
disable;
}
}
Создадим PUT запрос:
Строка запроса:
PUT http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01/yang-ext:mount/junos-conf-root:configuration/junos-conf-protocols:protocols
Не забудьте поменять на вкладке Headers заголовки на:
Accept application/json
Content-Type application/json
После отправки получим следующий результат (Ответ смотрим используя GET запрос):
Часть 7: добавляем Cisco xRV9000
Что мы все о Джунипере, да о Джунипере? Давайте о Cisco поговорим!
У меня нашелся xRV9000 версии 7.0.2 (зверюга, которому нужны 8Gb RAM и 4 ядра. В свободном доступе не лежит, поэтому обращайтесь в Cisco) — его и запустим.
Запуск контейнера
Процесс создания Docker контейнера практически ничем не отличается от Juniper. Аналогично, закидываем .qcow2 файл с роутером в директорию, соответствующую его названию, (в данном случае xrv9k) и выполняем команду make docker-image.
Через несколько минут видим, что образ создался:
ubuntu:~$ sudo docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
vrnetlab/vr-xrv9k 7.0.2 54debc7973fc 4 hours ago 1.7GB
vrnetlab/vr-vmx 20.1R1.11 b1b2369b453c 4 weeks ago 4.43GB
debian stretch 614bb74b620e 7 weeks ago 101MB
Производим запуск контейнера:
ubuntu:~$ sudo docker run -d --privileged --name xrv01 54debc7973fc
Через некоторое время смотрим, что контейнер запустился:
ubuntu:~$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
058c5ecddae3 54debc7973fc "/launch.py" 4 hours ago Up 4 hours (healthy) 22/tcp, 830/tcp, 5000-5003/tcp, 10000-10099/tcp, 161/udp xrv01
Подключаемся по ssh:
ubuntu@ubuntu:~$ ssh [email protected]
Password:
RP/0/RP0/CPU0:ios#show version
Mon Jul 6 12:19:28.036 UTC
Cisco IOS XR Software, Version 7.0.2
Copyright (c) 2013-2020 by Cisco Systems, Inc.
Build Information:
Built By : ahoang
Built On : Fri Mar 13 22:27:54 PDT 2020
Built Host : iox-ucs-029
Workspace : /auto/srcarchive15/prod/7.0.2/xrv9k/ws
Version : 7.0.2
Location : /opt/cisco/XR/packages/
Label : 7.0.2
cisco IOS-XRv 9000 () processor
System uptime is 3 hours 22 minutes
Подключаем роутер к OpenDaylight
Добавление происходит совершенно аналогичным с vMX образом. Нужно только названия поменять. PUT запрос:
Через некоторое время вызываем GET запрос, чтобы проверить, что все подключилось:
Изменяем конфигурацию
Настроим следующую конфигурацию:
!
router ospf LAB
mpls ldp auto-config
!
Создадим POST запрос:
Строка запроса:
POST http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/xrv01/yang-ext:mount/Cisco-IOS-XR-ipv4-ospf-cfg:ospf
На вкладке Authorization необходимо выставить параметр Basic Auth и логин/пароль: admin/admin.
На вкладке Headers необходимо добавить два заголовка:
Accept application/json
Content-Type application/json
После его выполнения должны получить статус "204 No Content".
Проверим, что у нас получилось.
Для этого создадим GET запрос:
Строка запроса:
GET http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/xrv01/yang-ext:mount/Cisco-IOS-XR-ipv4-ospf-cfg:ospf
На вкладке Authorization необходимо выставить параметр Basic Auth и логин/пароль: admin/admin.
На вкладке Authorization необходимо выставить параметр Basic Auth и логин/пароль: admin/admin.
Заключение
Итого, как вы могли заметить, процедуры подключения Cisco и Juniper к OpenDaylight не отличаются — это открывает довольно широкий простор для творчества. Начиная от управления конфигурациями всех компонентов сети и заканчивая созданием собственных сетевых политик.
В этом туториале я привел простейшие примеры того, как можно взаимодействовать с сетевым оборудованием при помощи OpenDaylight. Без сомнения, запросы из приведенных примеров можно сделать сильно сложнее и настраивать целые сервисы одним кликом мыши — все ограничено только вашей фантазией*
Продолжение следует…
P.S.
Если вы вдруг все это уже знаете или, наоборот, прошли и вам запал в душу ODL, то рекомендую посмотреть в сторону разработки приложений на контроллере ODL. Начать можно отсюда.