Tabulky a pohledy s Junosem Pyezem

(Nayan Gadre) (12. září 2020)

Jedná se o poznámky vytvořené při práce s knihovnou Junos pyez pro automatizaci sítě. Junos poskytuje tabulky a pohledy pro nastavení a extrakci vlastních konfiguračních dat. Veškerý kód pyez a ncclient je opensource pod licencí Apache 2.0

Tabulku a pohled definujete v souboru Yaml na lib / jnpr / junos / zdroje
jako „ user.yml “ a odpovídající soubor zavaděče jako „ user.py

user.yml
user.py

user.py ”slouží k převodu definic tabulky a zobrazení souboru yaml na globální prvky slovníku pythonu. Zde \_\_file \_\_ odkazuje na „ user.py “ soubor, který bude. poté převést na „ user.yml “ název souboru. loadyaml z junos pyez poté převede „ user.yml ”do slovníku, který jej připojí ke slovníku globals () .

Definice tabulky i zobrazení v yamlu jsou převedeny na třídy v pythonu. loadyaml je tovární metoda a je vystavena jako veřejné API pomocí \_\_ all \_\_ pythonická deklarace. Poskytuje slovník definic názvů položek a tříd položek, jak je vidět na jednom řádku.

Soubor user.yml je rozdělen na 2 klíče nejvyšší úrovně: „ UserTable “ a „ UserView “, takže loadyaml vrátí 2 třídy s těmito názvy.

slovník převedený z user.yml

Tento slovník je předán FactoryLoader.load ( ) metoda pro generování tříd:

FactoryLoader (). load (yaml.load (open (cesta, „r“), Loader = yaml.FullLoader))

Účel třídy Factory Loader Class

Metoda slovníků item () r vrátí objekt zobrazení, který obsahuje seznam n-tic obsahujících páry klíč – hodnota.

Způsob, jakým zavaděč továrny rozhoduje, zda je poskytnuté schéma tabulky a zobrazení pro konfiguraci nebo pro operace, pomocí klíčů ve schématu . Například: „ set “ a „ get “ klíče by z ní udělaly konfigurační tabulku,
rpc “ pak by to byla operace tabulka, „ příkaz “ nebo „ title “ pak jeho příkazová tabulka, existuje také matoucí kombinace „ položky “ „ zobrazit „a“ * „, které také diktují, zda se jedná o tabulku příkazů.

Protože se zaměřujeme na „ user.yml “ vidíme, že jde o konfigurační tabulku, protože obsahuje „ nastavit “ ve své hierarchii. Proto vyplníme \_item\_cfgtables s UserTable klíč.

Toto je funkce pro vytváření tříd pro generování třídy tabulky pro tabulky typů konfigurace.

Třída Table obsahuje odkaz na třídu View, tedy pokud je v sekci tabulky definován pohled, vytvoříme pro tento pohled třídu pomocí metody \_build\_view () třída jako hodnota klíče „ view „.

Slovník get () metoda umožňuje nastavit výchozí hodnotu, pokud klíč není k dispozici , zde klíč „ view\_name “ bude nepřítomný, takže \_build\_view ( view\_name ) vytvoří třídu a přidruží ji jako hodnotu k view\_name klíč. Bude také extrahovat skupiny, eval, pole a ukládat je do interních polí zobrazených objektů.

Nejprve zkontrolujeme, jak kontejner CFGTABLE je vytvořen na \_CFGTBL
\_CFGTBL = FactoryCfgTable

Python vám umožňuje vytvářet dynamické třídy nebo typy pomocí metody „ type .
Pokud„ type ”je předán existujícímu objektu, vrátí jeho typ. Pokud jsou však „ typ “ předány 3 argumenty, „ název třídy „,“ n-tice základny ”,“ dict „pak vrací novou třídu. Existuje také metoda „ vars „, která vrací \_\_dict\_\_ atribut, který ukládá objekty zapisovatelné atributy. Python vytváří další třídy pomocí metaclassů.

Můžeme předat název třídy, ze které nová třída zdědí, jako jedinou n-tici: Například: new\_cls = type (název\_tabulky, (CfgTable,), {})

Pokud „ set ”v sekci Tabulka je klíčové slovo:
např.: set: system / login / user
Měli bychom tedy také předat základní třídu config, abychom vytvořili třídu UserTable:
Například: new\_cls = type (název\_tabulky, (CfgTable, Config), {})

pole, která se ve třídě automaticky vyplní

Jakmile bude třída je vytvořen, přidáme jej do katalogu tříd factoryLoader: self.catalog [název\_tabulky] = cls

Nyní přejdeme k konstrukci třídy zobrazení:

view\_name = tbl\_dict [„ view “]
tbl\_dict [„ view “] = self.catalog.get (view\_name, self.\_build\_view (view\_name))

view\_name definované v souboru „ user.yml “ je „ userView „.

Nakonec„ načtěte ”Vrátí katalog tříd vytvořených třídou FactoryLoader .

Takže shrnutí cesty:

To právě dokončuje jednu část, kde je yml převeden na třídy, které pak mohou být použity k provozu. Takže začneme vytvořením objektu naší třídy UserTable.

user\_table = UserTable (dev)

Protože nově vytvořený UserTable dědí z CfgTable a základní třídy Config zdědíme konstruktor a všechny metody definované v těchto základních třídách. Jakmile vytvoříme nový UserTable objekt, zavolá \_\_init\_\_ nadřazených tříd. Protože „ set “ je uveden v souboru yml, zavoláme také konstruktor konfigurace základní třída.

Poté zavolat metoda get () pro načtení konfiguračních dat pro systém / přihlášení / uživatel hierarchie.
Nejprve zkontrolujeme možnost namesonly = false .

Nezapomeňte, že hierarchie výrazu xpath byla již nastavena prostřednictvím set: system / login / user prohlášení„ user.yml “. Funkce \_build\_xml to přeloží do a. XML jako níže:

Pokud uživatel zadal konkrétní uživatelské jméno, označované jako „ namekey , pak potřebujeme vložit to do výše vygenerovaného xml. Například: get (user = ”regress”) vloží prvek name s hodnotou regress:

regress

vše je zabaleno do get\_cmd a odesláno do self.RPC.get\_config (get\_cmd)
typický XML- RPC vypadá takto:

formát metody XML RPC volání XML

Naše XML pro získání informací o uživateli vypadá takto:

Tento XML-RPC je převeden na požadavek HTTP POST a odeslán na server: Spustí XML RPC a vrátí výsledky jako XML nebo nativní python

Skutečné volání rpc se provádí metodou ncclient rpc přes ssh, takže data jsou šifrována.

Zpracování RPC rpc\_cmd\_e je. provádí ncclient, který poskytuje implementaci pro netconf přes ssh. Bude obtížné pochopit, kde je ve skutečnosti definována metoda rpc v objektu Manager () z balíčku ncclient. Po prostudování knihovny ncclient jsem zjistil, že je definován jako slovník metod s „rpc“ = ExecuteRpc a tento slovník je specifický pro dodavatele. Kliknutím sem zobrazíte další informace .

Celá tato operace pro pojmenování slovníku je vytvořena pro každou žádost o připojení na základě dodavatele a vrácena.

Konečný XML RPC odeslaný přes ssh příliš server netconf na zařízení Junos

Rychlý shrnutí zahájení a výměny relace netconf:

Klient musí zahájit připojení netconf k portu 830 přes ssh. Server by měl ihned odeslat zprávu HELLO a totéž by měl udělat i klient. Celá zpráva ahoj > specifikuje možnosti klienta a serveru. Server by pak měl počkat na zpracování všech rpc > požadavků a měl by odeslat rpc-response >. Klient může přidat tolik atributů XML do prvku rpc >, jak je požadováno, a server vrátí všechny tyto atributy v prvku rpc-response >.

Odpověď je analyzována pro ok > a rpc-error > označující žádné / žádné chyby. Poté se transformuje do formátu závislého na zařízení / prodejci, odstraní značky oboru názvů atd.

Odpověď je nakonec přijata níže:

[(regress, [(user, regress), (uid, 928), (class\_name, superuser), (password, abc123 @ # $ # $ ^)])]