
W tym artykule opowiem, jak skonfigurować OpenDaylight do pracy z urządzeniami sieciowymi, a także pokażę, jak za pomocą Postman i prostych zapytaniach RESTCONF można zarządzać tymi urządzeniami. Nie będziemy pracować z fizycznym sprzętem, zamiast tego uruchomimy małe wirtualne laboratoria z jednym, jedynym routerem za pomocą Vrnetlab na Szczegółową konfigurację pokażę najpierw na przykładzie routera Ubuntu 20.04 LTS.
Juniper vMX 20.1R1.11 , a potem porównamy ją z konfiguracjąCisco xRV9000 7.0.2 Wymagana wiedza.
Spis treści
- : krótko omawiamy
- Part 1OpenDaylight (dalej jako ODL i dlaczego będzie nam potrzebna), Postman i na : opis wirtualnego laboratorium
- Część 2Część 3
- : konfigurujemyCzęść 4 OpenDaylight
- Część 5Część 4 na
- : za pomocąpodłączamy wirtualny router ( Postman Juniper vMX) doCzęść 6 i dlaczego będzie nam potrzebna
- : pobieramy i zmieniamy konfigurację routera za pomocąCzęść 7 Postman i i dlaczego będzie nam potrzebna
- : dodajemy Cisco xRV9000Lista literatury
- Podsumowanie
- P.S.
- Aby artykuł nie stał się zbyt długi, pominąłem niektóre szczegóły techniczne (z linkami do literatury, w której można je przeczytać).
: krótko omawiamy
W związku z tym proponuję tematy, które warto (choć nie jest to konieczne) znać przed przeczytaniem:
NETCONF
- ,
- /
Otwarta platforma SDN do zarządzania i automatyzacji różnych sieci, wspierana przez

- Linux Foundation Java wewnątrz
- Oparta na Model-Driven Service Abstraction Level (MD-SAL)
- Używa modeli YANG do automatycznego tworzenia RESTCONF API urządzeń sieciowych
- Główny moduł do zarządzania siecią. To przez niego będziemy komunikować się z podłączonymi urządzeniami. Zarządzany przez swoje własne API.
Więcej informacji o OpenDaylight można znaleźć
Narzędzie do testowania API .

- Prosty i wygodny interfejs
- W naszym przypadku jest dla nas interesujące jako środek do wysyłania zapytań REST do API OpenDaylight. Można oczywiście ręcznie wysyłać zapytania, ale w Postman wszystko wygląda bardzo przejrzyście i idealnie nadaje się do naszych celów.
Dla tych, którzy chcą zgłębić temat: napisano wiele materiałów szkoleniowych na jego temat (
Narzędzie do wdrażania wirtualnych routerów w Dockerze).

- Obsługuje: Cisco XRv, Juniper vMX, Arista vEOS, Nokia VSR i inne.
- Open Source
- Bardzo interesujące, ale mało znane narzędzie. W naszym przypadku za jego pomocą uruchomimy Juniper vMX i Cisco xRV9000 na zwykłym Ubuntu 20.04 LTS.
Więcej informacji na jego temat można znaleźć na
stronie projektu .
Część 2: laboratoria
W ramach tego samouczka skonfigurujemy następujący system:

Jak to działa
- ) do jest uruchamiany w Docker kontenerze (za pomocą na) i działa jak zwykły wirtualny router.
- i dlaczego będzie nam potrzebna jest podłączony do routera i umożliwia jego zarządzanie.
- Postman jest uruchomiony na osobnej maszynie i przez niego wysyłamy komendy i dlaczego będzie nam potrzebna: do podłączenia/odłączenia routera, zmiany konfiguracji itd.
Komentarz do urządzenia systemu
) do i i dlaczego będzie nam potrzebna wymagają dość dużych zasobów do swojej stabilnej pracy. Sam vMX prosi o 6 Gb pamięci RAM i 4 rdzenie. Dlatego podjęto decyzję, aby przenieść wszystkich "ciężkich" na osobną maszynę (Heulett Packard Enterprise MicroServer ProLiant Gen8, Ubuntu 20.04 LTS). Router, oczywiście, nie "lata" tam, ale na małe eksperymenty wydajności wystarcza.
Część 3: konfigurujemy OpenDaylight

Aktualna wersja ODL w momencie pisania artykułu – Magnesium SR1
1) Instalujemy Java OpenJDK 11 (po szczegółową instalację )
ubuntu:~$ sudo apt install default-jdk2) Znajdujemy i pobieramy najnowszą wersję i dlaczego będzie nam potrzebna
3) Rozpakowujemy pobrany archiwum
4) Przechodzimy do uzyskanej katalogu
5) Uruchamiamy .\/bin\/karaf
Na tym etapie i dlaczego będzie nam potrzebna powinien się uruchomić i znajdziemy się w konsoli (Aby uzyskać dostęp z zewnątrz, używany jest port 8181, z którego skorzystamy później).
Następnie instalujemy ODL Features, przeznaczone do pracy z protokołami. JSON i zapytaniach RESTCONF można zarządzać tymi urządzeniami. Nie będziemy pracować z fizycznym sprzętem, zamiast tego uruchomimy małe wirtualne laboratoria z jednym, jedynym routerem za pomocąW tym celu w konsoli i dlaczego będzie nam potrzebna wykonujemy:
opendaylight-user@root> feature:install odl-netconf-topology odl-restconf-allNa tym kończy się najprostsza konfiguracja. (Bardziej szczegółowe informacje można znaleźć i dlaczego będzie nam potrzebna Część 4: konfigurujemy Vrnetlab ).
Przygotowanie systemu

Przed instalacją
konieczne jest zainstalowanie wymaganych do jego działania pakietów. Takich jak na git , , :
Instalacja VrnetlabAby zainstalować
klonujemy odpowiednie repozytorium z github: na ubuntu:~$ cd ~ ubuntu:~$ git clone https:\/\/github.com\/plajjan\/vrnetlab.git
vrnetlabPrzechodzimy do katalogu ubuntu:~$ cd ~\/vrnetlab:
Tutaj można zobaczyć wszystkie skrypty potrzebne do uruchomienia. Zauważ, że dla każdego typu routera stworzono odpowiadający katalog:Tutaj można zobaczyć wszystkie skrypty niezbędne do uruchomienia. Zwróć uwagę, że dla każdego typu routera utworzono odpowiedni katalog:
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 xrv9kTworzymy obraz routera
Każdy router, który jest wspierany na, ma swoją unikalną procedurę konfiguracji. W przypadku ) do wystarczy wrzucić archiwum .tgz z routerem (można je pobrać z ) do katalogu vmx i wykonać polecenie make:
ubuntu:~$ cd ~\/vrnetlab\/vmx
ubuntu:~$ # Kopiujemy do tego katalogu archiwum .tgz z routerem
ubuntu:~$ sudo makeTworzenie obrazu vMX zajmie około 10-20 minut. To idealny czas, aby zrobić sobie kawę!
Dlaczego to tyle trwa, zapytacie?
Tłumaczenie autora na to pytanie:
"Jest to związane z tym, że podczas pierwszego uruchomienia VCP (Control Plane) odczytuje plik konfiguracyjny, który określa, czy będzie działał jako VRR VCP w vMX. Wcześniej uruchomienie to odbywało się podczas uruchamiania Dockera, ale oznaczało to, że VCP zawsze był uruchamiany ponownie, zanim wirtualny router stał się dostępny, co prowadziło do długiego czasu ładowania (około 5 minut). Teraz pierwsze uruchomienie VCP odbywa się podczas budowy obrazu Dockera, a ponieważ budowa Dockera nie może być uruchomiona z parametrem —privileged, oznacza to, że qemu działa bez sprzętowego przyspieszenia KVM i w związku z tym budowa zajmuje bardzo dużo czasu. W trakcie tego procesu generowana jest duża ilość logów, więc przynajmniej będziecie mogli zobaczyć, co się dzieje. Myślę, że długotrwała budowa nie jest taka straszna, ponieważ obraz tworzymy tylko raz, a uruchamiamy go wiele razy."
Po tym będzie można zobaczyć obraz naszego routera w 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 101MBUruchamiamy kontener vr-vmx
Uruchamiamy poleceniem:
ubuntu:~$ sudo docker run -d --privileged --name jun01 b1b2369b453cNastępnie możemy zobaczyć informacje o aktywnych kontenerach:
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Łączymy się z routerem
Adres IP interfejsu sieciowego routera można uzyskać za pomocą następującego polecenia:
ubuntu:~$ sudo docker inspect --format '{{.NetworkSettings.IPAddress}}' jun01
172.17.0.2Domyślnie, na tworzy u routera użytkownika vrnetlab/VR-netlab9.
Łączymy się za pomocą ssh:
ubuntu:~$ ssh vrnetlab@172.17.0.2
Nie można ustalić autentyczności hosta '172.17.0.2 (172.17.0.2)'.
Odcisk klucza ECDSA to SHA256:g9Sfg/k5qGBTOX96WiCWyoJJO9FxjzXYspRoDPv+C0Y.
Czy na pewno chcesz kontynuować połączenie (tak/nie/[odcisk])? tak
Ostrzeżenie: Na stałe dodano '172.17.0.2' (ECDSA) do listy znanych hostów.
Hasło:
--- JUNOS 20.1R1.11 Jądro 64-bitowe JNPR-11.0-20200219.fb120e7_buil
vrnetlab> show version
Model: vmx
Junos: 20.1R1.11Na tym konfiguracja routera jest zakończona.
Zalecenia dotyczące instalacji routerów różnych producentów można znaleźć na w odpowiednich katalogach.
Część 5: Postman — łączymy router z OpenDaylight
Instalacja Postman
Aby zainstalować, wystarczy pobrać aplikację .
Podłączenie routera do ODL
Utworzymy Żądanie PUT: Linia żądania:

- PUT http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01
Treść żądania (zakładka Body): - jun01 172.17.0.2 22 vrnetlab VR-netlab9 false jun01_cache
Na zakładce Authorization należy ustawić parametr - Basic Auth
i login/hasło: admin/admin. Jest to wymagane do uzyskania dostępu do ODL:Na zakładce Headers należy dodać dwa nagłówki:

- Accept application/xml
- Content-Type application/xml
- Nasze żądanie zostało utworzone. Wysyłamy. Jeśli wszystko zostało poprawnie skonfigurowane, powinniśmy otrzymać status "201 Created":
Co robi to żądanie?
![]()
Tworzymy node wewnątrz
z parametrami rzeczywistego routera, do którego chcemy uzyskać dostęp. i dlaczego będzie nam potrzebna xmlns="urn:TBD:params:xml:ns:yang:network-topology" xmlns="urn:opendaylight:netconf-node-topology"
To wewnętrzne przestrzenie nazwPrzestrzeń nazw XML XML () według których tworzy node.Dalej, odpowiednio, nazwa routera to i dlaczego będzie nam potrzebna node-id
, adres routera — hosti td. Najciekawsza linia — ostatnia. Schema-cache-directory
tworzy katalog, do którego pobierane są wszystkie pliki YANG Schema podłączonego routera. Można je znaleźć w $ODL_ROOT/cache/jun01_cache Sprawdzamy połączenie routera GET.
GET http://10.132.1.202:8181/restconf/operational/network-topology:network-topology/topology/topology-netconf/
Utworzymy i login/hasło: admin/admin. Linia żądania:
- PUT http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01
GET http://10.132.1.202:8181/restconf/operational/network-topology:network-topology/topology/topology-netconf/ - Basic Auth
i login/hasło: admin/admin. Jest to wymagane do uzyskania dostępu do ODL:i login/hasło: admin/admin.
Wysyłamy. Powinienem otrzymać status "200 OK" oraz listę wszystkich obsługiwanych urządzeniem. $ODL_ROOT/cache/jun01_cache:

Komentarz: Aby zobaczyć najnowsze, w moim przypadku musiałem poczekać około 10 minut po wykonaniu. Żądanie PUT:, aż wszystko YANG sсhema wyeksportowane na i dlaczego będzie nam potrzebna. Do tego momentu podczas wykonywania tego i login/hasło: admin/admin. żądania zostanie wyświetlone następujące:

Usuwamy router
Utworzymy USUŃ Linia żądania:
- PUT http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01
USUŃ http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01 - Basic Auth
i login/hasło: admin/admin. Jest to wymagane do uzyskania dostępu do ODL:i login/hasło: admin/admin.
Część 6: Zmieniamy konfigurację routera
Pobieramy konfigurację
Utworzymy i login/hasło: admin/admin. Linia żądania:
- PUT http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01
GET http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01/yang-ext:mount/ - Basic Auth
i login/hasło: admin/admin. Jest to wymagane do uzyskania dostępu do ODL:i login/hasło: admin/admin.
Wysyłamy. Powinienem otrzymać status "200 OK" oraz konfigurację routera:

Tworzymy konfigurację
Jako przykład utworzymy następującą konfigurację i ją zmodyfikujemy:
protokóły {
bgp {
wyłącz;
zamknij;
}
}Utworzymy POST Linia żądania:
- PUT http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01
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:protokóły - jun01 172.17.0.2 22 vrnetlab VR-netlab9 false jun01_cache
- Basic Auth
i login/hasło: admin/admin. Jest to wymagane do uzyskania dostępu do ODL:i login/hasło: admin/admin. - Accept application/xml
- Content-Type application/xml
- Nasze żądanie zostało utworzone. Wysyłamy. Jeśli wszystko zostało poprawnie skonfigurowane, powinniśmy otrzymać status "201 Created":
Po wysłaniu powinienem otrzymać status "204 Brak zawartości".
Aby sprawdzić, czy konfiguracja się zmieniła, można skorzystać z poprzedniego żądania. Ale dla przykładu utworzymy jeszcze jedno, które wyświetli nam informacje tylko o skonfigurowanych na routerze protokołach.
Utworzymy i login/hasło: admin/admin. Linia żądania:
- PUT http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01
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:protokóły - Basic Auth
i login/hasło: admin/admin. Jest to wymagane do uzyskania dostępu do ODL:i login/hasło: admin/admin.
Po wykonaniu żądania zobaczymy następujące:

Zmiana konfiguracji
Zmienimy informacje o protokole BGP. Po naszych modyfikacjach będzie wyglądać to następująco:
protokóły {
bgp {
wyłącz;
}
}Utworzymy Żądanie PUT: Linia żądania:
- PUT http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01
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:protokóły - jun01 172.17.0.2 22 vrnetlab VR-netlab9 false jun01_cache
- Basic Auth
i login/hasło: admin/admin. Jest to wymagane do uzyskania dostępu do ODL:i login/hasło: admin/admin. - Accept application/xml
- Content-Type application/xml
- Nasze żądanie zostało utworzone. Wysyłamy. Jeśli wszystko zostało poprawnie skonfigurowane, powinniśmy otrzymać status "201 Created":
Korzystając z poprzedniego i login/hasło: admin/admin. żądania, widzimy zmiany:

Usuwamy konfigurację
Utworzymy USUŃ Linia żądania:
- PUT http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01
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:protokóły - Basic Auth
i login/hasło: admin/admin. Jest to wymagane do uzyskania dostępu do ODL:i login/hasło: admin/admin.
Przy wywołaniu i login/hasło: admin/admin. żądania z informacjami o protokołach zobaczymy następujące:

Uzupełnienie:
Aby zmienić konfigurację, nie trzeba wysyłać ciała żądania w formacie XML. Można to zrobić także w formacie YANG.
Na przykład w żądaniu Żądanie PUT: zmiany konfiguracji zmienimy ciało żądania na:
{
"junos-conf-protocols:protokóły": {
"bgp": {
"opis" : "Zmienione w postmanie"
}
}
}Nie zapomnij zmienić nagłówków na zakładce Headers na:
- Accept application/json
- Content-Type application/json
Po wysłaniu otrzymamy następujący wynik (sprawdź odpowiedź używając i login/hasło: admin/admin. żądania):

Część 7: dodajemy Cisco xRV9000
Co my ciągle o Juniperze, o Juniperze? Porozmawiajmy o Cisco!
Mam xRV9000 w wersji 7.0.2 (potwór, który potrzebuje 8GB RAM i 4 rdzenie. Nie jest dostępny w otwartej sprzedaży, więc proszę o kontakt w ) — to uruchomimy.
Uruchamianie kontenera
Proces tworzenia kontenera Docker praktycznie nie różni się od Junipera. Podobnie, wrzucamy plik .qcow2 z routerem do katalogu, który odpowiada jego nazwie (w tym przypadku xrv9k) i wykonujemy polecenie make docker-image.
Za kilka minut widzimy, że obraz został utworzony:
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 101MBUruchamiamy kontener:
ubuntu:~$ sudo docker run -d --privileged --name xrv01 54debc7973fcPo chwili sprawdzamy, że kontener się uruchomił:
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Łączymy się przez ssh:
ubuntu@ubuntu:~$ ssh vrnetlab@172.17.0.2
Hasło:
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.
Informacje o budowie:
Stworzone przez : ahoang
Stworzone w : Fri Mar 13 22:27:54 PDT 2020
Host budowy : iox-ucs-029
Workspace : \/auto\/srcarchive15\/prod\/7.0.2\/xrv9k\/ws
Wersja : 7.0.2
Lokalizacja : \/opt\/cisco\/XR\/packages\/\n Etykieta : 7.0.2
cisco IOS-XRv 9000 () procesor
Czas pracy systemu wynosi 3 godziny 22 minutyPodłączamy router do OpenDaylight
Dodanie przebiega zupełnie analogicznie do obrazu vMX. Trzeba tylko zmienić nazwy.
Żądanie PUT: Linia żądania:

Po chwili wywołujemy i login/hasło: admin/admin. żądanie, aby sprawdzić, że wszystko się podłączyło:

Zmiana konfiguracji
Skonfigurujemy następującą konfigurację:
!
router ospf LAB
mpls ldp auto-config
!Utworzymy POST Linia żądania:
- PUT http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01
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 - jun01 172.17.0.2 22 vrnetlab VR-netlab9 false jun01_cache
{ "processes": { "process": [ { "process-name": "LAB", "default-vrf": { "process-scope": { "ldp-auto-config": [ null ] } } } ] } } - Basic Auth
i login/hasło: admin/admin. Jest to wymagane do uzyskania dostępu do ODL:i login/hasło: admin/admin. - Accept application/xml
- Accept application/json
- Content-Type application/json
Po jego wykonaniu powinniśmy otrzymać status "204 No Content".
Sprawdźmy, co osiągnęliśmy.
W tym celu stworzymy i login/hasło: admin/admin. Linia żądania:
- PUT http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01
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 - Basic Auth
i login/hasło: admin/admin. Jest to wymagane do uzyskania dostępu do ODL:i login/hasło: admin/admin.
Po wykonaniu powinieneś zobaczyć następujące:

Do usunięcia konfiguracji używamy USUŃ:
- PUT http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01
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 - Basic Auth
i login/hasło: admin/admin. Jest to wymagane do uzyskania dostępu do ODL:i login/hasło: admin/admin.
Podsumowanie
Jak mogłeś zauważyć, procedury podłączania Cisco i Juniper do OpenDaylight nie różnią się - otwiera to dość szeroką przestrzeń dla kreatywności. Od zarządzania konfiguracjami wszystkich komponentów sieci, po tworzenie własnych polityk sieciowych.
W tym poradniku przedstawiłem najprostsze przykłady tego, jak można współpracować z urządzeniami sieciowymi za pomocą OpenDaylight. Bez wątpienia zapytania z przedstawionych przykładów można znacznie skomplikować i konfigurować całe usługi jednym kliknięciem – wszystko ograniczone jest tylko twoją wyobraźnią.
Ciąg dalszy nastąpi…
P.S.
Jeśli przypadkiem już to wszystko wiesz lub przeciwnie, przeszedłeś przez to i OpenDaylight ci się spodobał, to polecam przyjrzeć się rozwijaniu aplikacji na kontrolerze ODL. Możesz zacząć .
Udanych eksperymentów!
Bibliografia
- / Brian Linkletter
- OpenDaylight Cookbook / Mathieu Lemay, Alexis de Talhouet i in.
- Programowalność sieci z YANG / Benoît Claise, Loe Clarke, Jan Lindblad
- Ucz się XML, drugie wydanie / Erik T. Ray
- Skuteczny DevOps / Jennifer Davis, Ryn Daniels
Źródło: habr.com

