使用事件脚本更改配置
您可以配置事件策略来更改配置以响应事件。事件策略可以通过调用更改并提交配置的事件脚本,或者使用 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)