
V tem članku bom predstavil, kako nastaviti OpenDaylight za delovanje s spletno opremo, prav tako pa bom prikazal, kako lahko s pomočjo Postman in preprostih RESTCONF poizvedb nad to opremo upravljamo. Z žičnato opremo ne bomo delali, temveč bomo namesto tega vzpostavili majhne virtualne laboratorije z enim samim usmerjevalnikom s pomočjo Vrnetlab nad Ubuntu 20.04 LTS.
Podrobno nastavitev bom najprej prikazal na primeru usmerjevalnika Juniper vMX 20.1R1.11, nato pa bomo primerjali z nastavitvijo Cisco xRV9000 7.0.2.
Vsebina
- Potrebna znanja
- Del 1: na kratko obravnavamo OpenDaylight (v nadaljevanju ODL), Postman in Vrnetlab in zakaj jih potrebujemo
- Del 2: opis virtualne laboratorije
- Del 3: nastavljamo OpenDaylight
- Del 4: nastavljamo Vrnetlab
- Del 5: s pomočjo Postman priključujemo virtualni usmerjevalnik (Juniper vMX) k ODL
- Del 6: pridobivamo in spreminjamo konfiguracijo usmerjevalnika s pomočjo Postman in ODL
- Del 7: dodajamo Cisco xRV9000
- Zaključek
- P.S.
- Seznam Literatur
Potrebna znanja
Da članek ne bi postal preobširen, sem nekatere tehnične podrobnosti izpustil (s povezavami na literaturo, kjer jih lahko preberete).
Zaradi tega vam predlagam teme, ki bi jih bilo dobro (a skoraj ni obvezno) poznati pred branjem:
- ,
- /
Del 1: malo teorije

- Odprta SDN platforma za upravljanje in avtonomizacijo vseh vrst omrežij, podprta z , jednom
- Java inside
- Temelji na Model-Driven Service Abstraction Level (MD-SAL)
- Uporablja YANG modele za samodejno ustvarjanje RESTCONF API omrežnih naprav
Glavni modul za upravljanje omrežja. Prav preko njega bomo komunicirali s povezanimi napravami. Upravljano preko svojega lastnega API.
O OpenDaylight lahko preberete več .

- Orodje za testiranje API
- Preprosto in uporabniku prijazno vmesje
V našem primeru nas zanima kot sredstvo za pošiljanje REST poizvedb na API OpenDaylight. Seveda lahko poizvedbe pošiljate tudi ročno, vendar v Postmanu vse izgleda zelo jasno in za naše cilje se odlično prilega.
Za tiste, ki želite raziskovati: napisanih je veliko učnih materialov o njem ().

- Orodje za uvajanje virtualnih usmerjevalnikov v Dockerju
- Podpira: Cisco XRv, Juniper vMX, Arista vEOS, Nokia VSR in druge.
- Open Source
Zelo zanimivo, a malo znano orodje. V našem primeru bomo s pomočjo tega zagnali Juniper vMX in Cisco xRV9000 na običajnem Ubuntu 20.04 LTS.
Več o njem lahko preberete na .
Del 2: laboratorijska vaja
V okviru tega tutorja bomo nastavljali naslednji sistem:

Kako to funkcionira
- Juniper vMX dviga se Docker v zabojniki (s pomočjo Vrnetlab) in deluje kot običajen virtualni usmerjevalnik.
- ODL povezan z usmerjevalnikom in omogoča upravljanje z njim.
- Postman zažene na ločenem strežniku in prek njega pošiljamo ukaze ODL: za povezovanje/odstranjevanje usmerjevalnika, spreminjanje konfiguracije itd.
Komentar o napravi sistema
Juniper vMX in ODL zahteva precej veliko virov za stabilno delovanje. Samo vMX zahteva 6 Gb pomnilnika in 4 jedra. Zato je bila sprejeta odločitev, da vse 'težke' naloge preselimo na ločen strežnik (Heulett Packard Enterprise MicroServer ProLiant Gen8, Ubuntu 20.04 LTS). Usmerjevalnik, seveda, na njej ne 'letijo', a za manjše eksperimentiranje je zmogljivosti dovolj.
Del 3: konfiguriramo OpenDaylight

Trenutna različica ODL ob pisanju članka je - Magnesium SR1
1) Namestimo Java OpenJDK 11 (za podrobnejšo namestitev )
ubuntu:~$ sudo apt install default-jdk2) Počakamo in prenesemo najnovejšo verzijo ODL
3) Razpakiramo preneseno arhivo
4) Preidemo v ustvarjeno direktorij
5) Začnemo ./bin/karaf
V tem koraku ODL moral zagnati in se znajdemo v konzoli (Za dostop od zunaj se uporablja vrata 8181, kar bomo izkoristili kasneje).
Nato namestimo ODL Features, namenjene delu s protokoli NETCONF in RESTCONF. V konzoli ODL izvedemo:
opendaylight-user@root> feature:install odl-netconf-topology odl-restconf-allPri tem zaključimo preprosto konfiguracijo. ODL (Podrobneje lahko preberete ).
Del 4: konfiguriramo Vrnetlab

Priprava sistema
Pred namestitvijo Vrnetlab mora biti nameščene potrebne pakete. Takšne kot so , , :
ubuntu:~$ sudo apt update
ubuntu:~$ sudo apt -y install python3-bs4 sshpass make
ubuntu:~$ sudo apt -y install git
ubuntu:~$ sudo apt install -y
apt-transport-https ca-certificates
curl gnupg-agent software-properties-common
ubuntu:~$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
ubunt...
stable"
ubuntu:~$ sudo apt update
ubuntu:~$ sudo apt install -y docker-ce docker-ce-cli containerd.ioNamestitev Vrnetlab
Za namestitev Vrnetlab kloniramo ustrezen repozitorij z githuba:
ubuntu:~$ cd ~
ubunt... git clone https://github.com/plajjan/vrnetlab.gitPreidemo v direktorij vrnetlab:
ubuntu:~$ cd ~/vrnetlabTu lahko vidite vse skripte, potrebne za zagon. Upoštevajte, da je za vsako vrsto usmerjevalnika ustvarjena ustrezna mapa:
ubuntu:~\/vrnetlab$ ls
CODE_OF_CONDUCT.md config-engine-lite openwrt vr-bgp
CONTRIBUTING.md csr routeros vr-xcon
LICENSE git-lfs-repo.sh sros vrnetlab.sh
Makefile makefile-install.include topology-machine vrp
README.md makefile-sanity.include veos vsr1000
ci-builder-image makefile.include vmx xrv
common nxos vqfx xrv9kUstvarjanje image usmerjevalnika
Vsak usmerjevalnik, ki ga podpira Vrnetlab, ima svojo edinstveno nastavitev. V primeru Juniper vMX nam zadostuje, da v mapo vmx dodamo .tgz arhiv z usmerjevalnikom (lahko ga prenesete z ) in izvedemo ukaz make:
ubuntu:~$ cd ~\/vrnetlab\/vmx
ubuntu:~$ # Kopiramo .tgz arhiv z usmerjevalnikom v to mapo
ubuntu:~$ sudo makeSestavljanje slike vMX bo trajalo približno 10-20 minut. Pravšnji čas za kavo!
Zakaj pa traja tako dolgo, vprašate?
Prevod avtorja na to vprašanje:
"To je povezano s tem, da ob prvem zagonu VCP (Control Plane) prebere konfiguracijsko datoteko, ki določa, ali bo deloval kot VRR VCP v vMX. Prej se je ta zagon izvajal ob zagonu Dockerja, kar je pomenilo, da je VCP vedno znova zagnal, preden je postal virtualni usmerjevalnik dostopen, kar je povzročilo dolge čase nalaganja (približno 5 minut). Zdaj se prvi zagon VCP izvaja med gradnjo Docker image-a, in ker gradnje Dockerja ni mogoče zagnati s parametrom —privileged, to pomeni, da qemu deluje brez strojnega pospeševanja KVM, zato gradnja traja zelo dolgo. Med tem postopkom se izpiše veliko zapisov, tako da boste vsaj videli, kaj se dogaja. Mislim, da dolga gradnja ni tako strašna, ker image ustvarimo enkrat, zagnati pa ga moramo večkrat."
Nato bomo lahko videli image našega usmerjevalnika v 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 101MBZačnemo kontejner vr-vmx
Zagnali ga bomo z ukazom:
ubuntu:~$ sudo docker run -d --privileged --name jun01 b1b2369b453cNato lahko pogledamo informacije o aktivnih kontejnerjih:
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 jun01Povežemo se z usmerjevalnikom
IP naslov omrežnega vmesnika usmerjevalnika lahko pridobite z naslednjim ukazom:
ubuntu:~$ sudo docker inspect --format '{{.NetworkSettings.IPAddress}}' jun01
172.17.0.2По умолчанию, Vrnetlab создает у роутера пользователя vrnetlab/VR-netlab9.
Подключаемся с помощью ssh:
ubuntu:~$ ssh vrnetlab@172.17.0.2
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На этом настройка роутера завершена.
Рекомендации по установке для роутеров различных вендоров можно найти на в соответствующих директориях.
Часть 5: Postman — подключаем роутер к OpenDaylight
Установка Postman
Для установки достаточно скачать приложение .
Подключение роутера к ODL
Создадим PUT запрос:

- Строка запроса:
PUT http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01 - Тело запроса (вкладка Body):
jun01 172.17.0.2 22 vrnetlab VR-netlab9 false jun01_cache - На вкладке Authorization необходимо выставить параметр
Basic Authи логин/пароль: admin/admin. Это необходимо для доступа к ODL:

- На вкладке Headers необходимо добавить два заголовка:
- Accept application/xml
- Content-Type application/xml
Наш запрос сформирован. Отправляем. Если все было настроено правильно, то нам должен вернуться статус "201 Created":
![]()
Что делает этот запрос?
Мы создаем node внутри ODL с параметрами реального роутера, к которому мы хотим получить доступ.
xmlns="urn:TBD:params:xml:ns:yang:network-topology"
xmlns="urn:opendaylight:netconf-node-topology"Это внутренние пространства имен 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:

Komentar: Da bi videli najnovije, u mom slučaju trebalo je da čekam oko 10 minuta nakon izvršenja PUT, dok se sve YANG shema izveze na ODL. Do tog trenutka, prilikom izvršenja ovog GET zahteva biće prikazano sledeće:

Brišemo ruter
Создадим DELETE запрос:
- Строка запроса:
DELETE http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01 - На вкладке Authorization необходимо выставить параметр
Basic Authи логин/пароль: admin/admin.
Deo 6: Menjamo konfiguraciju rutera
Dobijamo konfiguraciju
Создадим 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.
Šaljemo. Trebalo bi da dobijemo status "200 OK" i konfiguraciju rutera:

Kreiramo konfiguraciju
Kao primer kreiraćemo sledeću konfiguraciju i izmeniti je:
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 - Тело запроса (вкладка Body):
- На вкладке Authorization необходимо выставить параметр
Basic Authи логин/пароль: admin/admin. - На вкладке Headers необходимо добавить два заголовка:
- Accept application/xml
- Content-Type application/xml
Nakon slanja trebali bismo dobiti status "204 No Content"
Da bismo proverili da li je konfiguracija promenjena, možemo iskoristiti prethodni zahtev. Ali za primer, kreiraćemo još jedan koji će nam prikazati informacije samo o protokolima konfiguriranim na ruteru.
Создадим 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.
Nakon izvršenja zahteva videćemo sledeće:

Menjamo konfiguraciju
Izmenićemo informacije o BGP protokolu. Nakon naših akcija one će izgledati ovako:
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 - Тело запроса (вкладка Body):
- На вкладке Authorization необходимо выставить параметр
Basic Authи логин/пароль: admin/admin. - На вкладке Headers необходимо добавить два заголовка:
- Accept application/xml
- Content-Type application/xml
Koristeći prethodni GET zahtev, vidimo izmene:

Brišemo konfiguraciju
Создадим DELETE запрос:
- Строка запроса:
DELETE 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.
Ob klicu GET iz zahteva sa informacijama o protokolima videćemo sledeće:

Dopolnilo:
Da bismo promenili konfiguraciju, nije neophodno slati telo zahteva u formatu XML. To možemo uraditi i u formatu JSON.
Za to, na primer, u zahtevu PUT za promenu konfiguracije zamenjujemo telo zahteva sa:
{
"junos-conf-protocols:protocols": {
"bgp": {
"description" : "Promenjen u postmanu"
}
}
}Ne zaboravite da promenite na kartici Headers zaglavlja na:
- Accept application/json
- Content-Type application/json
Nakon slanja dobićemo sledeći rezultat (Odgovor gledamo koristeći GET Запрос):

Часть 7: добавляем Cisco xRV9000
Что мы все знаем о Джунипере? Давайте поговорим о Cisco!
У меня есть версия xRV9000 7.0.2 (система, требующая 8Gb RAM и 4 ядра. В свободном доступе не лежит, поэтому обращайтесь в ) — его и запустим.
Запуск контейнера
Процесс создания 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 vrnetlab@172.17.0.2
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 запрос, чтобы проверить, что все подключилось:

Menjamo konfiguraciju
Настроим следующую конфигурацию:
!
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 - Тело запроса (вкладка Body):
{ "processes": { "process": [ { "process-name": "LAB", "default-vrf": { "process-scope": { "ldp-auto-config": [ null ] } } } ] } } - На вкладке 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.
После выполнения должны увидеть следующее:

Для удаления конфигурации используем DELETE:
- Строка запроса:
DELETE 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.
Zaključek
Kot ste opazili, postopki povezovanja Cisco in Juniper z OpenDaylight se ne razlikujejo — to odpira precej široke možnosti za ustvarjalnost. Od upravljanja s konfiguracijami vseh komponent omrežja do ustvarjanja lastnih omrežnih politik.
V tem priročniku sem predstavil najenostavnejše primere interakcije s omrežno opremo prek OpenDaylight. Brez dvoma so zahteve iz predstavljenih primerov lahko precej zapletene in omogočajo nastavitev celotnih storitev s preprostim klikom miške — vse je omejeno le na vašo domišljijo.
Nastaviće se…
P.S.
Če že vse to veste ali pa ste se z navdušenjem še posebej zainteresirali za ODL, priporočam, da razmislite o razvoju aplikacij na ODL nadzorniku. Začeti lahko .
Uspešne eksperimente!
Seznam literature
- / Brian Linkletter
- OpenDaylight Cookbook / Mathieu Lemay, Alexis de Talhouet, et al.
- Network Programmability with YANG / Benoît Claise, Loe Clarke, Jan Lindblad.
- Learning XML, Second Edition / Erik T. Ray.
- Effective DevOps / Jennifer Davis, Ryn Daniels.
Izvor: habr.com

