OP スクリプトで RPC と運用モード コマンドを使用する方法
ほとんどの Junos OS 運用モード コマンドには、XML と同等の機能があります。Op スクリプトは、 リモート プロシージャ コール (RPC)プロトコルを使用して、ローカルまたはリモート デバイスでこれらの XML コマンドを実行できます。XML と同等の操作モードコマンドはすべて 、Junos XML API 運用開発者リファレンスに記載されています。
OP スクリプトでの RPC および運用モード コマンドの使用については、以下のセクションで詳しく説明します。
OP スクリプトでの RPC の使用
SLAX または XSLT op スクリプトで RPC を使用するには、RPC を変数宣言に含め、RPC 変数を引数として RPC 変数またはjcs:execute()
拡張関数を使用して jcs:invoke()
RPC を呼び出します。この関数はjcs:invoke()
ローカル デバイスで RPC を実行します。この関数はjcs:execute()
、接続ハンドルと組み合わせて、リモート デバイスで RPC を実行します。
ローカル デバイスで RPC を呼び出す次のスニペットは拡張され、「 例: Op スクリプトを使用して show interfaces terse Command の出力をカスタマイズする」で詳しく説明されています。
XSLT 構文
<xsl:variable name="rpc"> <get-interface-information/> # Junos RPC for the show interfaces command </xsl:variable> <xsl:variable name="out" select="jcs:invoke($rpc)"/> ...
SLAX 構文
var $rpc = <get-interface-information>; var $out = jcs:invoke($rpc);
次のスニペットは、リモート デバイスで同じ RPC を呼び出します。
XSLT 構文
<xsl:variable name="rpc"> <get-interface-information/> # Junos RPC for the show interfaces command </xsl:variable> <xsl:variable name="connection" select="jcs:open('198.51.100.1', 'bsmith', 'test123')"/> <xsl:variable name="out" select="jcs:execute($connection, $rpc)"/> <xsl:value-of select="jcs:close($connection)"/> ...
SLAX 構文
var $rpc = <get-interface-information>; var $connection = jcs:open('198.51.100.1', 'bsmith', 'test123'); var $out = jcs:execute($connection, $rpc); expr jcs:close($connection);
Python op スクリプトでは、 RPC は Junos PyEZ API を使用して簡単に実行できます。Junos PyEZ Device
クラスの各インスタンスには、 rpc
Junos XML API を介して利用可能な任意の RPC を実行できるプロパティがあります。ローカルまたはリモートデバイスとのセッションを確立した後、プロパティとRPCメソッド名をデバイスインスタンスに rpc
追加してRPCを実行できます。戻り値は、タグの下 <rpc-reply>
の最初の要素から始まる XML オブジェクトです。
ローカル デバイスで RPC を実行するには、空の引数リストを Device
使用してインスタンスを作成します。リモート デバイスで RPC を実行するには、適切な引数を使用してデバイスに接続するインスタンス Device
を作成します。
次のコードは、ローカル デバイスで RPC を呼び出し、応答を印刷します。
Python 構文
from jnpr.junos import Device from lxml import etree with Device() as jdev: rsp = jdev.rpc.get_interface_information() print (etree.tostring(rsp, encoding='unicode'))
次のコードは、リモート デバイスで同じ RPC を呼び出し、応答を印刷します。
Python 構文
from jnpr.junos import Device from lxml import etree import jcs user = jcs.get_input('Enter username: ') password = jcs.get_secret('Enter user password: ') with Device(host='198.51.100.1', user=user, password=password) as jdev: rsp = jdev.rpc.get_interface_information() print (etree.tostring(rsp, encoding='unicode'))
リモートデバイスでRPCを実行するには、 SSH セッションを確立する必要があります。スクリプトが接続を確立するためには、スクリプトが実行されるローカルデバイス上のリモートデバイスのSSHホストキー情報を設定するか、リモートデバイスのSSHホストキー情報がスクリプトを実行しているユーザーの既知のホストファイルに存在している必要があります。RPCが実行される各リモートデバイスに対して、以下のいずれかの方法でSSHホストキー情報を設定します。
ローカルデバイスでSSH既知のホストを設定するには、 ステートメントを含め、設定の
host
階層レベルでリモートデバイスのホスト名とホストキーオプションを[edit security ssh-known-hosts]
指定します。SSHホストキー情報を手動で取得するには、設定モードコマンドを
set security ssh-known-hosts fetch-from-server hostname
発行して、Junos OSにリモートデバイスに接続し、キーを追加するよう指示します。user@host# set security ssh-known-hosts fetch-from-server router2 The authenticity of host 'router2 (198.51.100.1)' can't be established. RSA key fingerprint is 30:18:99:7a:3c:ed:40:04:0f:fd:c1:57:7e:6b:f3:90. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'router2,198.51.100.1' (RSA) to the list of known hosts.
ファイルからSSHホストキー情報を手動でインポートするには、設定モードコマンドを
set security ssh-known-hosts load-key-file filename
使用し、既知のホストファイルを指定します。user@host# set security ssh-known-hosts load-key-file /var/tmp/known_hosts Import SSH host keys from trusted source /var/tmp/known_hosts ? [yes,no] (no) yes
または、スクリプトを実行しているユーザーは、ローカルデバイス、リモートデバイスへのSSHにログインしてから、そのユーザーの既知のホストファイルに追加されたホストキーを手動で受け入れることもできます。次の例では、root がルーター1にログインしています。ルーター2でリモートRPCを実行するために、rootは運用モードコマンドを発行してキーを
ssh router2
手動で受け入れることで、ルーター2のホストキーを追加します。root@router1> ssh router2 The authenticity of host 'router2 (198.51.100.1)' can't be established. RSA key fingerprint is 30:18:99:7a:3c:ed:40:04:0f:fd:c1:57:7e:6b:f3:90. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'router2,198.51.100.1' (RSA) to the list of known hosts.
コマンドの RPC タグの表示
デバイスの CLI で、運用モード コマンドの RPC XML タグを表示できます。コマンドの RPC XML タグを表示するには、パイプ 記号 (|) の後に を入力します display xml rpc
。
以下の例では、 コマンドの RPC タグを show route
表示しています。
user@host> show route | display xml rpc <rpc-reply xmlns:junos="http://xml.juniper.net/junos/10.1I0/junos"> <rpc> <get-route-information> </get-route-information> </rpc> <cli> <banner></banner> </cli> </rpc-reply>
SLAX および XSLT スクリプトは、RPC XML タグを使用して RPC を実行できます。Python スクリプトは、RPC タグとコマンド オプションを Python に適した形式に変換する必要があります。RPC の実行に Junos PyEZ を使用する方法、および RPC タグを対応する Python メソッドおよびメソッド引数にマッピングする方法については、 Junos OS を実行するデバイスで Junos PyEZ を使用して RPC を実行するを参照してください。
運用スクリプトでの運用モード コマンドの使用
一部の運用モード コマンドには、XML に相当するものがありません。SLAX および XSLT スクリプトは、 要素を使用して XML と同等のコマンドを <command>
実行できます。Python スクリプトは、クラスで定義された Junos PyEZ cli()
メソッドを使用して、これらのコマンドを Device
実行できます。
Junos XML API 運用開発者リファレンスにコマンドがリストされていない場合、コマンドに XML と同等のコマンドはありません。コマンドに XML と同等の値があるかどうかを判断するもう 1 つの方法は、次のようなコマンドの後に コマンドを| display xml
発行することです。
user@host> operational-mode-command | display xml
出力に 、 <cli>
<banner>
などの<output>
タグ要素のみが含まれている場合、 コマンドに XML と同等のものがない場合があります。次の例では、出力は、 コマンドにshow host
同等の XML がないことを示しています。
user@host> show host hostname | display xml <rpc-reply xmlns:junos="http://xml.juniper.net/junos/10.0R1/junos"> <output> ... </output> <cli> <banner></banner> </cli> </rpc-reply>
XML と同等のコマンドを持つ一部のコマンドでは、パイプ | display xml
コマンドの出力に 、 <cli>
<banner>
以外のタグ要素<output>
は含まれません。これは、関連する機能が設定されていないためです。たとえば、 show services cos statistics forwarding-class
コマンドには応答タグで<service-cos-forwarding-class-statistics>
出力を返す XML 同等のものがありますが、設定に 階層レベルに[edit class-of-service]
ステートメントが含まれていない場合、コマンドに表示する実際のshow services cos statistics forwarding-class | display xml
データはありません。出力は次のようになります。
user@host> show services cos statistics forwarding-class | display xml <rpc-reply xmlns:junos="http://xml.juniper.net/junos/8.3I0/junos"> <cli> <banner></banner> </cli> </rpc-reply>
このため、 Junos XML API 運用開発者リファレンス の情報は通常、より信頼性が高くなります。
SLAX および XSLT op スクリプトには、XML に相当するものがないコマンドを含めることができます。次の<command>
コードスニペットに示すように、スクリプト内の 、 <xsl:value-of>
<output>
、 要素を使用します。このスニペットは拡張され、「例: Op スクリプトを使用した DNS ホスト名情報の表示」で詳しく説明されています。
<xsl:variable name="query"> <command> <xsl:value-of select="concat('show host ', $hostname)"/> </command> </xsl:variable> <xsl:variable name="result" select="jcs:invoke($query)"/> <xsl:variable name="host" select="$result"/> <output> <xsl:value-of select="concat('Name: ', $host)"/> </output> ...
Python op スクリプトは、Junos PyEZ API を使用することで、XML と同等のコマンドを実行できます。クラスで定義されたDevice
メソッドはcli()
、運用モード コマンドを実行し、テキスト形式で出力を返します。例えば:
from jnpr.junos import Device def main(): with Device() as jdev: res = jdev.cli('show host hostname', warning=False) print (res) if __name__ == "__main__": main()
Junos OS XML 要素としてフォーマットされた出力を返すように指定 format='xml'
することもできます。Junos PyEZ cli()
メソッドの詳細については、「 http://junos-pyez.readthedocs.org/en/latest/_modules/jnpr/junos/device.html#Device.cli」を参照してください。