如何在运行 Junos OS 演化的设备上的 Python 3 应用程序中指定路由实例
了解 libpyvrf 模块
路由实例是路由表、接口和路由协议参数的集合。每个路由实例都有一个唯一的名称和相应的 IP 单播表,可用于将该实例的流量与其他流量分隔开来。例如,在运行 Junos OS Evolved 的设备上,您可以启用专用管理虚拟路由和转发 (VRF) 实例, mgmt_junos该实例使用专用于管理任务的单独管理路由表。
通过路由实例,您无需使用多个设备对网络进行分段,即可隔离通过网络的流量。当您使用路由实例隔离流量时,网络实用程序喜欢 ping 且 ssh 必须参考正确的路由实例,以便将流量发送至可通过该实例到达的目标。
Junos OS Evolved 图像在 Linux 上本机运行,提供对所有 Linux 公用事业和运营的直接访问,包括作为基本映像一部分的 Python 库。运行 Junos OS Evolved 的设备上的 Python 3 库还包括瞻博网络 libpyvrf 模块,该模块允许在 shell 中执行的 Python 3 应用程序指定路由实例用于特定流程和网络实用程序。
表 1 概述了 libpyvrf 您可以在 Linux 外壳中执行的 Python 3 应用程序中使用的功能。您可以使用这些功能来指示进程使用特定路由实例。如果同一进程需要多个路由实例,您还可以为特定插槽设置路由实例上下文,这不会影响进程本身的上下文。通过插座的数据包,然后使用与该实例关联的路由表。将路由实例设置为进程或插槽时, libpyvrf 该模块会将上下文设置为与 Junos OS 路由实例对应的 Linux VRF。
|
描述 |
|---|---|
|
将对应于 Junos OS 路由实例的 Linux VRF 返回。 |
|
退还与指定路由实例关联的路由表索引。 |
|
退还与指定任务关联的路由实例。
注意:
此功能在 Junos OS Evolved 版本 22.1R1 中已弃用。 |
|
返回与当前进程关联的路由实例。 |
|
为指定插座设置路由实例。 |
|
为指定进程设置路由实例。
注意:
此功能在 Junos OS Evolved 版本 22.1R1 中已弃用。 |
|
为当前进程设置路由实例。 |
模块中的 libpyvrf 功能可根据功能和错误增加以下例外情况:
libpyvrf.error—返回错误时libvrf生成。libpyvrf.evo_not_ready—在 Junos OS Evolved 网络堆栈未就绪时生成,例如设备启动时。libpyvrf.invalid_table—在指定的路由实例或表 ID 无效时生成。
以下示例 Python 脚本尝试 ping 只能通过路由实例到达的 mgmt_junos 主机。在调用功能之前,脚本会先对主机进行 set_vrf() ping。然后,脚本调用 set_vrf() 该功能将路由实例与当前进程关联 mgmt_junos ,然后再次对主机进行 ping。
[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")
执行脚本时,第一个 ping 命令将失败,因为此情况下进程使用默认路由实例,并且主机只能通过 mgmt_junos 路由实例到达。使用路由实例的第二个 ping 命令 mgmt_junos 成功。
[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
您可将路由实例重置为 Python 应用程序中的默认路由实例关联,方法是为路由实例名称指定空字符串。例如:
vrf.set_vrf("")
如果应用程序未指定路由实例,默认路由实例关联将取决于进程的环境。如果环境预加载 libsi.so 库,则默认情况下,应用程序将使用默认路由实例和表 default.inet。否则,没有与进程或插座关联的默认路由实例。
要确定环境是否预加载 libsi.so 库,请验证环境变量的 LD_PRELOAD 值是否包括到库的路径。
[vrf:none] user@host:~# env | grep LD_PRELOAD LD_PRELOAD=libsi.so
LD_PRELOAD如果变量不包括 libsi.so 库路径,则可以使用适合您的 shell 的命令来添加,例如:
[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() 功能
语法
host_vrf_name get_host_vrf_name(vrf_name)
描述
将对应于 Junos OS 路由实例的 Linux VRF 返回。
参数
vrf_name |
Junos OS 路由实例的名称。 |
回报值
| host_vrf_name | 对应于 Junos OS 路由实例的 Linux VRF 名称。 |
使用情况示例
以下示例打印出对应于多个 Junos OS 路由实例的 Linux VRF:
[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
发布信息
Junos OS Evolved 版本 20.3R1 中引入的功能。
get_table_id() 功能
语法
table_id get_table_id(vrf_name)
描述
退还与指定路由实例关联的路由表索引。如果未定义路由实例,功能将返回 -1。
参数
vrf_name |
Junos OS 路由实例的名称。 |
回报值
| table_id | 给定路由实例的路由表索引。 |
使用情况示例
以下示例检索并打印路由实例和未定义路由实例foo的表索mgmt_junos引。
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")
脚本将返回实例的 mgmt_junos 表索引,而未定义实例的返回 -1。
[vrf:none] user@host:~# python3 libpyvrf-get-table-id.py 36738 -1
发布信息
Junos OS Evolved 版本 20.3R1 中引入的功能。
get_task_vrf() 功能
语法
vrf_name get_task_vrf(tid)
描述
退还与指定进程 ID 关联的 Junos OS 路由实例。
参数
tid |
用于检索相关路由实例的进程 ID。 |
回报值
| vrf_name | 与进程 ID 关联的路由实例的名称。 |
使用情况示例
以下示例检索当前进程的进程 ID,并将路由实例与该进程相关联 mgmt_junos 。当脚本调用该 get_task_vrf() 功能以请求该进程 ID 的路由实例时,将返回 mgmt_junos 路由实例。
[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
发布信息
Junos OS Evolved 版本 20.3R1 中引入的功能。
Junos OS Evolved 版本 22.1R1 中弃用的功能。
get_vrf() 功能
语法
vrf_name get_vrf()
描述
返回与当前进程关联的 Junos OS 路由实例。
回报值
vrf_name |
与当前进程关联的路由实例的名称。 |
使用情况示例
以下示例将路由实例与当前进程相关联 mgmt_junos 。当脚本调用该 get_vrf() 功能以请求当前进程的路由实例时,将返回 mgmt_junos 路由实例。
[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
发布信息
Junos OS Evolved 版本 20.3R1 中引入的功能。
set_socket_vrf() 功能
语法
set_socket_vrf(socket_fd, vrf_name)
描述
设置指定插座使用的路由实例。当同一应用程序内的多个插槽需要使用不同的路由实例时,为插槽设置路由实例会很有用。您可以为每个插座单独设置路由实例上下文,而不会影响进程或应用程序的路由实例上下文。
参数
socket_fd |
套接字的文件描述符。 |
vrf_name |
Junos OS 路由实例的名称。
|
发布信息
Junos OS Evolved 版本 20.3R1 中引入的功能。
set_task_vrf() 功能
语法
set_task_vrf(tid, vrf_name)
描述
设置具有指定进程 ID 的进程用于执行操作的路由实例。
而设置当前进程的路由实例,set_task_vrf()则set_vrf()使用指定的进程 ID 设置该进程的路由实例。
参数
tid |
用于将使用指定路由实例的进程的进程 ID。 |
vrf_name |
Junos OS 路由实例的名称。
|
使用情况示例
以下示例 Python 脚本检索当前进程的进程 ID,并将路由实例与该进程相关联 mgmt_junos 。然后,脚本会 ping 只能通过路由实例到达的主机。
[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
发布信息
Junos OS Evolved 版本 20.3R1 中引入的功能。
Junos OS Evolved 版本 22.1R1 中弃用的功能。
set_vrf() 功能
语法
set_vrf(vrf_name)
描述
设置当前进程用于执行操作的路由实例。未来的查找将使用此路由实例。
要将路由实例与特定进程(而非当前进程)相关联,请使用此 set_task_vrf() 功能。
参数
vrf_name |
Junos OS 路由实例的名称。
|
使用情况示例
以下示例 Python 脚本将路由实例与当前进程相关联 mgmt_junos 。然后,脚本会 ping 只能通过路由实例到达的主机。
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
发布信息
Junos OS Evolved 版本 20.3R1 中引入的功能。