使用 SLAX 和 XSLT 脚本更改配置
SLAX 和 XSLT 操作和事件脚本可以使用该 jcs:load-configuration 模板对 Junos OS 配置进行结构化更改。熟悉 Junos OS 的有经验的用户可以编写脚本,提示输入相关配置信息,并相应地修改配置。这样,即使是对 Junos OS 经验较少的用户也可以使用脚本安全地修改配置。
本主题讨论如何使用 jcs:load-configuration 模板修改配置。
jcs:load-configuration 模板概述
该 jcs:load-configuration 模板包含在 junos.xsl 导入文件中。该模板可以:
使用
load merge、或load override操作将 Junos XML 配置数据加载到候选配置中,load replace并提交更改将活动配置回滚到之前提交的配置
加载并提交救援配置
调用时, jcs:load-configuration 模板会在目标设备上执行以下操作:
锁定配置数据库
加载配置更改
提交配置
解锁配置数据库
jcs:load-configuration模板在模式下configure exclusive对配置进行更改。在此模式下,只要脚本访问共享数据库并对配置进行更改,Junos OS 就会锁定候选全局配置。如果配置数据库已锁定,或者调用模板时候选配置中存在未提交的更改,则模板调用可能会失败。如果模板成功加载配置数据,但提交失败,则 Junos OS 将在数据库解锁时丢弃未提交的更改。
SLAX 模板语法为:
call jcs:load-configuration($action="(merge | override | replace)", $commit-options=node-set, $configuration=configuration-data, $connection=connection-handle, $rescue="rescue", $rollback=number);
XSLT 模板语法为:
<xsl:call-template name="jcs:load-configuration">
<xsl:with-param name="action" select="(merge | override | replace)"/>
<xsl:with-param name="commit-options" select="node-set"/>
<xsl:with-param name="configuration" select="configuration-data"/>
<xsl:with-param name="connection" select="connection-handle"/>
<xsl:with-param name="rescue" select=""rescue""/>
<xsl:with-param name="rollback" select="number"/>
</xsl:call-template>
您向 jcs:load-configuration 模板提供参数以指定:
要对其进行更改的设备的连接句柄
要对配置进行的更改
定义如何将更改集成到现有配置中的加载操作
可选提交选项
在调用jcs:load-configuration模板之前,必须与目标设备建立连接。若要连接到设备,请使用必要的参数调用jcs:open()函数。然后将jcs:load-configurationconnection参数设置为函数返回jcs:open()的句柄。
以下示例代码连接到本地设备并修改配置:
var $conn = jcs:open();
var $results := {
call jcs:load-configuration($configuration=$config-changes, $connection=$conn);
}
var $close-results = jcs:close($conn);
调用 jcs:load-configuration 模板时,您可以包含 configuration 该参数以在设备上加载新的配置数据,可以指定 rollback 该参数以将配置还原为之前提交的配置,也可以指定 rescue 要加载并提交挽救配置的参数。
加载和提交配置数据
SLAX 和 XSLT 脚本可以调用 jcs:load-configuration 模板来修改配置。 configuration 该参数定义要加载的 Junos XML 配置数据,该 action 参数指定如何加载数据。该 commit-options 参数定义在提交操作期间要使用的选项。
以下示例 op 脚本调用 jcs:load-configuration 模板以修改配置以禁用接口。模板所需的 jcs:load-configuration 所有值都定义为变量,然后将这些变量作为参数传递到模板中。
:=运算符将模板调用的结果jcs:load-configuration复制到临时变量,并在该变量上运行node-set函数。:=运算符确保disable-results变量是节点集而不是结果树片段,以便脚本可以访问内容。
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";
ns ext = "http://xmlsoft.org/XSLT/namespace";
import "../import/junos.xsl";
match / {
<op-script-results> {
var $interface = jcs:get-input("Enter interface to disable: ");
var $config-changes = {
<configuration> {
<interfaces> {
<interface> {
<name> $interface;
<disable>;
}
}
}
}
var $load-action = "merge";
var $options := {
<commit-options> {
<synchronize>;
<log> "disabling interface " _ $interface;
}
}
var $conn = jcs:open();
var $results := {
call jcs:load-configuration($action=$load-action, $commit-options=$options,
$configuration=$config-changes, $connection=$conn);
}
if ($results//xnm:error) {
for-each ($results//xnm:error) {
<output> message;
}
}
var $close-results = jcs:close($conn);
}
}
有关此脚本的详细信息,请参阅 示例:使用 SLAX 和 XSLT 操作脚本更改配置。
对 jcs:load-configuration 模板调用的等效 XSLT 代码为:
<xsl:variable name="disable-results-temp">
<xsl:call-template name="jcs:load-configuration">
<xsl:with-param name="action" select="$load-action"/>
<xsl:with-param name="commit-options" select="$options"/>
<xsl:with-param name="configuration" select="$disable"/>
<xsl:with-param name="connection" select="$conn"/>
</xsl:call-template>
</xsl:variable>
<xsl:variable xmlns ext="http:xmlsoft.org/XSLT/namespace" \
name="disable-results" select="ext:node-set($disable-results-temp)"/>
加载并提交救援配置
救援配置允许您定义已知的工作配置或具有可随时还原的已知状态的配置。SLAX 和 XSLT 脚本可以使用参数rescue调用jcs:load-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 "/var/db/scripts/import/junos.xsl";
match / {
<op-script-results> {
/* Open the connection */
var $conn = jcs:open();
/* Load and commit the rescue configuration */
var $results = {
call jcs:load-configuration($connection=$conn, $rescue="rescue");
}
expr jcs:output($results);
/* Close the connection */
expr jcs:close($conn);
}
}
等效的 XSLT 脚本为:
<?xml version="1.0" standalone="yes"?>
<xsl:stylesheet
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" version="1.0">
<xsl:import href="/var/db/scripts/import/junos.xsl"/>
<xsl:template match="/">
<op-script-results>
<!-- Open the connection -->
<xsl:variable name="conn" select="jcs:open()"/>
<!-- Load and commit the rescue configuration -->
<xsl:variable name="results">
<xsl:call-template name="jcs:load-configuration">
<xsl:with-param name="connection" select="$conn"/>
<xsl:with-param name="rescue" select=""rescue""/>
</xsl:call-template>
</xsl:variable>
<xsl:value-of select="jcs:output($results)"/>
<!-- Close the connection -->
<xsl:value-of select="jcs:close($conn)"/>
</op-script-results>
</xsl:template>
</xsl:stylesheet>
回滚配置
SLAX 和 XSLT 脚本可以使用该rollback参数调用jcs:load-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 / {
<op-script-results> {
var $rollback_id = jcs:get-input("Rollback id: ");
/* Open the connection */
var $conn = jcs:open();
/* Roll back the configuration and commit it */
var $results = {
call jcs:load-configuration($connection=$conn, $rollback=$rollback_id);
}
/* Close the connection */
expr jcs:close($conn);
}
}
user@host> op load-rollback Rollback id: 1