イベント スクリプトで 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 クラスの各インスタンスには、rpcJunos 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」を参照してください。