イベント スクリプトで RPC と運用モード コマンドを使用する方法
ほとんどの Junos OS 運用モード コマンドには、XML と同等の機能があります。イベント スクリプトは、 リモート プロシージャ コール (RPC)プロトコルを使用して、ローカルまたはリモート デバイスでこれらの XML コマンドを実行できます。XML と同等の操作モードコマンドはすべて 、Junos XML API 運用開発者リファレンスに記載されています。
SLAX スクリプトと XSLT スクリプトは、それぞれ または jcs:execute()
拡張関数を使用してローカル デバイスまたはリモート デバイスで RPC をjcs:invoke()
実行します。Python スクリプトでは、RPC は Junos PyEZ API を使用して簡単に実行できます。Junos PyEZ Device
クラスの各インスタンスには、rpc
Junos XML API を介して利用可能な任意の RPC を実行できるプロパティがあります。ローカルまたはリモートデバイスとのセッションを確立した後、プロパティとRPCメソッド名をデバイスインスタンスにrpc
追加してRPCを実行できます。戻り値は、タグの下<rpc-reply>
の最初の要素から始まる XML オブジェクトです。
イベント スクリプトでの RPC および運用モード コマンドの使用については、以下のセクションで詳しく説明します。
ローカル デバイスでの RPC の実行
SLAX または XSLT イベント スクリプトでは、ローカル デバイスで RPC を実行するには、RPC を変数宣言に含め、RPC 変数を引数として拡張関数を呼び出します jcs:invoke()
。次のスニペットは、ローカル デバイスで RPC を呼び出します。
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);
Python イベント スクリプトでは、ローカル デバイスで RPC を実行するには、空の Device
引数リストを使用してインスタンスを作成し、プロパティと RPC メソッド名と引数リストをデバイス インスタンスに追加 rpc
します。
Python 構文
from jnpr.junos import Device with Device() as jdev: rsp = jdev.rpc.get_interface_information()
空の Device
引数リストを使用してインスタンスを作成してローカルデバイスに接続すると、Junos OSは 階層レベルで設定されたユーザーのアクセス権限を [edit event-options event-script file filename python-script-user]
使用します。ステートメントを python-script-user
省略すると、Junos OS は一般の恵まれないユーザーおよびグループ nobody
のアクセス権限を使用します。
リモート デバイスでの RPC の実行
SLAX または XSLT イベント スクリプトでは、リモート デバイスで RPC を実行するには、まず RPC を変数宣言に含め、リモート デバイスへの接続に必要な引数を持つ拡張関数を使用して jcs:open()
接続ハンドルを作成します。その後、拡張関数を jcs:execute()
呼び出し、接続ハンドルと RPC 変数を引数として含めます。例えば:
XSLT 構文
<xsl:variable name="rpc"> <get-interface-information/> </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 イベント スクリプトでは、リモート デバイスで RPC を実行するには、まずリモート デバイスへの接続に必要な引数を使用するインスタンス Device
を作成します。次に、プロパティと RPC メソッド名と引数リストを rpc
デバイス インスタンスに追加して RPC を実行します。
Python 構文
from jnpr.junos import Device with Device(host='198.51.100.1', user='bsmith', passwd='test123') as jdev: rsp = jdev.rpc.get_interface_information()
Junos OSは、 階層レベルで ステートメントに異なるユーザーが設定されている場合でも、引数リストで指定されたユーザーのアクセス権限をDevice()
使用してリモートデバイスに接続し、操作を[edit event-options event-script file filename]
python-script-user
実行します。
リモート接続の詳細をイベント スクリプトに直接追加しないように、階層レベルでリモート デバイス上で RPC を実行する各イベント スクリプトのリモート実行の詳細を [edit event-options event-script file filename remote-execution]
指定できます。イベント スクリプトではなく、リモート実行の詳細を構成に追加することをお勧めします。すべての情報が 1 つの場所で利用でき、秘密鍵が設定で暗号化されるためです。
RPCが実行される各リモートデバイスについて、デバイスホスト名と対応するユーザー名と秘密鍵を設定します。
[edit event-options event-script file filename] remote-execution { remote-hostname { username username; passphrase passphrase; } }
イベントの詳細に加えて、リモートホスト名と対応するユーザー名と秘密鍵が、イベントポリシーによって実行されると、イベントスクリプトへの入力として渡されます。イベント スクリプトに転送される詳細については、「イベント スクリプト でイベントとリモート実行の詳細を使用する」を参照してください。
イベント スクリプトは、リモート ホストへの接続の作成に使用される関数の引数リスト内のリモート実行の詳細を参照します。接続が確立されると、スクリプトはそのデバイスで RPC を実行できます。
Python イベント スクリプトでは、Junos PyEZ Device()
インスタンスの引数リストでリモート実行の詳細を参照します。次のコードは、そのイベント スクリプト用に構成されたすべてのホストのリモート実行の詳細を繰り返し、各ホストで同じ RPC に接続して実行します。
Python 構文
from junos import Junos_Remote_Execution_Details from jnpr.junos import Device def main() for remote in Junos_Remote_Execution_Details(): hostname = remote.host username = remote.user passphrase = remote.passwd with Device(host=hostname, user=username, passwd=passphrase) as jdev: inv = jdev.rpc.get_interface_information() #process RPC information... if __name__ == "__main__": main()
SLAX スクリプトまたは XSLT スクリプトでは、関数を使用してリモート ホストへの接続を jcs:open()
作成し、引数リストでリモート実行の詳細を参照します。例えば:
XSLT 構文
<xsl:variable name="rpc"> <get-interface-information/> </xsl:variable> <xsl:for-each select="event-script-input/remote-execution-details"> <xsl:variable name="d" select="remote-execution-detail"/> <xsl:variable name="connection" select="jcs:open($d/remote-hostname,$d/username,$d/passphrase)"/> <xsl:variable name="out" select="jcs:execute($connection, $rpc)"/> <xsl:value-of select="jcs:close($connection)"/> ... </xsl:for-each>
SLAX 構文
var $rpc = <get-interface-information>; for-each (event-script-input/remote-execution-details) { var $d = remote-execution-detail; var $connection = jcs:open($d/remote-hostname,$d/username,$d/passphrase); var $out = jcs:execute($connection, $rpc); expr jcs:close($connection); ... }
リモートデバイスで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.
必要なSSHホストキーを設定し、リモートデバイスへの接続ハンドルを取得した後、イベントスクリプトはそのリモートデバイスで拡張機能を jcs:execute()
備えたRPCを実行できます。
コマンドの 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 イベント スクリプトは、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 イベント スクリプトは、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」を参照してください。