コミット スクリプトの設計に関する考慮事項
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