使用 Commit Script 宏创建自定义配置语法
提交脚本宏允许您创建自定义配置语法,并将其扩展为标准 Junos OS 配置语句。您的自定义语法用作提交脚本的输入。提交脚本的输出为标准 Junos OS 配置语法,如 图 1 所示。标准 Junos OS 语句会添加到配置中,以便引起预期的操作更改。
宏使用持久或 瞬时更改 元素将您的自定义语法扩展为标准 Junos OS 配置语句。如果使用持久更改,则自定义语法和标准 Junos OS 语法都出现在候选配置中。如果使用瞬时更改,则自定义语法将显示在候选配置中,而标准 Junos OS 语法仅复制到结账配置中。
本节讨论以下主题:
创建自定义语法
宏的工作方法是 apply-macro 定位候选配置中的语句,并将语句中 apply-macro 指定的值用作参数,以执行提交脚本中定义的一组说明。实际上,您的自定义配置语法具有双重用途。该语法允许您简化配置任务,并且向脚本提供生成复杂配置所需的数据。
要输入自定义语法,请在任何层次结构级别中包含 apply-macro 语句,并指定语句中 apply-macro 所需的任何数据,例如:
apply-macro macro-name { parameter-name parameter-value; }
您可以在apply-macro配置层次结构的任意级别中包含语句。从这个意义上说,apply-macro语句类似于apply-groups语句。与同一层级的其他apply-macro语句相比,每个apply-macro语句都必须具有唯一名称。
语 apply-macro 句可包含一组具有可选值的参数。相应的提交脚本可指代宏名称、其参数或参数的值。当脚本检查配置并查找数据时,脚本将执行相应持久或瞬时更改指定的操作。
例如,鉴于以下配置部分,您可以编写脚本说明,根据参数名称生成标准配置:
protocols {
mpls {
apply-macro blue-type-lsp {
color blue;
}
}
}
以下<xsl:for-each>编程说明可在[edit protocols mpls]层次结构级别找到apply-macro包含名为color的参数的语句:
<xsl:for-each select="protocols/mpls/apply-macro[data/name = 'color']">
以下指令将创建名为 color 该参数的变量,并将参数值分配给该参数的 color 变量,在这种情况下,该变量为 blue:
<xsl:variable name="color" select="data[name = 'color']/value"/>
以下说明会 admin-groups 将语句添加到配置中,并将变量的 color 值分配给组名称:
<transient-change> <protocols> <mpls> <admin-groups> <name> <xsl:value-of select="$color"/> </name> </admin-groups> </mpls> </protocols> </transient-change>
生成的配置语句如下:
protocols {
mpls {
admin-groups {
blue;
}
}
}
<数据>元素
在语句中自定义语法的 XML 渲染中apply-macro,参数及其值分别包含在 和<value>元素中<name>。<value>和<name>元素是元素的<data>兄弟姐妹子女。例如,该apply-macro blue-type-lsp语句包含六个参数,如下所示:
[edit protocols mpls]
apply-macro blue-type-lsp {
10.1.1.1;
10.2.2.2;
10.3.3.3;
10.4.4.4;
color blue;
group-value 0;
}
参数和值在 Junos XML 标记元素中呈现,如下所示:
[edit protocols mpls] user@host# show | display xml <rpc-reply xmlns:junos="http://xml.juniper.net/junos/10.0R1/junos"> <configuration> <protocols> <mpls> <apply-macro> <name>blue-type-lsp</name> <data> <name>10.1.1.1</name> </data> <data> <name>10.2.2.2</name> </data> <data> <name>10.3.3.3</name> </data> <data> <name>10.4.4.4</name> </data> <data> <name>color</name> <value>blue</value> </data> <data> <name>group-value</name> <value>0</value> </data> </apply-macro> </mpls> </protocols> </configuration> </rpc-reply>
编写 commit 脚本宏时,可通过引用 、 <name>和元素来提取和<value>操作语句中apply-macro包含的<data>参数。
在以下示例中, select 属性的 XPath 表达式提取了作为该元素的子元素中 <value> 包含的 <data> 文本,该元素也包含 <name> 带有文本 color的儿童元素。可变声明会将该元素的 <value> 文本分配给名为 color的变量。
<xsl:variable name="color" select="data[name = 'color']/value"/>
SLAX 等效物包括:
var $color = ./data[name='color']/value;
假设已选定元素apply-macro的 element Python 对应项是:
color = element.find("data[name='color']/value").text
扩展自定义语法
在相应的提交脚本中,您包括一个或多个编程说明,用于检查指定层次结构级别上的 apply-macro 语句配置。或者,您可以使用表达 data/name 式在语句中 apply-macro 选择参数。
<xsl:for-each select="xpath-expression/apply-macro[data/name = 'parameter-name']">
例如,以下 XSLT 编程说明会选择包含color参数且出现在层次结构级别的[edit protocols mpls]每个apply-macro语句:
<xsl:for-each select="protocols/mpls/apply-macro[data/name = 'color']">
SLAX 等效物包括:
for-each (protocols/mpls/apply-macro[data/name = 'color']) {
Python 等效体跨越多个行以实现可读性,其功能包括:
for element in Junos_Configuration.xpath \
("./protocols/mpls/apply-macro[data/name='color']"):
在扩展宏时,XSLT 脚本中特别有用的编程说明就是<xsl:value-of>说明。此指令选择参数值,并使用它为 Junos OS 语句构建选项值。例如,以下说明将变量、文本-lsp-和当前上下文节点(表示为“”.)的color值串联,以便为 LSP 构建名称。
<label-switched-path> <name> <xsl:value-of select="concat($color, '-lsp-', .)"/> </name> </label-switched-path>
SLAX 使用下列 (_) 来关联值。
<label-switched-path> {
<name> $color _ '-lsp-' _ .;
}
当脚本包含查找必要数据的说明时,您可以为使用数据构建标准 Junos OS 配置的持久或瞬时更改提供内容。
以下瞬态更改将创建管理组,label-switched-path并将语句添加到配置中。标签交换系列将分配一个名称,用于将变量、文本-lsp-和当前选定的 IP 地址(“”.)的color值串联在一起。瞬时更改还会添加语to句并分配当前选定的 IP 地址。最后,瞬时更改会添加admin-group include-any语句并分配变量的color值。
<transient-change> <protocols> <mpls> <admin-groups> <name><xsl:value-of select="$color"/></name> <group-value><xsl:value-of select="$group-value"/></group-value> </admin-groups> <xsl:for-each select="data[not(value)]/name"> <label-switched-path> <name><xsl:value-of select="concat($color, '-lsp-', .)"/></name> <to><xsl:value-of select="."/></to> <admin-group> <include-any><xsl:value-of select="$color"/></include-any> </admin-group> </label-switched-path> </xsl:for-each> </mpls> </protocols> </transient-change>
SLAX 等效物包括:
<transient-change> {
<protocols> {
<mpls> {
<admin-groups> {
<name> $color;
<group-value> $group-value;
}
for-each (data[not(value)]/name) {
<label-switched-path> {
<name> $color _ '-lsp-' _ .;
<to> .;
<admin-group> {
<include-any> $color;
}
}
}
}
}
}
同样在 Python 中:
lsp_config =""
for element2 in element.xpath("data[not(value)]/name"):
lsp_config = lsp_config + """
<label-switched-path>
<name>{0}-lsp-{1}</name>
<to>{1}</to>
<admin-group>
<include-any>{0}</include-any>
</admin-group>
</label-switched-path>
""".format(color, element2.text)
change_xml = """
<protocols>
<mpls>
<admin-groups>
<name>{0}</name>
<group-value>{1}</group-value>
</admin-groups>
{2}
</mpls>
</protocols>
""".format(color, group_value, lsp_config).strip()
jcs.emit_change(change_xml, "transient-change", "xml")
这里显示的示例部分。有关完整示例,请参阅 示例:使用 Commit Script 宏创建自定义配置语法。
提交配置后,脚本将运行,结果的完整配置如下所示:
[edit]
protocols {
mpls {
admin-groups {
blue 0;
}
label-switched-path blue-lsp-10.1.1.1 {
to 10.1.1.1;
admin-group include-any blue;
}
label-switched-path blue-lsp-10.2.2.2 {
to 10.2.2.2;
admin-group include-any blue;
}
label-switched-path blue-lsp-10.3.3.3 {
to 10.3.3.3;
admin-group include-any blue;
}
label-switched-path blue-lsp-10.4.4.4 {
to 10.4.4.4;
admin-group include-any blue;
}
}
}
上一个示例演示了如何使用简化的自定义语法来配置标签交换系列 (LSP)。如果您的网络设计需要配置大量 LSP,则使用 commit 脚本宏可以节省时间、确保一致性并防止配置错误。
使用宏的其他方法
在“创建自定义语法”中讨论的示例显示了一个宏,该宏使用瞬时更改来创建预期的操作影响。或者,您可以创建一个提交脚本,该脚本使用持久更改将标准 Junos OS 语句添加至候选配置并完全删除自定义语法。这样,不熟悉自定义语法的网络操作员就可以查看配置文件,并将呈现的完整配置视为标准 Junos OS 语句。不过,由于提交脚本宏仍然有效,您可以使用自定义语法快速轻松地创建复杂配置。
除了在创建自定义语法中讨论的应用程序类型之外,您还可以使用宏来防止提交脚本执行任务。例如,在接口中自动添加 MPLS 配置的基本提交脚本会对您明确标记为不需要 MPLS 的接口例外,方法是测试已命名no-mpls的apply-macro语句的存在。有关此宏使用示例的示例,请参阅 示例:控制 LDP 配置。
您可以将该 apply-macro 语句用作存储外部数据的地方。提交脚本不会检查 apply-macro 语句,因此语 apply-macro 句对设备没有操作影响,但数据可在配置文件中承载,供外部应用程序使用。