SLAX および XSLT コミットスクリプトでの永続的または一時的な設定変更の生成
Junos OS コミット スクリプトは、カスタム設定ルールを適用し、カスタム設定ルールに準拠しない場合は、設定を自動的に変更できます。XSLT (Extensible Stylesheet Language Transformations) または SLAX (Stylesheet Language Alternative syntaX) コミットスクリプトで 永続的な変更 または 一時的な変更 を生成するには、次のようにします。
スクリプトの先頭に、「 コミットスクリプトに必要なボイラープレート」の XSLT または SLAX コミットスクリプトのボイラープレートを含めます。
XSLT ボイラープレート SLAX ボイラープレート<?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.2; 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 プロセッサは、test属性が true と評価される最初の<xsl:when>要素に含まれる命令のみを処理します。<xsl:when>要素のtest属性のいずれも true と評価されない場合、<xsl:otherwise>要素の内容 (存在する場合) が処理されます。<xsl:for-each select="xpath-expression">- 一連のノードを集めて 1 つずつ処理するように XSLT プロセッサに指示するプログラミング命令。ノードは、select属性の 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とifのコンストラクトは次のとおりです。for-each (interfaces/interface[starts-with(name, 'so-')]/unit) { if (not(family/mpls)) {例や擬似コードなど、プログラミング命令の使用方法の詳細については、「 XSLT プログラミング命令の概要」を参照してください。XSLT ではなく SLAX でスクリプトを記述する方法については、「 SLAX の概要」を参照してください。
設定を変更する手順を含めます。
永続的な変更を生成する方法と、一時的な変更を生成する方法の 2 つがあります。
永続的な変更を生成するには、
jcs:emit-changeテンプレートを参照するか、<change>要素を含めます。一時的な変更を生成するには、
jcs:emit-changeテンプレートを参照し、'transient-change'を選択してtagパラメーターを渡すか、<transient-change>要素を含めます。
jcs:emit-changeテンプレートでは、影響を受けるステートメントの完全なXML階層を指定せずに変更の内容を定義できるため、より効率的でエラーが発生しにくいスクリプトを作成できます。代わりに、XML 階層は、スクリプトのプログラミング命令に含まれる XPath 式で定義されます。次の例を考えてみましょう。永続的な変更の例はどちらも、
jcs:emit-changeテンプレートで生成される永続的な変更<xsl:for-each>と<xsl:if>プログラミング命令の異なる場所にunitステートメントを配置しているにもかかわらず、同じ結果になります。いずれの場合も、スクリプトは MPLS プロトコル ファミリが有効になっていない SONET/SDH インタフェースを検索し、[edit interfaces so-fpc/pic/port unit logical-unit-number]階層レベルでfamily mplsステートメントを追加し、設定が変更されたことを示す警告メッセージを出力します。同様に、どちらの一時的な変更の例も同じ結果になります。どちらも、IPバージョン4(IPv4)が有効になっているすべてのSONET/SDHインターフェイスでポイントツーポイントプロトコル(PPP)カプセル化を設定します。この例では、永続的な変更の内容 (
contentパラメーターに含まれる) は、完全な XML 階層を含めずに指定されています。代わりに、<xsl:for-each>プログラミング命令の XPath 式により、変更のコンテキストが設定されます。message パラメーターも含まれています。このパラメータにより、
jcs:emit-changeテンプレートから<xnm:warning>テンプレートが呼び出され、CLI に警告通知が送信されます。message パラメーターは、警告メッセージに現在の階層情報を自動的に含めます。 <change> 要素で生成される永続的な変更<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:edit-pathテンプレートとjcs:statementテンプレートを参照して、警告メッセージに現在の階層情報を含めます。 jcs:emit-changeテンプレートで生成される一時的な変更<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 オペランドは評価されません。タグパラメータは、「
transient-change」が選択された状態で含まれます。tagパラメーターを指定しないと、jcs:emit-changeテンプレートは既定で永続的な変更を生成します。 <transient-change>要素で生成される過渡変化<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 ディレクトリにコピーします。コミット スクリプトの保存場所の設定については、 フラッシュ メモリへのスクリプトの保存を参照してください。
デバイスにデュアル ルーティング エンジンがあり、スクリプトを両方で有効にする場合は、スクリプトを両方のルーティング エンジンにコピーする必要があります。
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
または、サポートされているデバイスとリリースで、
[edit system scripts commit file filename]階層レベルで ステートメントを設定し、個々のスクリプトのみが一時的な変更を行えるようにします。[edit system scripts commit] user@host# set file filename allow-transients
設定をコミットします。
[edit system scripts commit] user@host# commit
すべてのコミットスクリプトがエラーなしで実行された場合、永続的な変更はすべて 候補コンフィギュレーションに読み込まれます。一時的な変更はチェックアウト設定にロードされますが、候補コンフィギュレーションにはロードされません。その後、コミット プロセスは、設定を検証し、デバイス上の影響を受けるプロセスに変更を伝達することで続行されます。
永続的な変更と一時的な変更の両方が適用された設定を表示するには、 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動作で設定に読み込まれます。ただし、永続的な変更は候補コンフィギュレーションにロードされ、一時的な変更はチェックアウトコンフィギュレーションにロードされます。