このページで
例:コミットスクリプトを使用して、永続的および一時的な設定変更を生成する
例:永続的な変更の生成
Junos OSコミットスクリプトを使用すると、ユーザーは、独自のプラクティスやポリシーに従って設定の検証プロセスをカスタマイズし、コミットプロセス中にカスタム設定ルールを適用できます。この例では、 ステートメントが設定にまだ含まれていない場合にSONET/SDHインターフェイスの設定に ステートメントを追加family mplsする永続的な変更を生成するコミットスクリプトを示しています。インターフェイス上でMPLSプロトコルファミリーを明示的に設定しない場合、MPLSアプリケーションのインターフェイスは有効になっていません。
要件
この例では、以下のハードウェアとソフトウェアのコンポーネントを使用しています。
1 つ以上の SONET/SDH インターフェイスを持つ Junos OS を実行するデバイス。
Python スクリプトを使用する場合、Junos OS リリース 16.1R3 以降のリリース。
概要とコミット スクリプト
この例のコミットスクリプトは、論理インターフェイスが設定されていても ステートメントが設定されていないすべてのSONET/SDHインターフェイスを family mpls 検索します。これらのインターフェイスの場合、スクリプトは、 family mpls 階層レベルで持続的な変更として、 ステートメントをインターフェイス設定に [edit interfaces interface-name unit logical-unit-number] 追加します。このスクリプトは、SLAX、XSLT、Python で示されています。
コミット スクリプトの SLAX バージョンと XSLT バージョンでは、junos.xsl インポート ファイルにjcs:emit-change含まれるヘルパー テンプレートであるテンプレートを使用して永続的な変更が生成されます。テンプレートのjcs:emit-changeパラメーターはtag省略され、スクリプトは永続的な変更として変更を発行するように指示します。テンプレートのパラメーターにはcontent、jcs:emit-change永続的な変更として追加する設定ステートメントが含まれています。messageテンプレートのjcs:emit-changeパラメーターには、CLIに表示される警告メッセージが含まれています。設定が変更されたことを通知します。
コミット スクリプトの Python バージョンでは、モジュールからインポートされた関数を jcs.emit_change() 使用して永続的な変更が jcs 生成されます。Python スクリプトは、定位置引数「変更」を渡すことで、これが永続的な変更であることを示しています。
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">
<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="message">
<xsl:text>Adding 'family mpls' to SONET/SDH interface.</xsl:text>
</xsl:with-param>
<xsl:with-param name="content">
<family>
<mpls/>
</family>
</xsl:with-param>
</xsl:call-template>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
SLAX 構文
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 {
for-each (interfaces/interface[starts-with(name, 'so-')]/unit) {
if (not(family/mpls)) {
call jcs:emit-change() {
with $message = {
expr "Adding 'family mpls' to SONET/SDH interface.";
}
with $content = {
<family> {
<mpls>;
}
}
}
}
}
}
Python 構文
from junos import Junos_Configuration
import jcs
def main():
# Get configuration root object
root = Junos_Configuration
for element in root.xpath("./interfaces/ \
interface[starts-with(name,'so-')]/unit"):
if element.find('family/mpls') is None:
if_name = element.find('../name').text
unit_name = element.find('name').text
change_xml = """
<interfaces>
<interface>
<name>{0}</name>
<unit>
<name>{1}</name>
<family>
<mpls>
</mpls>
</family>
</unit>
</interface>
</interfaces>
""".format(if_name, unit_name).strip()
jcs.emit_change(change_xml, "change", "xml")
jcs.emit_warning("Adding 'family mpls' to SONET/SDH interface: " + if_name)
if __name__ == '__main__':
main()
構成
手順
手順
スクリプトをダウンロード、有効化、テストするには、
スクリプトをテキスト ファイルにコピーし、mpls.xsl、mpls.slax、または mpls.py というファイルに名前を付け、デバイス上の /var/db/scripts/commit/ ディレクトリにコピーします。
メモ:符号なしPythonスクリプトは、Junos OS
super-userログインクラスのルートまたはユーザーのいずれかが所有する必要があり、ファイルの書き込み権限を持つことができるのはファイル所有者だけです。設定モードで、 階層レベルで ステートメントとスクリプトファイル名を
[edit system scripts commit]設定fileします。[edit] user@host# set system scripts commit file mpls.xsl
スクリプトが Python で記述されている場合は、符号なし Python スクリプトの実行を有効にします。
[edit] user@host# set system scripts language python
メモ:Python 3を
language python3使用してPythonスクリプトを実行するように ステートメントを設定するか、 ステートメントでlanguage pythonPython 2.7を使用してPythonスクリプトを実行するように設定します。詳細については、 言語を参照してください。コミット スクリプトが持続的な変更を正しく生成することをテストするには、設定に変更を引き起こす条件が含まれていることを確認します。このスクリプトをテストするには、少なくとも 1 つの SONET/SDH インターフェイスの
[edit interfaces so-fpc/pic/port unit logical-unit-number]階層レベルに ステートメントが含まれていないことを確認family mplsします。コマ ンドを
commit check発行して、コミット スクリプト処理のトレースをプレビューし、スクリプトが候補構成に永続的な変更を追加することを確認します。コマンドはcommit check、コミットする前に設定の構文を検証しますが、変更はコミットされません。この例のコミット スクリプトは、変更するたびにメッセージを生成します。コマンドを
commit check使用してこれらのメッセージをプレビューし、スクリプトが適切なインターフェイスの ステートメントで設定をfamily mpls更新するかどうかを確認します。コマンドを
commit check | display xml発行して、XML 形式のバージョンのメッセージを表示します。サンプル出力は、コミット操作中にスクリプトが so-2/3/4.0 インターフェイス設定に ステートメントを追加family mplsすることを示しています。[edit] user@host# commit check | display xml <rpc-reply xmlns:junos="http://xml.juniper.net/junos/11.2R1/junos"> <commit-results> <routing-engine junos:style="normal"> <name>re0</name> <xnm:warning xmlns:xnm="http://xml.juniper.net/xnm/1.1/xnm"> <edit-path> [edit interfaces interface so-2/3/4 unit 0] </edit-path> <message> Adding 'family mpls' to SONET/SDH interface. </message> </xnm:warning> <commit-check-success/> </routing-engine> </commit-results> </rpc-reply>コミット スクリプト処理の詳細なトレースを表示するには、 コマンドを
commit check | display detail発行します。サンプル出力では、コミット操作中にコンフィギュレーションに読み込まれる持続的な変更が1つあります。[edit] user@host# commit check | display detail 2011-06-17 14:17:35 PDT: reading commit script configuration 2011-06-17 14:17:35 PDT: testing commit script configuration 2011-06-17 14:17:35 PDT: opening commit script '/var/db/scripts/commit/mpls.xsl' 2011-06-17 14:17:35 PDT: reading commit script 'mpls.xsl' 2011-06-17 14:17:35 PDT: running commit script 'mpls.xsl' 2011-06-17 14:17:35 PDT: processing commit script 'mpls.xsl' 2011-06-17 14:17:35 PDT: no errors from mpls.xsl 2011-06-17 14:17:35 PDT: saving commit script changes for script mpls.xsl 2011-06-17 14:17:35 PDT: summary of script mpls.xsl: changes 1, transients 0, syslog 0 2011-06-17 14:17:35 PDT: start loading commit script changes 2011-06-17 14:17:35 PDT: loading commit script changes into real db 2011-06-17 14:17:35 PDT: finished commit script changes into real db 2011-06-17 14:17:35 PDT: no transient commit script changes 2011-06-17 14:17:35 PDT: finished loading commit script changes 2011-06-17 14:17:35 PDT: copying juniper.db to juniper.data+ 2011-06-17 14:17:35 PDT: finished copying juniper.db to juniper.data+ ... configuration check succeeds
スクリプトが正しい変更を生成することを確認した後、 コマンドを
commit発行してコミット操作を開始し、スクリプトを実行します。user@host# commit
検証
設定の検証
目的
正しい変更が設定に統合されていることを確認します。
アクション
コミット操作を実行した後、 設定モードコマンドを発行して設定を show interfaces 表示します。MPLS プロトコル ファミリーがスクリプトを実行する前に 1 つ以上の SONET/SDH インターフェイスで有効になっていない場合、出力は次のようになります。
[edit]
user@host# show interfaces
... other configured interface types ...
so-2/3/4 {
unit 0 {
family mpls; # Added by persistent change
}
}
... other configured interface types ...
例:一時的な変更の生成
この例では、コミットスクリプトを使用して、IPv4プロトコルファミリーが有効になっているすべてのSONET/SDHインターフェイスでPPPカプセル化を設定します。一時的な変更に応じて変更が追加されます。
要件
この例では、以下のハードウェアとソフトウェアのコンポーネントを使用しています。
1 つ以上の SONET/SDH インターフェイスを持つ Junos OS を実行するデバイス。
Python スクリプトを使用する場合、Junos OS リリース 16.1R3 以降のリリース。
概要とコミット スクリプト
この例のコミットスクリプトは、IPv4プロトコルファミリーが有効になっているすべてのSONET/SDHインターフェイスを設定で検出し、 ステートメントをインターフェイス設定に追加 encapsulation ppp します。コミットスクリプトは一時的な変更を生成し、チェックアウト設定に変更を追加しますが、候補設定には追加されません。このスクリプトは、SLAX、XSLT、Python で示されています。
コミット スクリプトの SLAX バージョンと XSLT バージョンでは、junos.xsl インポート ファイルに含まれるヘルパー テンプレートであるテンプレートを使用jcs:emit-changeして一時変更が生成されます。テンプレートのjcs:emit-changeパラメーターの値transient-changeはtag、スクリプトに永続的な変更ではなく一時的な変更として変更を出力するように指示します。contentテンプレートのパラメーターには、jcs:emit-change一時変更として追加される設定ステートメントが含まれています。
コミット スクリプトの Python バージョンでは、モジュールからインポートされた関数を jcs.emit_change() 使用して一時変更が jcs 生成されます。Python スクリプトは、これは一時的な変更であり、定位置引数 「一時変更」を渡すことによって示します。
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">
<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>
</xsl:template>
</xsl:stylesheet>
SLAX 構文
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 {
for-each (interfaces/interface[starts-with(name, 'so-') and unit/family/inet]) {
call jcs:emit-change($tag = 'transient-change') {
with $content = {
<encapsulation> "ppp";
}
}
}
}
Python 構文
from junos import Junos_Configuration
import jcs
def main():
# Get configuration root object
root = Junos_Configuration
for element in root.xpath("./interfaces/ \
interface[starts-with(name,'so-') and unit/family/inet]"):
if_name = element.find('name').text
change_xml = """
<interfaces>
<interface>
<name>{0}</name>
<encapsulation>ppp</encapsulation>
</interface>
</interfaces>
""".format(if_name).strip()
jcs.emit_change(change_xml, "transient-change", "xml")
jcs.emit_warning("Adding 'ppp' encapsulation to SONET interface: " + if_name)
jcs.emit_warning(change_xml)
if __name__ == '__main__':
main()
構成
手順
手順
スクリプトをダウンロード、有効化、テストするには、
スクリプトをテキスト ファイルにコピーし、 encap-ppp.xsl、 encap-ppp.slax、または encap-ppp.py ファイルに名前を付け、デバイス上の /var/db/scripts/commit/ ディレクトリにコピーします。
メモ:符号なしPythonスクリプトは、Junos OS
super-userログインクラスのルートまたはユーザーのいずれかが所有する必要があり、ファイルの書き込み権限を持つことができるのはファイル所有者だけです。設定モードで、 階層レベルで ステートメントとスクリプトファイル名を
[edit system scripts commit]設定fileします。[edit] user@host# set system scripts commit file encap-ppp.xsl
ステートメントを
allow-transients設定して、コミットスクリプトがチェックアウト設定に一時的な変更をロードできるようにします。[edit] user@host# set system scripts commit allow-transients
スクリプトが Python で記述されている場合は、符号なし Python スクリプトの実行を有効にします。
[edit] user@host# set system scripts language python
メモ:Python 3を
language python3使用してPythonスクリプトを実行するように ステートメントを設定するか、 ステートメントでlanguage pythonPython 2.7を使用してPythonスクリプトを実行するように設定します。詳細については、 言語を参照してください。コミット スクリプトが一時変更を正しく生成することをテストするには、設定に変更を引き起こす条件が含まれていることを確認します。少なくとも1つのSONET/SDHインターフェイスの
[edit interfaces so-fpc/pic/port]階層レベルに ステートメントが含まれていないことをencapsulation ppp確認します。コマ ンドを
commit check発行して、コミット スクリプト処理のトレースをプレビューし、スクリプトが一時的な変更をチェックアウト構成に追加することを確認します。コマンドはcommit check、コミットする前に設定の構文を検証しますが、変更はコミットされません。コマ ンドを
commit check | display detail発行して、コミット スクリプト処理の詳細なトレースを表示します。サンプル出力では、チェックアウト設定に読み込まれる一時的な変更が2つあります。[edit] user@host# commit check | display detail 2011-06-15 12:07:30 PDT: reading commit script configuration 2011-06-15 12:07:30 PDT: testing commit script configuration 2011-06-15 12:07:30 PDT: opening commit script '/var/db/scripts/commit/encap-ppp.xsl' 2011-06-15 12:07:30 PDT: reading commit script 'encap-ppp.xsl' 2011-06-15 12:07:30 PDT: running commit script 'encap-ppp.xsl' 2011-06-15 12:07:30 PDT: processing commit script 'encap-ppp.xsl' 2011-06-15 12:07:30 PDT: no errors from encap-ppp.xsl 2011-06-15 12:07:30 PDT: saving commit script changes for script encap-ppp.xsl 2011-06-15 12:07:30 PDT: summary of script encap-ppp.xsl: changes 0, transients 2 (allowed), syslog 0 2011-06-15 12:07:30 PDT: start loading commit script changes 2011-06-15 12:07:30 PDT: no commit script changes 2011-06-15 12:07:30 PDT: updating transient changes into transient tree 2011-06-15 12:07:30 PDT: finished loading commit script changes 2011-06-15 12:07:30 PDT: copying juniper.db to juniper.data+ 2011-06-15 12:07:30 PDT: finished copying juniper.db to juniper.data+ 2011-06-15 12:07:30 PDT: exporting juniper.conf 2011-06-15 12:07:30 PDT: merging transient changes ... configuration check succeeds
スクリプトが正しい変更を生成することを確認した後、 コマンドを
commit発行してコミット操作を開始し、スクリプトを実行します。user@host# commit
検証
設定の検証
目的
正しい変更がチェックアウト構成に統合されていることを確認します。IPv4プロトコルファミリーが有効になっているSONET/SDHインターフェイスが1つ以上ある場合、インターフェイス階層にencapsulation ppp一時的な変更として追加されたステートメントを確認する必要があります。
アクション
一時的な変更を含む設定を表示するには、 設定モードコマンドを show interfaces | display commit-scripts 発行します。コマンドは show interfaces | display commit-scripts 、一時変更によって生成されるステートメントを含め、設定内のすべてのステートメントを表示します。IPv4プロトコルファミリーが有効になっているSONET/SDHインターフェイスが1つ以上ある場合、出力は次のようになります。
[edit]
user@host# show interfaces | display commit-scripts
...
so-1/2/3 {
mtu 576;
encapsulation ppp; /* Added by transient change. */
unit 0 {
family inet {
address 10.0.0.3/32;
}
}
}
so-1/2/4 {
encapsulation ppp; /* Added by transient change. */
unit 0 {
family inet {
address 10.0.0.4/32;
}
}
}
so-2/3/4 {
encapsulation cisco-hdlc; # Not affected by the script, because IPv4 protocol
# family is not configured on this interface.
unit 0 {
family mpls;
}
}
トラブルシューティング
コミット エラーのトラブルシューティング
問題
CLI は無効な一時変更エラーを生成し、コミットは失敗します。
user@host# commit check error: invalid transient change generated by commit script: encap-ppp.xsl warning: 1 transient change was generated without [system scripts commit allow-transients] error: 1 error reported by commit scripts error: commit script failure
ソリューション
コミットスクリプトが allow-transients チェックアウト設定に一時的な変更をロードできるようにするには、 階層レベルで [edit system scripts commit] ステートメントを設定する必要があります。
一時的な変更を許可するために、以下のステートメントを設定します。
[edit] user@host# set system scripts commit allow-transients