使用事件脚本更改配置
您可以配置事件策略来针对事件更改配置。事件策略可通过引用更改和提交配置的事件脚本或使用 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.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 / { <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
句在层次结构级别上配置 [edit system]
为 NSR 配置的一部分。或者,如果您使用 change-configuration
语句修改配置,或者事件脚本未仅在主路由引擎上提交更改,则两个路由引擎可能同时尝试锁定配置数据库,从而导致一个或两个提交都失败。
要创建仅在主路由引擎上配置和提交配置的事件脚本,请包含用于测试当前路由引擎是否是主路由引擎的逻辑。如果当前路由引擎是主路由引擎,则更新配置并提交。
以下 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 / { <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)