
Në këtë artikull, do të tregoj se si të konfiguroj OpenDaylight për të punuar me pajisjet rrjetërore, si dhe do të tregoj se si me anë të Postman dhe thjesht RESTCONF kjo pajisje mund të menaxhohet. Nuk do të punojmë me harduer, por në vend të kësaj do të krijojmë laboratorë virtualë të vegjël me një vetëm router përmes Vrnetlab në Ubuntu 20.04 LTS.
Konfigurimin e detajuar do ta tregoj fillimisht në shembullin e routerit Juniper vMX 20.1R1.11, më pas do ta krahasojmë me konfigurimin Cisco xRV9000 7.0.2.
Përmbajtja
- Dijet e nevojshme
- Pjesa 1: diskutojmë shkurtimisht OpenDaylight (më pas në tekst ODL), Postman dhe Vrnetlab dhe përse na nevojiten
- Pjesa 2: përshkrimi i laboratorit virtual
- Pjesa 3: konfigurojmë OpenDaylight
- Pjesa 4: konfigurojmë Vrnetlab
- Pjesa 5: me anë të Postman lidhi routerin virtual (Juniper vMX) me ODL
- Pjesa 6: marrim dhe ndryshojmë konfigurimin e routerit përmes Postman dhe ODL
- Pjesa 7: shtojmë Cisco xRV9000
- Përfundimi
- P.S.
- Lista e Literaturës
Dijet e nevojshme
Për që artikulli të mos shndërrohet në një letër të gjatë, disa detaje teknike i kam lënë jashtë (me referenca në literaturën ku mund të lexoni për to).
Dhe për këtë, ju ofroj tema që do të ishte mirë të dinit (por pothuajse nuk janë të domosdoshme) para se të lexoni:
- ,
- /
Pjesa 1: pak teori

- Platformë e hapur SDN për menaxhimin dhe automatizimin e çdo lloji rrjeti, e mbështetur nga Linux Foundation
- Java inside
- Bazuar në Model-Driven Service Abstraction Level (MD-SAL)
- Përdor modelet YANG për të krijuar automatikisht RESTCONF API për pajisjet rrjetërore
Moduli kryesor për menaxhimin e rrjetit. Precis, përmes tij do të komunikojmë me pajisjet e lidhura. Menaxhohet përmes API-t të tij.
Më shumë rreth OpenDaylight mund të lexoni .

- Shtë këtu një mjet për testimin e API
- Një ndërfaqe e thjeshtë dhe e lehtë për t'u përdorur
Në rastin tonë, na intereson si një mjet për dërgimin e kërkesave REST në API-në e OpenDaylight. Sigurisht, mund të dërgomë kërkesa manualisht, por në Postman, gjithçka është shumë më vizuale dhe për qëllimet tona i përshtatet më së miri.
Për ata që duan të eksplorojnë: për të janë shkruar shumë materiale mësimore ().

- Mjet për krijimin e routerëve virtualë në Docker
- Mban: Cisco XRv, Juniper vMX, Arista vEOS, Nokia VSR etj.
- Open Source
Një mjet shumë interesant, por i panjohur. Në rastin tonë, me ndihmën e tij do të startojmë Juniper vMX dhe Cisco xRV9000 në një Ubuntu 20.04 LTS.
Mund ta lexoni më shumë rreth tij në .
Pjesa 2: laboratori
Në këtë tutorial ne do të konfigurojmë sistemin e mëposhtëm:

Si funksionon
- Juniper vMX ngrihet në Docker kontejner (me anë të Vrnetlab) dhe funksionon si një router virtual i zakonshëm.
- ODL është i lidhur me routerin dhe lejon menaxhimin e tij.
- Postman është i nisur në një makinë të veçantë dhe përmes tij dërgojmë urdhra ODL: për lidhje/çbllokim të routerit, ndryshim konfigurimi etj.
Koment për pajisjen e sistemit
Juniper vMX dhe ODL kanë nevojë për shumë burime për funksionimin e tyre të qëndrueshëm. Pjesa e vetme vMX kërkon 6 Gb memorie RAM dhe 4 bërthamë. Prandaj, u mor një vendim për të transferuar të gjithë "të rëndë" në një makinë të veçantë (Heulett Packard Enterprise MicroServer ProLiant Gen8, Ubuntu 20.04 LTS). Routeri sigurisht nuk "fluturon", por për eksperimente të vogla performance është e mjaftueshme.
Pjesa 3: konfigurimi i OpenDaylight

Versioni aktual i ODL në momentin e shkruajtjes së artikullit — Magnesium SR1
1) Instalojmë Java OpenJDK 11 (për instalimin më të detajuar )
ubuntu:~$ sudo apt install default-jdk2) Gjej dhe shkarko ndërtimin e fundit ODL
3) Shpaketojmë arkivin e shkarkuar
4) Kalojmë në direktorinë e krijuar
5) Nisim ./bin/karaf
Në këtë hap ODL duhet të nisë dhe të jemi në konsolë (Për qasje nga jashtë përdoret porta 8181, të cilën ne do ta shfrytëzojmë më tej).
Pastaj instalojmë ODL Features, të destinuara për të punuar me protokollet NETCONF dhe RESTCONF. Për këtë në konsolë ODL ekzekutojmë:
opendaylight-user@root> feature:install odl-netconf-topology odl-restconf-allKjo është konfiguroja më e thjeshtë ODL përfundoi. (Më shumë mund të lexoni ).
Pjesa 4: konfigurojmë Vrnetlab

Përgatitja e sistemit
Para instalimit Vrnetlab nevojitet të instaloni paketat e kërkuara për funksionimin e tij. Të tilla si , , :
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 -
ubuntu:~$ sudo add-apt-repository
"deb [arch=amd64] https://download.docker.com/linux/ubuntu
$(lsb_release -cs)
stable"
ubuntu:~$ sudo apt update
ubuntu:~$ sudo apt install -y docker-ce docker-ce-cli containerd.ioInstalimi i Vrnetlab
Për instalimin Vrnetlab klonojmë repositorin përkatës nga github:
ubuntu:~$ cd ~
ubuntu:~$ git clone https://github.com/plajjan/vrnetlab.gitShkoni në direktorinë vrnetlab:
ubuntu:~$ cd ~/vrnetlabKëtu mund të shihni të gjitha skriptet e nevojshme për nisjen. Vini re se për çdo tip routeri është bërë një direktor i përkatshëm:
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 xrv9kKrijohet image-i i routerit
Çdo router, që mbështetet Vrnetlab, ka procedurën e saj unike të konfigurimit. Në rastin e Juniper vMX na mjafton të kopjojmë arkivin .tgz me routerin (mund ta shkarkoni nga ) në drejtorinë vmx dhe të ekzekutojmë komandën make:
ubuntu:~$ cd ~/vrnetlab/vmx
ubuntu:~$ # Kopjojmë në këtë drejtori arkivin .tgz me routerin
ubuntu:~$ sudo makeNdërtimi i imazhit vMX do të marrë rreth 10-20 minuta. Ështënë koha për të bërë një kafe!
Pse e tillë, do të pyesni ju?
Përkthim e autorit në këtë pyetje:
"Kjo është për shkak se, në nisjen e parë, VCP (Control Plane) lexon skedarin e konfigurimit, i cili përcakton nëse do të funksionojë si VRR VCP në vMX. Më parë, ky nisje bëhej gjatë nisjes së Docker, por kjo nënkuptonte se VCP gjithmonë rindez një herë, përpara se routeri virtual të bëhej i disponueshëm, duke sjellë kështu një kohë të gjatë ngarkimi (rreth 5 minuta). Tani, nisja e parë e VCP bëhet gjatë ndërtimit të imazhit Docker, dhe duke qenë se ndërtimi Docker nuk mund të niset me parametra —privileged, kjo do të thotë se qemu funksionon pa përshpejtim harduerik KVM dhe, kështu, ndërtimi merr shumë kohë. Gjatë këtij procesi çohesh shumë log-e, kështu që, të paktën, do të mund të shikoni se çfarë po ndodh. Mendimi im është se ndërtimi i gjatë nuk është aq i tmerrshëm, sepse ne e krijojmë imazhin një herë, por e aktivizojmë shumë herë."
Më pas do të mund të shihni imazhin e routerit tonë në 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 101MBAktivizojmë kontejnerin vr-vmx
Aktivizohet me komandën:
ubuntu:~$ sudo docker run -d --privileged --name jun01 b1b2369b453cMë pas mund të shohim informacionin rreth kontejnerëve aktivë:
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 jun01Konkurohemi me routerin
Adresa IP e ndërfaqes së rrjetit të routerit mund të merret me komandën në vijim:
ubuntu:~$ sudo docker inspect --format '{{.NetworkSettings.IPAddress}}' jun01
172.17.0.2Nga e drejta, Vrnetlab krijon një përdorues për routerin vrnetlab/VR-netlab9.
Lidhim me anë të ssh:
ubuntu:~$ ssh vrnetlab@172.17.0.2
Besimi i host-it '172.17.0.2 (172.17.0.2)' nuk mund të vërtetohet.
ECDSA çelësi i njohjes është SHA256:g9Sfg/k5qGBTOX96WiCWyoJJO9FxjzXYspRoDPv+C0Y.
A jeni të sigurt që dëshironi të vazhdoni me lidhjen (po/jo/[çelësi i njohjes])? po
Kërcënim: Përherë u shtua '172.17.0.2' (ECDSA) në listën e host-ave të njohur.
Fjalëkalimi:
--- JUNOS 20.1R1.11 Kernel 64-bit JNPR-11.0-20200219.fb120e7_buil
vrnetlab> show version
Modeli: vmx
Junos: 20.1R1.11Kjo është e gjitha, konfigurimi i routerit është përfunduar.
Rekomandimet për instalimin e routerëve nga prodhues të ndryshëm mund të gjenden në në drejtoritë përkatëse.
Pjesa 5: Postman — lidhi routerin me OpenDaylight
Instalimi i Postman
Për të instaluar mjafton të shkarkoni aplikacionin .
Lidhja e routerit me ODL
Të krijojmë PUT kërkesa:

- Vija e kërkesës:
PUT http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01 - Trupi i kërkesës (ndarja Body):
jun01 172.17.0.2 22 vrnetlab VR-netlab9 false jun01_cache - Në ndarjen Authorization ne kemi vendosur parametrin
Basic Authdhe emrin/fjalëkalimin: admin/admin. Kjo është e nevojshme për akses në ODL:

- Në ndarjen Headers ne duhet të shtojmë dy tituj:
- Accept application/xml
- Content-Type application/xml
Kërkesa jonë është formuar. Të dërgojmë. Nëse gjithçka ishte e konfiguruar siç duhet, do të duhet të kthejmë statusin "201 Created":
![]()
Çfarë bën kjo kërkesë?
Ne krijojmë një node brenda ODL me parametrat e routerit real, të cilit ne duam t'i qasemi.
xmlns="urn:TBD:params:xml:ns:yang:network-topology"
xmlns="urn:opendaylight:netconf-node-topology"Këto janë hapësira të brendshme XML (XML namespace) për ODL sipërfaqe të cilave krijon node.
Më pas, emri i routerit është node-id, adresa e routerit është host etj.
Vija më interesante — është e fundit. Schema-cache-directory krijon një direktori, në të cilën shkarkohet të gjitha skedarët YANG Schema e routerit të lidhur. Mund t'i gjejmë në $ODL_ROOT/cache/jun01_cache.
Kontrollojmë lidhjen e routerit
Të krijojmë GET kërkesa:
- Vija e kërkesës:
GET http://10.132.1.202:8181/restconf/operational/network-topology:network-topology/topology/topology-netconf/ - Në ndarjen Authorization ne kemi vendosur parametrin
Basic Authdhe emrin/fjalëkalimin: admin/admin.
Dërgojmë. Duhet të marrim statusin "200 OK" dhe listën e të gjitha pajisjeve të mbështetura. YANG Schema:

Komentari: Për të parë të fundit, në rastin tim nevojitej të prisja rreth 10 minuta pas përfundimit PUT, derisa të gjitha YANG skema të shkarkoheshin në ODL. Deri në atë moment, kur ekzekutohet ky GET kërkesë do të shfaqet e mëposhtmja:

Shkëputja e routerit
Të krijojmë DELETE kërkesa:
- Vija e kërkesës:
DELETE http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01 - Në ndarjen Authorization ne kemi vendosur parametrin
Basic Authdhe emrin/fjalëkalimin: admin/admin.
Pjesa 6: Ndryshimi i konfiguracionit të routerit
Marrim konfiguracionin
Të krijojmë GET kërkesa:
- Vija e kërkesës:
GET http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01/yang-ext:mount/ - Në ndarjen Authorization ne kemi vendosur parametrin
Basic Authdhe emrin/fjalëkalimin: admin/admin.
Dërgojmë. Duhet të marrim statusin "200 OK" dhe konfiguracionin e routerit:

Krijojmë konfiguracionin
Si shembuj do të krijojmë këtë konfiguracion dhe do ta ndryshojmë atë:
protocols {
bgp {
disable;
shutdown;
}
}Të krijojmë POST kërkesa:
- Vija e kërkesës:
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 - Trupi i kërkesës (ndarja Body):
- Në ndarjen Authorization ne kemi vendosur parametrin
Basic Authdhe emrin/fjalëkalimin: admin/admin. - Në ndarjen Headers ne duhet të shtojmë dy tituj:
- Accept application/xml
- Content-Type application/xml
Pas dërgimit duhet të marrim statusin "204 No Content"
Për të verifikuar që konfiguracioni është ndryshuar, mund të përdorni kërkesën e mëparshme. Por për shembuj do të krijojmë një tjetër, e cila do të na shfaqë informacionin vetëm për protokollet e konfiguruara në router.
Të krijojmë GET kërkesa:
- Vija e kërkesës:
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 - Në ndarjen Authorization ne kemi vendosur parametrin
Basic Authdhe emrin/fjalëkalimin: admin/admin.
Pas ekzekutimit të kërkesës do të shohim këtë:

Ndryshimi i konfiguracionit
Do të ndryshojmë informacionin për protokollin BGP. Pas veprimeve tona do të duket si më poshtë:
protocols {
bgp {
disable;
}
}Të krijojmë PUT kërkesa:
- Vija e kërkesës:
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 - Trupi i kërkesës (ndarja Body):
- Në ndarjen Authorization ne kemi vendosur parametrin
Basic Authdhe emrin/fjalëkalimin: admin/admin. - Në ndarjen Headers ne duhet të shtojmë dy tituj:
- Accept application/xml
- Content-Type application/xml
Duke përdorur kërkesën e mëparshme, shohim ndryshimet: GET kërkesë, ndryshimet e dukshme:

Fshirja e konfiguracionit
Të krijojmë DELETE kërkesa:
- Vija e kërkesës:
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 - Në ndarjen Authorization ne kemi vendosur parametrin
Basic Authdhe emrin/fjalëkalimin: admin/admin.
Në thirrje GET në kërkesën për informacionin e protokolleve do të shohim këtë:

Shtesë:
Për të ndryshuar konfiguracionin, nuk është e nevojshme të dërgoni trupin e kërkesës në formatin XML. Këtë mund ta bëni edhe në formatin JSON.
Për këtë, për shembull, në kërkesën PUT të ndryshimit të konfiguracionit do ta zëvendësojmë trupin e kërkesës me:
{
"junos-conf-protocols:protocols": {
"bgp": {
"description" : "Ndryshuar në postman"
}
}
}Mos harroni të ndryshoni në tabin Headers titujt në:
- Accept application/json
- Content-Type application/json
Pas dërgimit do të marrim rezultatin e mëposhtëm (Përgjigjen e shohim duke përdorur GET kërkesën):

Pjesa 7: shtojmë Cisco xRV9000
Pse të flasim vetëm për Juniper? Le të flasim pak për Cisco!
Kam gjetur një xRV9000 version 7.0.2 (një gjë e egër që kërkon 8Gb RAM dhe 4 bërthamë. Nuk është në qarkullim falas, prandaj kontaktoni ) — atë do ta aktivizojmë.
Aktivizimi i kontejnerit
Processi i krijimit të kontejnerit Docker është praktikisht i njëjtë me atë të Juniper. Po ashtu, ngrejmë skedarin .qcow2 me routerin në direktorinë përkatëse të emrit të tij, (në këtë rast xrv9k) dhe ekzekutojmë komandën make docker-image.
Pas disa minutash shohim se imazhi është krijuar:
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 101MBEkzekutojmë aktivizimin e kontejnerit:
ubuntu:~$ sudo docker run -d --privileged --name xrv01 54debc7973fcPas pak kohe shohim se kontejneri është aktivizuar:
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 xrv01Konektom me 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
Sistemi është aktiv për 3 orë 22 minutaLidhim routerin me OpenDaylight
Shtimi ndodhi në të njëjtën mënyrë si me imazhin vMX. Duhet vetëm të ndryshoni emrat.
PUT kërkesa:

Pas pak kohe do të thërrasim GET kërkesën për të kontrolluar nëse gjithçka është lidhur:

Ndryshimi i konfiguracionit
Do të konfigurojmë këtë konfiguracion:
!
router ospf LAB
mpls ldp auto-config
!Të krijojmë POST kërkesa:
- Vija e kërkesës:
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 - Trupi i kërkesës (ndarja Body):
{ "processes": { "process": [ { "process-name": "LAB", "default-vrf": { "process-scope": { "ldp-auto-config": [ null ] } } } ] } } - Në ndarjen Authorization ne kemi vendosur parametrin
Basic Authdhe emrin/fjalëkalimin: admin/admin. - Në ndarjen Headers ne duhet të shtojmë dy tituj:
- Accept application/json
- Content-Type application/json
Pas përfundimit të saj duhet të marrim statusin "204 No Content".
Le të kontrollojmë se çfarë kemi arritur.
Për këtë do të krijojmë GET kërkesa:
- Vija e kërkesës:
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 - Në ndarjen Authorization ne kemi vendosur parametrin
Basic Authdhe emrin/fjalëkalimin: admin/admin.
Pas ekzekutimit të saj duhet të shohim këtë:

Për të fshirë konfiguracionin përdorim DELETE:
- Vija e kërkesës:
Fshi 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 - Në ndarjen Authorization ne kemi vendosur parametrin
Basic Authdhe emrin/fjalëkalimin: admin/admin.
Përfundimi
Siç mund ta keni vënë re, procedurat e lidhjes Cisco dhe Juniper me OpenDaylight nuk ndryshojnë shumë — kjo hap një gamë të gjerë mundësish kreative. Nga menaxhimi i konfigurimeve të të gjitha komponentëve të rrjetit deri te krijimi i politikave të veta rrjetore.
Në këtë udhëzues kam paraqitur shembuj të thjeshtë se si të ndërveprojmë me pajisjet rrjetore përmes OpenDaylight. Pa dyshim, kërkesat nga shembujt e dhëna mund të bëhen shumë më të komplikuara dhe të konfigurohen shërbime të tëra me një klik të miut — gjithçka është e kufizuar vetëm nga imagjinata juaj.
Vazhdon…
P.S.
Nëse ndodheni në dijeni të gjithë këtyre ose, përkundrazi, keni kaluar dhe ju ka prekur ODL, atëherë rekomandoj të shikoni drejt zhvillimit të aplikacioneve në kontrollin ODL. Mund të filloni duke .
Eksperimente të suksesshme!
Lista e literaturës
- / Brian Linkletter
- OpenDaylight Cookbook / Mathieu Lemay, Alexis de Talhouet, Et al
- Network Programmability with YANG / Benoît Claise, Loe Clarke, Jan Lindblad
- Learning XML, Ediçioni i Dytë / Erik T. Ray
- Effective DevOps / Jennifer Davis, Ryn Daniels
Burimi: habr.com

