So definieren Sie die Routing-Instanz in Python 3-Anwendungen auf Geräten, auf denen Junos OS Evolved ausgeführt wird
Das libpyvrf-Modul verstehen
Eine Routing-Instanz ist eine Sammlung von Routing-Tabellen, Schnittstellen und Routingprotokollparametern. Jede Routing-Instanz hat einen eindeutigen Namen und eine entsprechende IP-Unicast-Tabelle, die verwendet werden kann, um den Datenverkehr für diese Instanz vom anderen Datenverkehr zu trennen. Auf Geräten, auf denen Junos OS Evolved ausgeführt wird, können Sie beispielsweise eine dedizierte VRF-Instanz (Management Virtual Routing and Forwarding) aktivieren, die eine separate administrative Routing-Tabelle verwendet, mgmt_junos
die für Verwaltungsaufgaben bestimmt ist.
Routing-Instanzen ermöglichen es Ihnen, Datenverkehr zu isolieren, der das Netzwerk durchquert, ohne mehrere Geräte zur Segmentierung Ihres Netzwerks zu verwenden. Wenn Sie Routing-Instanzen zur Isolierung des Datenverkehrs verwenden, können Netzwerkversorger ping
ssh
die richtige Routing-Instanz referenzieren, um den Datenverkehr an ein Ziel zu senden, das über diese Instanz erreichbar ist.
Das Junos OS Evolved-Image läuft nativ unter Linux und bietet direkten Zugriff auf alle Linux-Dienstprogramme und -Vorgänge, einschließlich der Python-Bibliotheken, die Teil des Basisimages sind. Die Python 3-Bibliothek auf Geräten, auf denen Junos OS Evolved ausgeführt wird, umfasst auch das Modul von Juniper Networks libpyvrf
, mit dem Python 3-Anwendungen, die in der Shell ausgeführt werden, die Routing-Instanz angeben können, die für bestimmte Prozesse und Netzwerkversorger verwendet werden soll.
Tabelle 1 zeigt die libpyvrf
Funktionen, die Sie in Python 3-Anwendungen verwenden können, die in der Linux-Shell ausgeführt werden. Sie können die Funktionen verwenden, um einen Prozess anzuweisen, eine bestimmte Routing-Instanz zu verwenden. Wenn für denselben Prozess mehrere Routing-Instanzen erforderlich sind, können Sie auch den Routinginstanzenkontext für einen bestimmten Socket festlegen, was sich nicht auf den Kontext für den Prozess selbst auswirkt. Pakete durch den Socket verwenden dann die Routing-Tabelle, die dieser Instanz zugeordnet ist. Wenn Sie die Routing-Instanz für einen Prozess oder Socket festlegen, setzt das libpyvrf
Modul den Kontext auf die Linux VRF, die der Routing-Instanz von Junos OS entspricht.
|
Beschreibung |
---|---|
|
Geben Sie die Linux VRF zurück, die einer Routing-Instanz von Junos OS entspricht. |
|
Geben Sie den Index der Routing-Tabelle zurück, die der angegebenen Routing-Instanz zugeordnet ist. |
|
Geben Sie die Routing-Instanz zurück, die der angegebenen Aufgabe zugeordnet ist.
Hinweis:
Diese Funktion ist ab Junos OS Evolved Version 22.1R1 veraltet. |
|
Geben Sie die Routing-Instanz zurück, die dem aktuellen Prozess zugeordnet ist. |
|
Legen Sie die Routing-Instanz für den angegebenen Socket fest. |
|
Legen Sie die Routing-Instanz für den angegebenen Prozess fest.
Hinweis:
Diese Funktion ist ab Junos OS Evolved Version 22.1R1 veraltet. |
|
Legen Sie die Routing-Instanz für den aktuellen Prozess fest. |
Funktionen im libpyvrf
Modul können je nach Funktion und Fehler die folgenden Ausnahmen erheben:
libpyvrf.error
– Wird generiert, wennlibvrf
ein Fehler zurückgegeben wird.libpyvrf.evo_not_ready
— Wird generiert, wenn der Junos OS Evolved-Netzwerkstack nicht bereit ist, z. B. wenn das Gerät gestartet wird.libpyvrf.invalid_table
— Wird generiert, wenn die angegebene Routing-Instanz- oder Tabellen-ID ungültig ist.
Das folgende Python-Beispielskript versucht, einen Host zu pingen, der nur über die mgmt_junos
Routing-Instanz erreichbar ist. Das Skript pingt zunächst den Host, bevor es die set_vrf()
Funktion aufruft. Das Skript ruft dann die Funktion auf, um die set_vrf()
mgmt_junos
Routing-Instanz mit dem aktuellen Prozess zu verknüpfen, und pingt den Host erneut.
[vrf:none] user@host:~# cat libpyvrf-ping.py import libpyvrf as vrf import subprocess command = [ 'ping', '-c', '3', 'host1.example.com' ] try: # Ping the host before setting the routing instance subprocess.call(command) == 0 # Set the routing instance vrf.set_vrf("mgmt_junos") print ("\nUsing routing instance:", vrf.get_vrf()) # Ping the host after setting the routing instance subprocess.call(command) == 0 except vrf.invalid_table as e: print ("Invalid Table") except vrf.evo_not_ready as e : print ("Junos OS Evolved network stack is not ready") except vrf.error as e : print ("Generic libvrf error")
Wenn Sie das Skript ausführen, schlägt der erste Ping-Befehl fehl, da der Prozess in diesem Fall die Standard-Routing-Instanz verwendet und der Host nur über die mgmt_junos
Routing-Instanz erreichbar ist. Der zweite Ping-Befehl, der die mgmt_junos
Routing-Instanz verwendet, ist erfolgreich.
[vrf:none] user@host:~# python3 libpyvrf-ping.py ping: unknown host host1.example.net Using routing instance: mgmt_junos PING host1.example.com (198.51.100.10) 56(84) bytes of data. 64 bytes from host1.example.com (198.51.100.10): icmp_seq=1 ttl=60 time=1.02 ms 64 bytes from host1.example.com (198.51.100.10): icmp_seq=2 ttl=60 time=0.672 ms 64 bytes from host1.example.com (198.51.100.10): icmp_seq=3 ttl=60 time=0.741 ms --- host1.example.com ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2003ms rtt min/avg/max/mdev = 0.876/0.946/1.001/0.063 ms
Sie können die Routing-Instanz wieder auf die Standard-Routing-Instanzzuordnung in einer Python-Anwendung zurücksetzen, indem Sie eine leere Zeichenfolge für den Namen der Routing-Instanz angeben. Zum Beispiel:
vrf.set_vrf("")
Wenn in einer Anwendung keine Routinginstanz angegeben wird, hängt die Standard-Routinginstanzenzuordnung von der Umgebung des Prozesses ab. Wenn die Umgebung die libsi.so-Bibliothek vorab lädt, verwendet die Anwendung standardmäßig die Standard-Routing-Instanz und -Tabelle, default.inet
. Andernfalls ist keine Standard-Routing-Instanz mit dem Prozess oder den Sockets verknüpft.
Um zu bestimmen, ob die Umgebung die libsi.so Bibliothek vorab lädt, überprüfen Sie, ob der Wert der LD_PRELOAD
Umgebungsvariable den Pfad zur Bibliothek enthält.
[vrf:none] user@host:~# env | grep LD_PRELOAD LD_PRELOAD=libsi.so
Wenn die LD_PRELOAD
Variable nicht den libsi.so Bibliothekspfad enthält, können Sie die für Ihre Shell geeigneten Befehle verwenden, um ihn z. B.:
[vrf:none] user@host:~# export LD_PRELOAD="/path/to/libsi.so" [vrf:none] user@host:~# env | grep LD_PRELOAD LD_PRELOAD=libsi.so
get_host_vrf_name()-Funktion
Syntax
host_vrf_name get_host_vrf_name(vrf_name)
Beschreibung
Geben Sie die Linux VRF zurück, die einer Routing-Instanz von Junos OS entspricht.
Parameter
vrf_name |
Name einer Junos OS-Routing-Instanz. |
Rückgabewert
host_vrf_name | Der Name der Linux VRF entspricht der Routing-Instanz von Junos OS. |
Anwendungsbeispiele
Im folgenden Beispiel wird die Linux VRF gedruckt, die mehreren Junos OS-Routing-Instanzen entspricht:
[vrf:none] user@host:~# cat libpyvrf-get-host-vrf-name.py import libpyvrf as vrf try: print ("mgmt_junos VRF:", vrf.get_host_vrf_name("mgmt_junos")) print ("default VRF:", vrf.get_host_vrf_name("default")) print ("L3VPN-1 VRF:", vrf.get_host_vrf_name("L3VPN-1")) except vrf.invalid_table as e: print ("Invalid Table")
[vrf:none] user@host:~# python3 libpyvrf-get-host-vrf-name.py mgmt_junos VRF: mgmt_junos default VRF: vrf0 L3VPN-1 VRF: vrf52
Versionsinformationen
Funktion in Junos OS Evolved Version 20.3R1 eingeführt.
get_table_id()-Funktion
Syntax
table_id get_table_id(vrf_name)
Beschreibung
Geben Sie den Index der Routing-Tabelle zurück, die der angegebenen Routing-Instanz zugeordnet ist. Wenn die Routing-Instanz nicht definiert ist, gibt die Funktion -1 zurück.
Parameter
vrf_name |
Name einer Junos OS-Routing-Instanz. |
Rückgabewert
table_id | Index der Routing-Tabelle für die gegebene Routing-Instanz. |
Anwendungsbeispiele
Im folgenden Beispiel wird der Tabellenindex für die mgmt_junos
Routing-Instanz und eine undefinierte Routing-Instanz foo
abgerufen und gedruckt.
user@host> show route forwarding-table extensive table mgmt_junos Routing table: mgmt_junos.inet [Index 36738] Internet: ... Routing table: mgmt_junos.inet6 [Index 36738] Internet6: ...
[vrf:none] user@host:~# cat libpyvrf-get-table-id.py import libpyvrf as vrf try: print (vrf.get_table_id("mgmt_junos")) print (vrf.get_table_id("foo")) except vrf.evo_not_ready as e: print ("Junos OS Evolved network stack is not ready") except vrf.error as e: print ("Generic libvrf error")
Das Skript gibt den Tabellenindex für die mgmt_junos
Instanz und -1 für die undefinierte Instanz zurück.
[vrf:none] user@host:~# python3 libpyvrf-get-table-id.py 36738 -1
Versionsinformationen
Funktion in Junos OS Evolved Version 20.3R1 eingeführt.
get_task_vrf()-Funktion
Syntax
vrf_name get_task_vrf(tid)
Beschreibung
Geben Sie die Junos OS-Routing-Instanz zurück, die der angegebenen Prozess-ID zugeordnet ist.
Parameter
tid |
Prozess-ID, für die die zugehörige Routing-Instanz abgerufen werden soll. |
Rückgabewert
vrf_name | Name der Routing-Instanz, die der Prozess-ID zugeordnet ist. |
Anwendungsbeispiele
Im folgenden Beispiel wird die Prozess-ID für den aktuellen Prozess abgerufen und die mgmt_junos
Routinginstanz diesem Prozess zugeordnet. Wenn das Skript die get_task_vrf()
Funktion aufruft, um die Routing-Instanz für diese Prozess-ID anzufordern, gibt es die mgmt_junos
Routing-Instanz zurück.
[vrf:none] user@host:~# cat libpyvrf-set-task-vrf.py import libpyvrf as vrf import os, subprocess command = [ 'ping', '-c', '3', 'host1.example.com' ] try: pid = os.getpid() vrf.set_task_vrf(pid, "mgmt_junos") print ("Using routing instance:", vrf.get_task_vrf(pid)) subprocess.call(command) == 0 except vrf.invalid_table as e: print ("Invalid Table") except vrf.evo_not_ready as e: print ("Junos OS Evolved network stack is not ready") except vrf.error as e: print ("Generic libvrf error")
[vrf:none] user@host:~# python3 libpyvrf-set-task-vrf.py Using routing instance: mgmt_junos PING host1.example.com (198.51.100.10) 56(84) bytes of data. 64 bytes from host1.example.com (198.51.100.10): icmp_seq=1 ttl=60 time=1.02 ms 64 bytes from host1.example.com (198.51.100.10): icmp_seq=2 ttl=60 time=0.672 ms 64 bytes from host1.example.com (198.51.100.10): icmp_seq=3 ttl=60 time=0.741 ms --- host1.example.com ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2003ms rtt min/avg/max/mdev = 0.876/0.946/1.001/0.063 ms
Versionsinformationen
Funktion in Junos OS Evolved Version 20.3R1 eingeführt.
Funktion in Junos OS Evolved Version 22.1R1 veraltet.
get_vrf()-Funktion
Syntax
vrf_name get_vrf()
Beschreibung
Geben Sie die Junos OS-Routing-Instanz zurück, die dem aktuellen Prozess zugeordnet ist.
Rückgabewert
vrf_name |
Name der Routing-Instanz, die dem aktuellen Prozess zugeordnet ist. |
Anwendungsbeispiele
Im folgenden Beispiel wird die mgmt_junos
Routing-Instanz mit dem aktuellen Prozess verknüpft. Wenn das Skript die get_vrf()
Funktion aufruft, um die Routing-Instanz für den aktuellen Prozess anzufordern, gibt es die mgmt_junos
Routing-Instanz zurück.
[vrf:none] user@host:~# cat libpyvrf-set-vrf.py import libpyvrf as vrf import subprocess command = [ 'ping', '-c', '3', 'host1.example.com' ] try: vrf.set_vrf("mgmt_junos") print ("Using routing instance:", vrf.get_vrf()) subprocess.call(command) == 0 except vrf.invalid_table as e: print ("Invalid Table") except vrf.evo_not_ready as e: print ("Junos OS Evolved network stack is not ready") except vrf.error as e: print ("Generic libvrf error")
[vrf:none] user@host:~# python3 libpyvrf-set-vrf.py Using routing instance: mgmt_junos PING host1.example.com (198.51.100.10) 56(84) bytes of data. 64 bytes from host1.example.com (198.51.100.10): icmp_seq=1 ttl=60 time=1.02 ms 64 bytes from host1.example.com (198.51.100.10): icmp_seq=2 ttl=60 time=0.672 ms 64 bytes from host1.example.com (198.51.100.10): icmp_seq=3 ttl=60 time=0.741 ms --- host1.example.com ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2003ms rtt min/avg/max/mdev = 0.876/0.946/1.001/0.063 ms
Versionsinformationen
Funktion in Junos OS Evolved Version 20.3R1 eingeführt.
set_socket_vrf()-Funktion
Syntax
set_socket_vrf(socket_fd, vrf_name)
Beschreibung
Legen Sie die Routing-Instanz fest, die vom angegebenen Socket verwendet wird. Das Festlegen der Routing-Instanz für einen Socket ist nützlich, wenn mehrere Sockets innerhalb derselben Anwendung unterschiedliche Routing-Instanzen verwenden müssen. Sie können den Routing-Instanzkontext für jeden Socket einzeln festlegen, ohne den Routinginstanzenkontext für den Prozess oder die Anwendung zu beeinträchtigen.
Parameter
socket_fd |
Dateideskriptor des Sockets. |
vrf_name |
Name einer Junos OS-Routing-Instanz.
|
Versionsinformationen
Funktion in Junos OS Evolved Version 20.3R1 eingeführt.
set_task_vrf()-Funktion
Syntax
set_task_vrf(tid, vrf_name)
Beschreibung
Legen Sie die Routing-Instanz fest, die der Prozess mit der angegebenen Prozess-ID zum Ausführen von Vorgängen verwendet.
Während set_vrf()
die Routing-Instanz für den aktuellen Prozess festgelegt wird, set_task_vrf()
setzt die Routing-Instanz für den Prozess mit der angegebenen Prozess-ID.
Parameter
tid |
Prozess-ID für den Prozess, der die angegebene Routing-Instanz verwendet. |
vrf_name |
Name einer Junos OS-Routing-Instanz.
|
Anwendungsbeispiele
Das folgende Python-Beispielskript ruft die Prozess-ID für den aktuellen Prozess ab und ordnet die mgmt_junos
Routinginstanz diesem Prozess zu. Das Skript pingt dann einen Host, der nur über diese Routing-Instanz erreichbar ist.
[vrf:none] user@host:~# cat libpyvrf-set-task-vrf.py import libpyvrf as vrf import os, subprocess command = [ 'ping', '-c', '3', 'host1.example.com' ] try: pid = os.getpid() vrf.set_task_vrf(pid, "mgmt_junos") print ("Using routing instance:", vrf.get_task_vrf(pid)) subprocess.call(command) == 0 except vrf.invalid_table as e: print ("Invalid Table") except vrf.evo_not_ready as e: print ("Junos OS Evolved network stack is not ready") except vrf.error as e: print ("Generic libvrf error")
[vrf:none] user@host:~# python3 libpyvrf-set-task-vrf.py Using routing instance: mgmt_junos PING host1.example.com (198.51.100.10) 56(84) bytes of data. 64 bytes from host1.example.com (198.51.100.10): icmp_seq=1 ttl=60 time=1.02 ms 64 bytes from host1.example.com (198.51.100.10): icmp_seq=2 ttl=60 time=0.672 ms 64 bytes from host1.example.com (198.51.100.10): icmp_seq=3 ttl=60 time=0.741 ms --- host1.example.com ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2003ms rtt min/avg/max/mdev = 0.876/0.946/1.001/0.063 ms
Versionsinformationen
Funktion in Junos OS Evolved Version 20.3R1 eingeführt.
Funktion in Junos OS Evolved Version 22.1R1 veraltet.
set_vrf()-Funktion
Syntax
set_vrf(vrf_name)
Beschreibung
Legen Sie die Routing-Instanz fest, die der aktuelle Prozess zum Ausführen von Vorgängen verwendet. Zukünftige Lookups werden diese Routing-Instanz verwenden.
Verwenden Sie die set_task_vrf()
Funktion, um eine Routing-Instanz einem bestimmten Prozess anstelle des aktuellen Prozesses zuzuordnen.
Parameter
vrf_name |
Name einer Junos OS-Routing-Instanz.
|
Anwendungsbeispiele
Das folgende Python-Beispielskript ordnet die mgmt_junos
Routing-Instanz dem aktuellen Prozess zu. Das Skript pingt dann einen Host, der nur über diese Routing-Instanz erreichbar ist.
import libpyvrf as vrf import subprocess command = [ 'ping', '-c', '3', 'host1.example.com' ] try: vrf.set_vrf("mgmt_junos") print ("Using routing instance:", vrf.get_vrf()) subprocess.call(command) == 0 except vrf.invalid_table as e: print ("Invalid Table") except vrf.evo_not_ready as e: print ("Junos OS Evolved network stack is not ready") except vrf.error as e: print ("Generic libvrf error")
[vrf:none] user@host:~# python3 libpyvrf-set-vrf.py Using routing instance: mgmt_junos PING host1.example.com (198.51.100.10) 56(84) bytes of data. 64 bytes from host1.example.com (198.51.100.10): icmp_seq=1 ttl=60 time=1.02 ms 64 bytes from host1.example.com (198.51.100.10): icmp_seq=2 ttl=60 time=0.672 ms 64 bytes from host1.example.com (198.51.100.10): icmp_seq=3 ttl=60 time=0.741 ms --- host1.example.com ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2003ms rtt min/avg/max/mdev = 0.876/0.946/1.001/0.063 ms
Versionsinformationen
Funktion in Junos OS Evolved Version 20.3R1 eingeführt.