コミット スクリプトの設計に関する考慮事項
XML で Junos OS 設定データを確認した後は、コミット スクリプトを非常に簡単に作成できます。このセクションでは、 XSLT を使用してコミット スクリプトを開発する場合のアドバイスと一般的なパターンについて説明します。
XSLT は解釈される言語であり、パフォーマンスを重要な考慮事項とします。最良のパフォーマンスを実現するには、各ノードで実行されるノードトラバーサルとテストを最小限に抑えます。可能な場合は、再帰的<xsl:apply-templates>
呼び出しで 属性を使用select
して、訪問するドキュメント階層の部分を制限します。
例えば、以下 select
の属性は、(IPv4)プロトコルファミリーが有効になっているSONET/SDHインターフェイスを指定することで、評価されるノードを inet
制限します。
<xsl:apply-templates select="interfaces/interface[starts-with(name, 'so-') and unit/family/inet]"/>
以下の例では、 および [edit protocols isis]
階層レベルで設定されたステートメントにスクリプトのスコープを制限する import
2 つの<xsl:apply-templates>
命令が[edit protocols ospf]
含まれています。
<xsl:template match="configuration"> <xsl:apply-templates select="protocols/ospf/import"/> <xsl:apply-templates select="protocols/isis/import"/> <!-- ... body of template ... --> </xsl:template>
解釈された言語では、何かを複数回実行すると、パフォーマンスに影響を与える可能性があります。ノードまたはノード・セットを繰り返し参照する必要がある場合は、ノード・セットを保持する変数を作成し、その変数を複数参照します。例えば、以下の変数宣言では、 階層レベルに解決する と呼ばれる mpls
変数を [edit protocols mpls]
作成します。これにより、スクリプトは階層を /protocols/
トラバースしてノードを mpls/
1 回だけ検索できます。
<xsl:variable name="mpls" select="/protocols/mpls"/> <xsl:choose> <xsl:when test="$mpls/path-mtu/allow-fragmentation"> <!-- ... --> </xsl:when> <xsl:when test="$mpls/hop-limit > 40"> <!-- ... --> </xsl:when> </xsl:choose>
現行コンテキスト・ノードは命令によって選択された各ノードを調べるので、インストラクションを使用<xsl:for-each>
する場合にも変数は<xsl:for-each>
重要です。例えば、以下のスクリプトでは、複数の変数を使用して値<xsl:for-each>
を格納し、参照します。インストラクションは、すべてのチャネル化された STM1(cstm1-)インターフェースで設定された E1 インターフェースを評価します。
<xsl:param name="limit" select="16"/> <xsl:template match="configuration"> <xsl:variable name="interfaces" select="interfaces"/> <xsl:for-each select="$interfaces/interface[starts-with(name, 'cstm1-')]"> <xsl:variable name="triple" select="substring-after(name, 'cstm1-')"/> <xsl:variable name="e1name" select="concat('e1-', $triple)"/> <xsl:variable name="count" select="count($interfaces/interface[starts-with(name, $e1name)])"/> <xsl:if test="$count > $limit"> <xnm:error> <edit-path>[edit interfaces]</edit-path> <statement><xsl:value-of select="name"/></statement> <message> <xsl:text>E1 interface limit exceeded on CSTM1 IQ PIC. </xsl:text> <xsl:value-of select="$count"/> <xsl:text> E1 interfaces are configured, but only </xsl:text> <xsl:value-of select="$limit"/> <xsl:text> are allowed.</xsl:text> </message> </xnm:error> </xsl:if> </xsl:for-each> </xsl:template>
cstm1-0/1/0 インターフェイスを 17 個の E1 インターフェイスにチャネル化すると、 コマンドを発行 commit
したときに次のエラー メッセージが表示されます。(この例の詳細については、 例: E1 インターフェイス数の制限を参照してください)。
[edit] user@host# commit [edit interfaces] 'cstm1-0/1/0' E1 interface limit exceeded on CSTM1 IQ PIC. 17 E1 interfaces are configured, but only 16 are allowed. error: 1 error reported by commit scripts error: commit script failure