Junos OS Evolvedを実行しているデバイス上のPython 3アプリケーションでルーティングインスタンスを指定する方法
libpyvrf モジュールについて
ルーティングインスタンスは、ルーティングテーブル、インターフェイス、ルーティングプロトコルパラメーターの集合です。各ルーティング インスタンスには固有の名前と対応する IP ユニキャスト テーブルがあり、このテーブルを使用して、そのインスタンスのトラフィックを他のトラフィックと分離することができます。たとえば、Junos OS Evolvedを実行しているデバイスでは、管理タスク専用の個別の管理ルーティングテーブルを使用する、 mgmt_junos
専用の管理仮想ルーティングおよび転送(VRF)インスタンスを有効にすることができます。
ルーティング インスタンスを使用すると、複数のデバイスを使用してネットワークをセグメント化することなく、ネットワークを通過するトラフィックを分離できます。ルーティングインスタンスを使用してトラフィックを分離する場合、ネットワークユーティリティはping
ssh
、そのインスタンスを通じて到達可能な宛先にトラフィックを送信するために、正しいルーティングインスタンスを参照する必要があります。
Junos OS Evolvedイメージは、Linux上でネイティブに動作し、ベースイメージの一部であるPythonライブラリを含むすべてのLinuxユーティリティと操作への直接アクセスを提供します。Junos OS Evolved実行しているデバイス上の Python 3 ライブラリには、Juniper Networks libpyvrf
モジュールも含まれています。これにより、シェルで実行される Python 3 アプリケーションで、特定のプロセスやネットワーク ユーティリティに使用するルーティング インスタンスを指定できます。
表 1 は、 libpyvrf
Linux シェルで実行される Python 3 アプリケーションで使用できる関数の概要を示しています。この機能を使用して、特定のルーティングインスタンスを使用するようプロセスに指示できます。同じプロセスで複数のルーティングインスタンスが必要な場合、特定のソケットに対してルーティングインスタンスコンテキストを設定することもできます。これはプロセス自体のコンテキストには影響しません。その後、ソケットを通過するパケットは、そのインスタンスに関連付けられたルーティングテーブルを使用します。プロセスまたはソケットのルーティングインスタンスを設定すると、モジュールは libpyvrf
Junos OSルーティングインスタンスに対応するLinux VRFにコンテキストを設定します。
|
説明 |
---|---|
|
Junos OS ルーティング インスタンスに対応する Linux VRF を返します。 |
|
指定されたルーティング インスタンスに関連付けられたルーティング テーブルのインデックスを返します。 |
|
指定したタスクに関連付けられたルーティング インスタンスを返します。
メモ:
この機能は、リリース 22.1R1 Junos OS Evolved以降は非推奨です。 |
|
現在のプロセスに関連付けられたルーティング インスタンスを返します。 |
|
指定されたソケットのルーティング インスタンスを設定します。 |
|
指定されたプロセスのルーティング インスタンスを設定します。
メモ:
この機能は、リリース 22.1R1 Junos OS Evolved以降は非推奨です。 |
|
現在のプロセスのルーティング インスタンスを設定します。 |
モジュール内の libpyvrf
関数は、関数とエラーに応じて次の例外を発生させることができます。
libpyvrf.error
- エラーが返されたときにlibvrf
生成されます。libpyvrf.evo_not_ready
—デバイスが起動しているときなど、Junos OS Evolvedネットワーク スタックの準備が整っていない場合に生成されます。libpyvrf.invalid_table
— 指定されたルーティング インスタンスまたはテーブル ID が無効な場合に生成されます。
次のサンプル Python スクリプトは、ルーティング インスタンスを通してのみ到達可能なホストに ping を mgmt_junos
試みます。このスクリプトは、関数を呼び出す前に、最初にホストに ping を実行します set_vrf()
。次に、このスクリプトは、 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")
スクリプトを実行すると、プロセスがこのケースではデフォルトのルーティング インスタンスを使用し、ホストはルーティング インスタンスを通してのみ mgmt_junos
到達可能であるため、最初の ping コマンドは失敗します。ルーティングインスタンスを使用する2番目の mgmt_junos
pingコマンドは成功します。
[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 ライブラリ パスが含まれていない場合、シェルに適したコマンドを使用して追加できます。
[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 | 指定されたルーティング インスタンスのルーティング テーブルのインデックス。 |
使用例
次の例では、ルーティングインスタンスと未定義のルーティングインスタンスの mgmt_junos
テーブルインデックスを取得して印刷します foo
。
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)
説明
指定されたソケットで使用されるルーティング インスタンスを設定します。1 つのソケットにルーティング インスタンスを設定すると、同じアプリケーション内で複数のソケットで異なるルーティング インスタンスを使用する必要がある場合に便利です。プロセスまたはアプリケーションのルーティング・インスタンス・コンテキストに影響を与えることなく、各ソケットのルーティング・インスタンス・コンテキストを個別に設定することができます。
パラメーター
socket_fd |
ソケットのファイル記述子。 |
vrf_name |
Junos OS ルーティング インスタンスの名前。
|
リリース情報
Junos OS Evolved リリース 20.3R1 で導入された関数。
set_task_vrf()機能
構文
set_task_vrf(tid, vrf_name)
説明
指定されたプロセス ID を持つプロセスが操作の実行に使用するルーティング インスタンスを設定します。
一方、現在のプロセスのルーティングインスタンスを設定します set_vrf()
が、 set_task_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 で導入された関数。