このページで
例:Op スクリプトを使用したファイルのエクスポート
この例の op スクリプト は、Junos XML プロトコル file-put 操作を使用して、リモート サーバーとローカル デバイス上のファイルに書き込みます。
要件
この例では、Junos OSを実行しているデバイスを使用しています。
概要と運用スクリプト
Junos XML プロトコル file-put 操作は、ファイルを作成し、指定されたコンテンツをそのファイルに書き込みます。コマンドを使用 file-put するための基本的な構文は次のとおりです。
<rpc> <file-put> <delete-if-exist /> <encoding>value</encoding> <filename>value</filename> <permission>value</permission> <file-contents>file</file-contents> </file-put> </rpc>
以下のタグ要素は、 コマンドで file-put 使用されます。これらのタグは、 を除き、任意の file-contents順序で配置できます。tag 要素は file-contents 、リストの最後のタグにする必要があります。
delete-if-exist—(オプション)含まれている場合、既存のファイルが上書きされます。タグを省略すると、既存のファイルが検出された場合にエラーが返されます。encoding—(必須)使用するエンコーディングの種類を指定します。またはエンコーディングを使用ASCIIbase64できます。filename—(必須)このタグ内では、作成するファイルの完全または相対パスとファイル名を含めます。相対パスを使用する場合、指定されたパスはユーザーのホーム ディレクトリに対する相対パスになります。指定されたディレクトリが存在しない場合、システムは「ディレクトリが存在しない」エラーを返します。permission—(オプション)リモートサーバーでファイルのUNIXパーミッションを設定します。たとえば、ユーザーに読み取り/書き込みアクセス権を適用し、他のユーザーへの読み取りアクセスを適用するには、パーミッション値を0644に設定します。UNIX パーミッションの完全な説明については、 コマンドをchmod参照してください。file-contents—(必須)エクスポートするASCIIまたはbase64エンコードされたファイルコンテンツ。これは、リストの最後のタグにする必要があります。
XSLT 構文
以下のサンプル スクリプトは、Junos XML API リクエストを実行し、その結果をリモート デバイス上のファイルとローカル デバイスのファイルにエクスポートします。このスクリプトには、リモート デバイスの IP アドレスまたはホスト名、ファイル名、ファイル エンコードの 3 つの引数があります。引数の名前と説明がコマンドライン・インターフェース (CLI) に表示されるように、変数は arguments スクリプトのグローバル・レベルで宣言されます。
このスクリプトは、ローカル デバイスで Junos XML API <get-software-information> リクエストを呼び出し、その結果を result 変数に格納します。このスクリプトは、操作のfileputリモート プロシージャ コール(RPC)を含む変数をfile-put宣言します。コマンド ライン引数は、 および encoding タグ要素の値をfilename定義します。必須の引数myhostが欠落している場合、スクリプトはエラーを発行して実行を停止します。それ以外の場合、リモート デバイスへの接続に使用するユーザー名とパスワードを入力するよう求められます。
リモート デバイスへの接続が成功した場合、スクリプトは接続ハンドルのコンテキスト内で RPC を実行します。関数の file-put 結果である という操作の jcs:execute() 出力は、 変数に out 格納されます。という操作でエラーが発生した場合、スクリプトは CLI にエラーを出力します。操作が file-put 成功すると、tag 要素で file-contents 指定されたコンテンツがリモート デバイス上の指定されたファイルにエクスポートされます。その後、リモート・ホストへの接続は閉じられます。このスクリプトは、ローカル デバイス上の同一ファイルにコンテンツをエクスポートします。
サンプル スクリプトには、オプションのタグ要素 permission と delete-if-exist という操作が file-put 含まれています。タグを delete-if-exist 含めることで、スクリプトはリモートホストとローカルホスト上の同じ名前の既存のファイルを上書きします。この例では、タグは permission に設定されています 0644。
<?xml version="1.0" standalone="yes"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:junos="http://xml.juniper.net/junos/*/junos"
xmlns:xnm="http://xml.juniper.net/xnm/1.1/xnm"
xmlns:jcs="http://xml.juniper.net/junos/commit-scripts/1.0" version="1.0">
<xsl:import href="../import/junos.xsl"/>
<xsl:variable name="arguments">
<argument>
<name>myhost</name>
<description>IP address or hostname of the remote host</description>
</argument>
<argument>
<name>filename</name>
<description>name of destination file</description>
</argument>
<argument>
<name>encoding</name>
<description>ascii or base64</description>
</argument>
</xsl:variable>
<xsl:param name="myhost"/>
<xsl:param name="filename"/>
<xsl:param name="encoding"/>
<xsl:template match="/">
<op-script-results>
<xsl:variable name="rpc">
<get-software-information/>
</xsl:variable>
<xsl:variable name="result" select="jcs:invoke($rpc)"/>
<xsl:variable name="fileput">
<file-put>
<filename>
<xsl:value-of select="$filename"/>
</filename>
<encoding>
<xsl:value-of select="$encoding"/>
</encoding>
<permission>0644</permission>
<delete-if-exist/>
<file-contents>
<xsl:value-of select="$result"/>
</file-contents>
</file-put>
</xsl:variable>
<xsl:choose>
<xsl:when test="$myhost = ''">
<xnm:error>
<message>missing mandatory argument 'myhost'</message>
</xnm:error>
</xsl:when>
<xsl:otherwise>
<xsl:variable name="username" select="jcs:get-input('Enter username: ')"/>
<xsl:variable name="pw" select="jcs:get-secret('Enter password: ')"/>
<xsl:variable name="connect" select="jcs:open($myhost, $username, $pw)"/>
<xsl:choose>
<xsl:when test="$connect">
<output>Connected to host. Exporting file... </output>
<xsl:variable name="out" select="jcs:execute($connect, $fileput)"/>
<xsl:choose>
<xsl:when test="$out//xnm:error">
<xsl:copy-of select="($out//xnm:error)"/>
</xsl:when>
<xsl:otherwise>
<output>
<xsl:value-of select="$out"/>
</output>
</xsl:otherwise>
</xsl:choose>
<xsl:value-of select="jcs:close($connect)"/>
</xsl:when>
<xsl:otherwise>
<output>No connection to host.</output>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
<xsl:variable name="local-out" select="jcs:invoke($fileput)"/>
<output>
<xsl:value-of select="concat('Saving file on local host\n', $local-out)"/>
</output>
</op-script-results>
</xsl:template>
</xsl:stylesheet>
SLAX 構文
version 1.0;
ns junos = "http://xml.juniper.net/junos/*/junos";
ns xnm = "http://xml.juniper.net/xnm/1.1/xnm";
ns jcs = "http://xml.juniper.net/junos/commit-scripts/1.0";
import "../import/junos.xsl";
var $arguments = {
<argument> {
<name> "myhost";
<description> "IP address or hostname of the remote host";
}
<argument> {
<name> "filename";
<description> "name of destination file";
}
<argument> {
<name> "encoding";
<description> "ascii or base64";
}
}
param $myhost;
param $filename;
param $encoding;
match / {
<op-script-results> {
var $rpc = <get-software-information>;
var $result = jcs:invoke($rpc);
var $fileput = {
<file-put> {
<filename>$filename;
<encoding>$encoding;
<permission>'0644';
<delete-if-exist>;
<file-contents>$result;
}
}
if ($myhost = '') {
<xnm:error> {
<message> "missing mandatory argument 'myhost'";
}
}
else {
var $username = jcs:get-input("Enter username: ");
var $pw = jcs:get-secret("Enter password: ");
var $connect = jcs:open($myhost, $username, $pw);
if ($connect) {
<output> "Connected to host. Exporting file... \n";
var $out = jcs:execute($connect, $fileput);
if ($out//xnm:error) {
copy-of ($out//xnm:error);
}
else {
<output> $out;
}
expr jcs:close($connect);
}
else {
<output> "No connection to host.";
}
}
var $local-out = jcs:invoke($fileput);
<output> "Saving file on local host\n" _ $local-out;
}
}
構成
手順
手順
スクリプトをダウンロード、有効化、テストするには、以下の手順にしたがっています。
XSLT または SLAX スクリプトをテキスト ファイルにコピーし、必要に応じてファイル export.xsl または export.slax に名前を付け、デバイス上の /var/db/scripts/op/ ディレクトリにコピーします。
設定モードでは、 階層レベルで ステートメントを
file含め、必要に[edit system scripts op]応じて export.xsl または export.slax を含めます。[edit system scripts op] user@host# set file export.(slax | xsl)
コマンドを
commit and-quit発行します。[edit] user@host# commit and-quit
運用モード コマンドを発行して op スクリプトを
op export実行し、必要な引数を含めます。
検証
Op スクリプトの引数の検証
目的
引数の名前と説明が CLI に表示されていることを確認します。
アクション
動作モード コマンドを op exort ? 発行します。CLI は、スクリプト内のグローバル arguments 変数内の定義に基づいて、スクリプト引数の補完候補をリストします。
user@host> op export ? Possible completions: <[Enter]> Execute this command <name> Argument name detail Display detailed output encoding ascii or base64 filename name of destination file myhost IP address or hostname of the remote host | Pipe through a command
Op スクリプト実行の検証
目的
スクリプトが想定どおりに動作していることを確認します。
アクション
動作モードコマンドを op export myhost host encoding encoding filename file 発行し、プロンプトが表示されたら、適切なユーザー名とパスワードを含めます。スクリプトの実行に成功すると、RPC リクエストの <get-software-information> 結果がリモート デバイスおよびローカル デバイス上のファイルに書き込まれます。例えば:
root@host> op export myhost router1 encoding ascii filename /var/log/host-version.txt Enter username: root Enter password: Connected to host. Exporting file... /var/log/host-version.txt Saving file on local host /var/log/host-version.txt
コマンドライン引数でリモートデバイスのIPアドレスまたはホスト名を指定できない場合、スクリプトはエラーを発行して実行を停止します。
root@host> op export error: missing mandatory argument 'myhost'
操作の子タグfile-putをdelete-if-exist省略し、指定されたファイルが既に存在する場合、スクリプトはエラーを報告します。
root@host> op export myhost router1 encoding ascii filename /var/log/host-version.txt Enter username: root Enter password: Connected to host. Exporting file... Destination file exists Saving file on local host Destination file exists
スクリプトを実行し、リモートホストまたはローカルホストに存在しないディレクトリパスを含む場合、スクリプトはエラーを報告します。
root@host> op export myhost router1 encoding ascii filename /var/test/host-version.txt Enter username: root Enter password: Connected to host. Exporting file... Destination directory does not exist: /var/test Saving file on local host Destination directory does not exist: /var/test