SNMP スクリプトに必要な定型プレート
Junos OS SNMP スクリプトは、XSLT(Extensible Stylesheet Language Transformations)、Stylesheet Language Alternative syntaX(SLAX)、または Python で記述できます。SNMP スクリプトには、基本的なスクリプト機能と、Junos OS 拡張機能や名前付きテンプレートなどのスクリプト内で使用されるオプション機能の両方に、そのスクリプト言語に必要な定型文を含める必要があります。このトピックでは、XSLT、SLAX、Python SNMP スクリプトで使用できる標準定型プレートを提供します。
SNMP スクリプト用 SLAX 定型プレート
SLAX SNMP スクリプトの定型プレートは次のとおりです。
1 version 1.0; 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 行目では、XML のバージョンを 1.0 として指定します。
1 version 1.0;
行2~6は、SNMPスクリプトで一般的に使用されるすべての名前空間マッピングをリストアップしています。この例では、これらのプレフィックスがすべて使用されているわけではありません。すべての名前空間マッピングをリストすると、マッピングがスクリプトの新しいバージョンで使用される場合、エラーを防ぐことができます。これらの名前空間マッピングを使用すると、スクリプトで拡張関数と名前付きテンプレートを使用できます。これらの拡張関数と名前付きテンプレートについては、 Junos OS 自動化スクリプトの拡張機能についてと Junos OS 自動化スクリプトの名前付きテンプレートについて説明します。
5行目と6行目には、EXSLT名前空間マッピングがあります。SNMP 拡張関数は、関連付けられた URI http://exslt.org/functions で名前空間で定義されます。6 行目では、拡張名前空間を EXSLT 関数の名前空間に登録 snmp
し、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 /
後に <snmp-script-results>
、行 8 に示すように、コンテナ タグはトップレベルの子タグにする必要があります。このコンテナの値は、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 の間で、テンプレート内から呼び出される XSLT テンプレートを含む追加のコードを match /
定義できます。
11~13行目は、SNMPスクリプトからOIDリクエスターに返される値を定義します。の <snmp-oid>
値は、 の入力値 snmp-script-input/snmp-oid
から取得されます。SNMP スクリプト機能では、 の以下のオブジェクト識別子タイプ <snmp-type>
がサポートされています。
Counter32
Counter64
Integer32
Unsigned32
Octet 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 値をget_snmp_oid()
get_snmp_action()
取得しemit_snmp_attributes()
、要求された MIB オブジェクトのデータを返す 、および 関数を使用するには、 ステートメントを含めるimport jcs
必要があります。
import jcs if __name__ == '__main__':
Python 自動化スクリプトは、スクリプトの先頭にインタープリター指令行(#!/usr/bin/env python
)を含める必要はありません。ただし、プログラムが存在する場合、プログラムは正しく実行されます。