Help us improve your experience.

Let us know what you think.

Do you have time for a two-minute survey?

 
 

Junos PyEZ を使用して Junos デバイスで RPC を実行する

概要 このプロパティDevicerpcを使用して、Junos デバイスで運用可能な RPC を実行します。

Junos PyEZを使用して、Junosデバイス上でオンデマンドでリモートプロシージャコール(RPC)を実行することができます。クラスのインスタンス Device を作成した後、インスタンスのプロパティ Device として RPC を実行できます。Junos PyEZを使えば、CLIで実行できる操作コマンドとほとんど同じ操作コマンドを実行できます。

Junos XML APIは、Junos OSの設定ステートメントと運用モードコマンドをXMLで表現したものです。Junos OS 設定階層内のすべてのステートメントと、CLI 操作モードで発行するコマンドの多くに相当する XML を定義します。Junos XMLに対応する各動作モードコマンドは、リクエストタグ要素と、必要に応じて応答タグ要素にマップされます。リクエストタグは、Junosデバイスから情報をリクエストするために、NETCONFまたはJunos XMLプロトコルセッション内のRPCで使用されます。サーバーは、応答タグ要素で囲まれたJunos XML要素を使用して応答を返します。

Junos PyEZを使用してRPCを実行する場合、リクエストタグ名をメソッド名にマッピングします。このトピックでは、CLI コマンドを Junos PyEZ RPC にマッピングする方法、Junos PyEZ を使用して RPC を実行する方法、RPC 応答で返されるデータをカスタマイズする方法について説明します。

Junos OSコマンドをJunos PyEZ RPCにマッピング

対応する Junos XML を持つすべての操作コマンドは、 Junos XML API Explorer に一覧表示されます。CLI上で、またはJunos PyEZを使用して、Junos XMLに対応するものを持つ任意の動作モードコマンドに対して、Junos XMLリクエストタグ要素を表示することも可能です。リクエストタグを取得したら、それをJunos PyEZ RPCメソッド名にマッピングすることができます。

CLIでコマンドのJunos XMLリクエストタグを表示するには、コマンドの後に オプションを含め | display xml rpc ます。以下の例は、 コマンドの show route リクエストタグを表示します。

Junos PyEZを使用して、コマンドのJunos XMLリクエストタグを表示することもできます。要求タグを表示するには、インスタンス display_xml_rpc() メソッドをDevice呼び出し、コマンド文字列と format='text' を引数として含めます。例えば:

プログラムを実行すると、コマンドの show route リクエストタグが返されます。

操作コマンドのリクエストタグをJunos PyEZ RPCメソッド名にマッピングすることができます。RPC メソッド名を取得するには、要求タグ内のハイフンをアンダースコア (_) に置き換え、囲む山かっこを削除します。たとえば、要求タグは <get-route-information> メソッド名に get_route_information() マップされます。

デバイスインスタンスのプロパティとしてRPCを実行する

の各 Device インスタンスには、 rpc Junos XML API を通じて利用可能な任意の RPC を実行できるプロパティがあります。Junos PyEZアプリケーションでは、デバイスとの接続を確立した後、次の例に示すように、プロパティとRPCメソッド名をデバイスインスタンスに追加することでRPC rpc を実行できます。

戻り値は、タグの下の <rpc-reply> 最初の要素から始まる XML オブジェクトです。この場合、RPC は get_software_information() 要素を返します <software-information>

Junos OS コマンドには、値を持たない固定形式オプションを指定できます。例えば、コマンドに相当する show interfaces terse Junos XMLは、それが terse 空の要素であることを示しています。

RPC を実行し、値を受け取らないコマンド オプションを含めるには、RPC メソッドの引数リストにオプションを追加し、オプション名のダッシュをアンダースコアに変更して、True に設定します。次のコードは、 コマンドに相当する show interfaces terse Junos PyEZ RPC を実行します。

Junos OS コマンドには、値を必要とするオプションを含めることもできます。たとえば、次の出力では、 interface-name 要素には、情報を返すインターフェイスの名前である値が必要です。

RPC を実行し、値を必要とするコマンド オプションを含めるには、RPC メソッドの引数リストにオプションを追加し、オプション名のダッシュをアンダースコアに変更してから、適切な値に設定します。以下の例では、 コマンドに相当する show interfaces ge-0/0/0 Junos PyEZ RPC を実行します。

RPC 出力の形式を指定します

既定では、RPC の戻り値は、タグの下の<rpc-reply>最初の要素から始まる XML オブジェクトです。また、RPC メソッドの最初の引数として または ディクショナリを含めることで{'format':'text'}{'format':'json'}、テキストまたは JavaScript Object Notation (JSON) 形式で RPC 出力を返すこともできます。

メモ:

JSON 形式の RPC 出力は、Junos OS リリース 14.2R1 以降でサポートされています。

次の例では、RPC の出力get_software_information()をテキスト形式で返します。これは、RPC 出力が要素で<output>囲まれている点を除き、CLI のコマンドに対してshow version出力される出力と同じです。

次の例では、 get_software_information() RPC の出力を JSON 形式で返します。

返すデータの範囲を指定する

Junos PyEZ を使用して RPC を実行し、Junos デバイスから運用情報を取得することができます。Junos PyEZリリース2.3.0以降、XML出力をリクエストする際に、特定の要素のみを返すように返信をフィルタリングできるようになりました。出力のフィルター処理は、広範な操作出力があるが、データのサブセットのみを操作する必要がある場合に便利です。

特定のタグのみを返すように RPC 応答をフィルター処理するには、RPC メソッドの引数を含めます filter_xml 。このパラメーターは filter_xml 、返す要素を選択するサブツリー フィルターを含む文字列を受け取ります。サブツリー フィルターは、選択条件に一致するデータを返します。

次の Junos PyEZ の例では、RPC を実行し、<get-interface-information>出力をフィルター処理して、応答の各<physical-interface>要素の要素のみ<name>を取得します。

スクリプトを実行すると、各物理インターフェイスの name 要素が表示されます。

RPC タイムアウトを指定する

RPC の実行時間は、RPC とデバイスによって大きく異なる場合があります。デフォルトでは、NETCONF RPCは30秒後にタイムアウトします。実行時に引数を含め dev_timeout=seconds 、実行中にRPCがタイムアウトしないようにすることで、タイムアウト値を拡張できます。 dev_timeout は、その単一のRPC操作に対してのみデバイスのタイムアウトを調整します。

XML RPC 応答を正規化する

RPC を実行すると、RPC 応答に改行で折り返されたデータやその他の余分な空白が含まれる場合があります。不要な空白があると、XML を解析し、テキストベースの検索を使用して情報を検索することが困難になる可能性があります。RPC 応答を正規化すると、先頭と末尾の空白がすべて削除され、内部空白文字のシーケンスが 1 つのスペースに置き換えられます。

表 1 は、既定の RPC 応答と正規化されたバージョンを比較しています。既定の RPC 応答には、正規化された応答には存在しない多くの改行が含まれています。

表 1: 既定の RPC 応答と正規化された RPC 応答の比較

既定の RPC 応答

正規化された RPC 応答

<interface-information style="terse">
<logical-interface>
<name>\nge-0/0/0.0\n</name>
<admin-status>\nup\n</admin-status>
<oper-status>\nup\n</oper-status>
<filter-information>\n</filter-information>
<address-family>
<address-family-name>\ninet\n</address-family-name>
<interface-address>
<ifa-local emit="emit">\n198.51.100.1/24\n</ifa-local>
</interface-address>
</address-family>
</logical-interface>
</interface-information>
<interface-information style="terse">
<logical-interface>
<name>ge-0/0/0.0</name>
<admin-status>up</admin-status>
<oper-status>up</oper-status>
<filter-information/>
<address-family>
<address-family-name>inet</address-family-name>
<interface-address>
<ifa-local emit="emit">198.51.100.1/24</ifa-local>
</interface-address>
</address-family>
</logical-interface>
</interface-information>

デバイスとのセッションの間は正規化を有効にしたり、RPC の実行時に個々の RPC 応答を正規化したりできます。デバイス セッション全体の正規化を有効にするには、デバイス インスタンスを作成するとき、またはメソッドを使用してopen()デバイスに接続するときに、引数の一覧に含めnormalize=Trueます。

個々の RPC 応答を正規化するには、その RPC メソッドの引数リストに含め normalize=True ます。

例えば:

RPC 応答を正規化しない場合は、特定のノードまたは値を参照する XPath 式を使用するときに空白を考慮する必要があります。次に、論理インターフェイスの IPv4 アドレスを選択する例を示します。XPath 式では、ファミリーを指定する inet 述部で、検索を成功させるために追加の空白を考慮する必要があります。結果の値には、先頭と末尾の改行が含まれます。

RPC 応答を正規化すると、先頭と末尾の空白が削除され、テキスト ベースの検索がはるかに簡単になります。