イベントスクリプトを使用した設定の変更
イベントポリシーを設定して、イベントに応じて設定を変更することができます。イベントポリシーは、設定を変更してコミットするイベントスクリプトを呼び出すか、 change-configuration ステートメントを使用して設定を変更する設定モードコマンドを実行することで、設定を変更することができます。イベントスクリプトは、設定を変更する際に、 change-configuration ステートメントよりも柔軟性があります。例えば、イベント・スクリプトを使用すると、特定の条件を確認したり、構成データをさまざまな形式で提供したり、データを既存の構成とマージする方法を指定したりできます。たとえば、ノンストップアクティブルーティング(NSR)が有効になっているデュアルルーティングエンジンデバイスなどでは、イベントポリシーでイベントスクリプトのみを使用して設定を変更することができます。
次のセクションでは、イベントスクリプトを使用した設定の変更について説明します。
SLAX または XSLT イベントスクリプトを使用して構成を変更する方法
SLAX および XSLT イベントスクリプトは、 jcs:load-configuration テンプレートを呼び出して、Junos OS設定に構造化された変更を加えることができます。テンプレートを呼び出して構成を変更する前に、ターゲット・デバイスとの接続を確立する必要があります。テンプレートの詳細については、「 jcs:load-configuration 」および「 SLAX および XSLT スクリプトを使用した設定の変更」を参照してください。
次の SLAX イベント スクリプトは、ローカル デバイスへの接続を開き、 jcs:load-configuration テンプレートを呼び出して設定を変更およびコミットし、接続を閉じます。 jcs:load-configuration テンプレートに必要な値はすべて変数として定義され、引数としてテンプレートに渡されます。
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 / {
<event-script-results> {
/* Open a connection to the local device */
var $connection = jcs:open();
/* Define configuration change */
var $configuration-change = <configuration> {
<routing-options> {
<static> {
<route> {
<name>"198.51.100.0/24";
<next-hop>"10.1.3.1";
}
}
}
}
/* Load and commit the configuration */
var $load-action = "merge";
var $options := {
<commit-options> {
<log> "Configuration modified through event script";
}
}
var $results := { call jcs:load-configuration($connection, $action=$load-action, $configuration=$configuration-change, $commit-options=$options); }
/* Close the connection */
var $close-results = jcs:close($connection);
}
}
特定のイベントの SLAX イベントスクリプトを呼び出すイベントポリシーを設定するには、次のようにします。
Pythonイベントスクリプトを使用して構成を変更する方法
Pythonスクリプトは、 Junos PyEZ ライブラリを使用して、Junos OSを実行しているデバイスの設定を変更することができます。Junos PyEZ jnpr.junos.utils.config.Config ユーティリティは、設定をロック、ロード、コミット、ロック解除するインスタンスメソッドを提供します。
次の Python イベントスクリプトは、ローカルデバイスに接続し、設定を更新してコミットします。
from jnpr.junos import Device
from jnpr.junos.utils.config import Config
import jcs
with Device() as dev:
with Config(dev) as cu:
cu.load("set routing-options static route 198.51.100.0/24 next-hop 10.1.3.1", format="set")
cu.commit(comment="Configuration modified through event script", timeout=300)
特定のイベントに対して Python イベントスクリプトを呼び出すイベントポリシーを設定するには、次のようにします。
Junos PyEZ を使用して Junos OS を実行しているデバイスを設定する方法については、 Junos PyEZ 開発者ガイドを参照してください。
ノンストップ アクティブ ルーティングが有効になっているデバイスでイベント スクリプトを使用して構成を変更する方法
ノンストップアクティブルーティング(NSR)が有効になっているデュアルルーティングエンジンデバイスで、イベントポリシーを使用して設定を変更する場合、プライマリルーティングエンジンでのみ更新された設定をコミットするイベントスクリプトをイベントポリシーで呼び出すことを推奨します。これにより、設定の更新とその後のコミット操作が両方のルーティングエンジンで成功するようになります。 commit synchronize ステートメントはNSR設定の一部として [edit system] 階層レベルに設定されるため、設定は自動的にバックアップルーティングエンジンに同期されます。あるいは、 change-configuration ステートメントを使用して設定を変更した場合、またはイベントスクリプトがプライマリルーティングエンジンのみで変更をコミットしない場合、両方のルーティングエンジンが同時に設定データベースのロックを取得しようとし、その結果、一方または両方のコミットが失敗する可能性があります。
プライマリルーティングエンジン上の設定とコミットのみを行うイベントスクリプトを作成するには、現在のルーティングエンジンがプライマリルーティングエンジンであるかどうかをテストするロジックを含めます。現在のルーティングエンジンがプライマリルーティングエンジンである場合、設定を更新してコミットします。
次の SLAX イベント スクリプトは、ローカル デバイスに接続し、現在のルーティングエンジンがプライマリ ルーティングエンジンであるかどうかを確認します。プライマリルーティングエンジンの場合、スクリプトは設定を更新してからコミットします。
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 / {
<event-script-results> {
/* Retrieve chassis information */
var $rpc = <get-chassis-inventory>;
var $chassis_rpc = jcs:invoke($rpc);
var $current_state = $chassis_rpc/chassis/name;
/* Open a connection to the local device */
var $connection = jcs:open();
/* Define configuration change */
var $configuration-change = <configuration> {
<routing-options> {
<static> {
<route> {
<name>"198.51.100.0/24";
<next-hop>"10.1.3.1";
}
}
}
}
/* Load and commit the configuration */
var $load-action = "merge";
var $options := {
<commit-options> {
<log> "Configuration modified through event script";
}
}
if ($current_state == "Chassis") {
var $results := { call jcs:load-configuration($connection, $action=$load-action, $configuration = $configuration-change, $commit-options=$options); }
}
/* Close the connection */
var $close-results = jcs:close($connection);
}
}
同様に、以下の Python イベントスクリプトは、ローカルデバイスに接続し、現在のルーティングエンジンがプライマリルーティングエンジンである場合にのみ、設定を更新してコミットします。
from jnpr.junos import Device
from jnpr.junos.utils.config import Config
import jcs
with Device() as dev:
if("master" in dev.facts["current_re"]):
with Config(dev) as cu:
cu.load("set routing-options static route 198.51.100.0/24 next-hop 10.1.3.1", format="set")
cu.commit(comment="Configuration modified through event script", timeout=300)