SNMPスクリプトに必要な定型文
Junos OS SNMPスクリプトは、XSLT(Extensible Stylesheet Language Transformations)、SLAX(Stylesheet Language Alternative SyntaX)、Pythonのいずれかで記述できます。SNMP スクリプトには、基本的なスクリプト機能だけでなく、Junos OS 拡張機能や名前付きテンプレートなど、スクリプト内で使用されるオプション機能の両方について、そのスクリプト言語に必要な定型プレートを含める必要があります。このトピックでは、XSLT、SLAX、および Python SNMP スクリプトで使用できる標準の定型文について説明します。
SNMP スクリプトの SLAX ボイラープレート
SLAX SNMP スクリプトの定型文は次のとおりです。
1 version 1.2;
2 ns junos = "http://xml.juniper.net/junos/*/junos";
3 ns xnm = "http://xml.juniper.net/xnm/1.1/xnm";
4 ns jcs = "http://xml.juniper.net/junos/commit-scripts/1.0";
5 ns dyn = "http://exslt.org/dynamic";
6 ns snmp extension = "http://exslt.org/functions";
7 match / {
8 <snmp-script-results> {
9 var $snmp-action = snmp-script-input/snmp-action;
10 var $snmp-oid = snmp-script-input/snmp-oid;
<!-- ... insert your code here ... -->
11 <snmp-oid> $snmp-oid;
12 <snmp-type> $snmp-type;
13 <snmp-value> $snmp-value;
}
}
SLAXおよびXSLT SNMPスクリプトは、Junos XMLおよびJunos XMLプロトコルタグ要素をベースにしています。すべてのXML要素と同様に、山括弧は、開始タグと終了タグでJunos XMLまたはJunos XMLプロトコルタグ要素の名前を囲みます。これは XML 規則であり、角かっこは完全なタグ要素名の必須部分です。Junos OS CLI コマンド文字列のオプション部分を示すためにドキュメントで使用されている山括弧と混同しないでください。
1 行目では、SLAX バージョンを 1.2 と指定しています。
1 version 1.2;
2 行目から 6 行目は、SNMP スクリプトで一般的に使用されるすべての名前空間マッピングを一覧表示します。この例では、これらのプレフィックスすべてが使用されているわけではありません。すべての名前空間マッピングを一覧表示すると、マッピングが新しいバージョンのスクリプトで使用されている場合のエラーを防ぐことができます。これらの名前空間マッピングを使用すると、スクリプトで拡張関数と名前付きテンプレートを使用できます。これらの拡張機能と名前付きテンプレートについては、 Junos OS自動化スクリプトの拡張機能を理解する および Junos OS自動化スクリプトの名前付きテンプレートについてで説明しています。
5 行目と 6 行目には EXSLT 名前空間マッピングがあります。SNMP 拡張関数は、関連する URI http://exslt.org/functions を持つ名前空間で定義されます。6 行目では、 snmp 拡張機能名前空間を EXSLT 関数名前空間に登録し、SLAX スクリプト内の接頭辞として snmp を使用してカスタマイズした関数を定義できるようにします。EXSLT 名前空間の詳細については、「 http://exslt.org/func/index.html.
2 ns junos = "http://xml.juniper.net/junos/*/junos"; 3 ns xnm = "http://xml.juniper.net/xnm/1.1/xnm"; 4 ns jcs = "http://xml.juniper.net/junos/commit-scripts/1.0"; 5 ns dyn = "http://exslt.org/dynamic"; 6 ns snmp extension = "http://exslt.org/functions";
7 行目では、コンフィギュレーション階層の最上位レベルを表す名前のないテンプレート match / を定義しています。スクリプト内のすべての XML パス言語 (XPath) 式は、構成階層の最上位要素から開始する必要があります。これにより、スクリプトは、可能なすべてのJunos XMLおよびJunos XMLプロトコルのリモートプロシージャコール(RPC)にアクセスすることができます。詳細については、「 XPath の概要」を参照してください。
7 match / {
match / タグ要素の後には、8 行目に示すように、<snmp-script-results> コンテナ タグを最上位の子タグにする必要があります。このコンテナの値がOIDリクエスターに返されます。
8 <snmp-script-results> {
9 行目と 10 行目では、アクションが get か get-next かを判断するためにコード内で使用できる対応する要素と、OID の値に基づいて変数を定義しています。
9 var $snmp-action = snmp-script-input/snmp-action; 10 var $snmp-oid = snmp-script-input/snmp-oid;
10 行目と 11 行目の間には、 match / テンプレート内から呼び出される XSLT テンプレートを含む追加のコードを定義できます。
11行目から13行目は、SNMPスクリプトがOIDリクエスターに返す値を定義します。 <snmp-oid> の値は、入力値 snmp-script-input/snmp-oid から取得されます。SNMP スクリプト機能では、以下の <snmp-type> のオブジェクト識別子タイプがサポートされています。
Counter32Counter64Integer32Unsigned32Octet String
<snmp-value>は、スクリプトからの戻り値に設定します。
11 <snmp-oid> $snmp-oid; 12 <snmp-type> $snmp-type; 13 <snmp-value> $snmp-value;
SNMP スクリプトの XSLT ボイラープレート
XSLT の定型文は次のとおりです。
<?xml version="1.0" encoding="UTF-8" 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"
xmlns:dyn="http://exslt.org/dynamic"
xmlns:snmp="http://exslt.org/functions"
version="1.0" extension-element-prefixes="snmp">
<xsl:template match="/">
<snmp-script-results>
<xsl:variable name="snmp-action" select="snmp-script-input/snmp-action"/>
<xsl:variable name="snmp-oid" select="snmp-script-input/snmp-oid"/>
<!-- Insert your code here -->
<snmp-oid>
<xsl:value-of select="$snmp-oid"/>
</snmp-oid>
<snmp-type>
<xsl:value-of select="$snmp-type"/>
</snmp-type>
<snmp-value>
<xsl:value-of select="$snmp-value"/>
</snmp-value>
</snmp-script-results>
</xsl:template>
</xsl:stylesheet>
SNMPスクリプトのPythonボイラープレート
Python SNMP スクリプトには必須の定型文はありませんが、スクリプトで使用されているオブジェクトをインポートする必要があります。Python SNMPスクリプトは、スクリプトに渡されたアクションとOID値を取得し、要求されたMIBオブジェクトのデータを返すget_snmp_action()、get_snmp_oid()、およびemit_snmp_attributes()関数を使用するために、import jcsステートメントを含める必要があります。
import jcs if __name__ == '__main__':
Python 自動化スクリプトでは、スクリプトの先頭にインタープリター ディレクティブ行 (#!/usr/bin/env python) を含める必要はありません。ただし、存在する場合は、プログラムは引き続き正しく実行されます。