使用 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
句对设备没有操作影响,但数据可在配置文件中承载,供外部应用程序使用。