SLAX および XSLT コミット スクリプトでの永続的または一時的な構成変更の生成
Junos OSのコミットスクリプトは、カスタム構成ルールを適用し、カスタム構成ルールに準拠していない場合、自動的に設定を変更することができます。SLAX および XSLT コミット スクリプトに永続的または 一時的な変更 を生成するには、次のようにします。
スクリプトの先頭に、 コミットスクリプトに必要なボイラープレートから拡張スタイルシート言語変換 (XSLT) またはスタイルシート言語代替 syntaX (SLAX) ボイラープレートを含めます。便宜上、ここに再現されています。
XSLT ボイラープレート<?xml version="1.0" standalone="yes"?> <xsl:stylesheet version="1.0" 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"> <xsl:import href="../import/junos.xsl"/> <xsl:template match="configuration"> <!-- ... insert your code here ... --> </xsl:template> </xsl:stylesheet>
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"; match configuration { /* * insert your code here */ }
コメント "insert your code here," で示される位置に、1 つ以上の XSLT プログラミング命令またはそれに相当する SLAX プログラミング命令を含めます。一般的に使用される XSLT コンストラクトには、次のものがあります。
<xsl:choose> <xsl:when> <xsl:otherwise>
- さまざまな状況でさまざまな命令を処理する条件付きコンストラクト。命令には<xsl:choose>
1 つ以上の<xsl:when>
要素が含まれ、それぞれが XPath 式をテストします。テストが true と評価された場合、XSLT プロセッサは要素内の<xsl:when>
命令を実行します。XSLT プロセッサは、属性が true と評価された最初の<xsl:when>
要素test
に含まれる命令のみを処理します。どの<xsl:when>
要素のtest
属性も true と評価されない場合、要素のコンテンツ<xsl:otherwise>
(存在する場合) が処理されます。<xsl:for-each select="xpath-expression">
- XSLT プロセッサに一連のノードを集めて 1 つずつ処理するように指示するプログラミング命令。ノードは、属性のselect
拡張マークアップ言語 (XML) パス言語 (XPath) 式によって選択されます。各ノードは、命令に含まれる<xsl:for-each>
指示に従って処理されます。命令内の<xsl:for-each>
コードは、XPath 式に一致するノードごとに再帰的に評価されます。コンテキストは、各パス中にノードに移動されます。<xsl:if test="xpath-expression">
- 属性のtest
XPath 式が に評価true
された場合に命令を処理させる条件付きコンストラクト。
たとえば、次の XSLT プログラミング命令は、MPLS プロトコル ファミリが有効になっていない各 SONET/SDH インターフェイスを選択します。
<xsl:for-each select="interfaces/interface[starts-with(name, 'so-')]/unit"> <xsl:if test="not(family/mpls)">
SLAXでは、
for-each
andif
コンストラクトは次のようになります。for-each (interfaces/interface[starts-with(name, 'so-')]/unit) { if (not(family/mpls)) {
例や擬似コードなど、プログラミング命令の使用方法の詳細については、「 XSLT プログラミング手順の概要」を参照してください。XSLT ではなく SLAX でスクリプトを記述する方法については、「 SLAX の概要」を参照してください。
設定を変更するための指示を含めます。
永続的な変更を生成するには 2 つの方法と、一時的な変更を生成する方法は 2 つあります。
永続的な変更を生成するには、テンプレートを参照する
jcs:emit-change
か、要素を含め<change>
ます。一時的な変更を生成するには、テンプレートを参照し
jcs:emit-change
、選択したパラメーターを'transient-change'
渡すtag
か、<transient-change>
要素を含めます。
このテンプレートを使用すると
jcs:emit-change
、影響を受けるステートメントの完全な XML 階層を指定せずに変更の内容を定義できるため、より効率的でエラーが発生しにくいスクリプトを作成できます。代わりに、XML 階層は、スクリプトのプログラミング命令に含まれる XPath 式で定義されます。次の例を考えてみましょう。永続変更の例はどちらも、ステートメントを AND
jcs:emit-change テンプレートで生成された永続的な変更<xsl:if>
プログラミング命令の<xsl:for-each>
異なる場所に配置unit
しても、同じ結果になります。どちらの場合も、スクリプトは MPLS プロトコル ファミリーが有効になっていない SONET/SDH インターフェイスを検索し、 階層レベルで ステートメント[edit interfaces so-fpc/pic/port unit logical-unit-number]
を追加してfamily mpls
、設定が変更されたことを示す警告メッセージを出力します。同様に、非定常変化の例はどちらも同じ結果になります。どちらも、IPv4(IPバージョン 4)が有効になっているすべてのSONET/SDHインターフェイスでポイントツーポイントプロトコル(PPP)カプセル化を設定します。この例では、永続的な変更の内容 (パラメーターに含まれる
content
) は、完全な XML 階層を含めずに指定されます。代わりに、プログラミング命令の<xsl:for-each>
XPath 式によって、変更のコンテキストが設定されます。message パラメーターも含まれています。このパラメーターを指定すると、テンプレートが
jcs:emit-change
テンプレートを<xnm:warning>
呼び出し、CLI に警告通知が送信されます。message パラメーターは、警告メッセージに現在の階層情報を自動的に含めます。(テンプレートで使用できるjcs:emit-change
パラメーターの詳細については、「 出力変更テンプレート (SLAX および XSLT)」および「emit_change (Python)」を参照してください。<xsl:for-each select="interfaces/interface[starts-with(name, 'so-')]/unit"> <xsl:if test="not(family/mpls)"> <xsl:call-template name="jcs:emit-change"> <xsl:with-param name="content"> <family> <mpls/> </family> </xsl:with-param> <xsl:with-param name="message"> <xsl:text>Adding 'family mpls' to SONET interface.</xsl:text> </xsl:with-param> </xsl:call-template> </xsl:if> </xsl:for-each>
この例では、影響を受けるステートメントにつながる完全な XML 階層を要素の子要素
<change>
として含める必要があります。この例では、 および
jcs:statement
テンプレートを参照することにより、警告メッセージにjcs:edit-path
現在の階層情報を含めます。警告メッセージの詳細については、カスタム警告、エラー、およびシステム ログ メッセージの生成の概要を参照してください。<xsl:for-each select="interfaces/interface[starts-with(name, 'so-')]"> <xsl:if test="not(unit/family/mpls)"> <change> <interfaces> <interface> <name><xsl:value-of select="name"/></name> <unit> <name><xsl:value-of select="unit/name"/></name> <family> <mpls/> </family> </unit> </interface> </interfaces> </change> <xnm:warning> <xsl:call-template name="jcs:edit-path"/> <xsl:call-template name="jcs:statement"> <xsl:with-param name="dot" select="unit/name"/> </xsl:call-template> <message>Adding 'family mpls' to SONET interface.</message> </xnm:warning> </xsl:if> </xsl:for-each>
この例では、一時的な変更の内容 (パラメーターに含まれる
content
) は、完全な XML 階層を含めずに指定されます。代わりに、プログラミング命令の<xsl:for-each>
XPath 式によって、変更のコンテキストが設定されます。XPath 式の演算子はand
、両方のオペランドがtrue
ブール値に変換されることを意味します。第 1 オペランドfalse
が の場合、第 2 オペランドは評価されません。tag パラメータは、選択した '
transient-change
' に含まれます。tag
このパラメーターを指定しない場合、テンプレートはjcs:emit-change
既定で永続的な変更を生成します。(テンプレートで使用できるjcs:emit-change
パラメーターの詳細については、「 出力変更テンプレート (SLAX および XSLT)」および「emit_change (Python)」を参照してください。<xsl:for-each select="interfaces/interface[starts-with(name, 'so-') \ and unit/family/inet]"> <xsl:call-template name="jcs:emit-change"> <xsl:with-param name="tag" select="'transient-change'"/> <xsl:with-param name="content"> <encapsulation>ppp</encapsulation> </xsl:with-param> </xsl:call-template> </xsl:for-each>
この例では、影響を受けるステートメントにつながる完全な XML 階層を要素の子要素
<transient-change>
として含める必要があります。<xsl:for-each select="interfaces/interface[starts-with(name, 'so-')\ and unit/family/inet]"> <transient-change> <interfaces> <interface> <name><xsl:value-of select="name"/></name> <encapsulation>ppp</encapsulation> </interface> </interfaces> </transient-change> </xsl:for-each>
スクリプトをわかりやすい名前で保存します。
スクリプトをデバイスのハード ディスクの /var/db/scripts/commit ディレクトリまたはフラッシュ ドライブの /config/scripts/commit ディレクトリにコピーします。コミット スクリプトの保存場所の設定については、「 フラッシュ メモリへのスクリプトの保存」を参照してください。
デバイスにデュアルルーティングエンジンがあり、両方でスクリプトを有効にする場合は、両方のルーティングエンジンの /var/db/scripts/commit または /config/scripts/commit ディレクトリにスクリプトをコピーする必要があります。コマンドは
commit synchronize
、ルーティング エンジン間でスクリプトをコピーしません。階層レベルで ステートメント
[edit system scripts commit]
を含めてfile filename
、スクリプトを有効にします。[edit system scripts commit] user@host# set file filename
スクリプトが一時的な変更を行う場合は、階層レベルに ステートメントを含め
allow-transients
ます[edit system scripts commit]
。[edit system scripts commit] user@host# set allow-transients
すべてのコミットスクリプトがエラーなく実行される場合、一時的な変更はチェックアウト設定に読み込まれますが、 候補設定には読み込まれません。永続的な変更はすべて、候補の構成に読み込まれます。その後、設定を検証し、デバイス上の影響を受けるプロセスに変更を伝搬することで、コミット プロセスが続行されます。
永続的な変更と一時的な変更の両方を適用した設定を表示するには、 設定モード コマンドを発行します show | display commit-scripts
。
[edit] user@host# show | display commit-scripts
永続的な変更のみを適用した状態で 設定を表示するには、 設定モード コマンドを発行します show | display commit-scripts no-transients
。
[edit] user@host# show | display commit-scripts no-transients
永続的および一時的な変更は、設定モードコマンドがload replace
受信設定をロードするのと同じ方法で設定に読み込まれます。永続的または一時的な変更を生成する場合、構成要素に属性を追加するreplace="replace"
と、操作のload replace
タグと同じreplace:
動作が生成されます。永続的な変更と一時的な変更の両方が、 動作とともにload replace
構成にロードされます。ただし、永続的な変更は候補コンフィギュレーションにロードされ、一時的な変更はチェックアウトコンフィギュレーションにロードされます。