在 Junos OS 自动化脚本中使用命名模板
Junos OS 提供了多个命名模板,可用于提交、操作、事件和 SNMP 脚本,以便在运行 Junos OS 的设备上更轻松地完成脚本任务。以下部分概述了如何导入和使用不同脚本语言的模板:
在 SLAX 和 XSLT 脚本中使用命名模板
若要在 SLAX 和 XSLT 脚本中使用命名模板,脚本必须导入 junos.xsl 文件,并在样式表声明中声明相应的命名空间 统一资源标识符 (URI)。Junos OS 命名模板在命名空间中定义,并带有关联的 URI http://xml.juniper.net/junos/commit-scripts/1.0
。
通过在 XSLT 脚本中包含 tag 元素或import
在 SLAX 脚本中包含<xsl:import/>
语句并指定 junos.xsl 文件位置,将 junos.xsl 文件导入到脚本中。
SLAX 和 XSLT 脚本通常将jcs
前缀映射到 URI,以避免与标准 XSLT 或用户定义模板的名称冲突。然后,脚本使用适当的前缀限定命名模板,该前缀在处理过程中将扩展为其关联的 URI 引用。通过将属性包含在 xmlns:jcs
XSLT 脚本的开始<xsl:stylesheet>
标记元素中或将语句包含在 ns jcs
SLAX 脚本中,将前缀映射jcs
到 URI。
若要在脚本中调用命名模板,请将元素包含在 XSLT 脚本中,或call
将语句包含在 <xsl:call-template name="template-name">
SLAX 脚本中,并传递任何必需或可选参数。模板参数按名称分配,可以按任意顺序显示。这与函数不同,函数必须按照函数定义指定的精确顺序将参数传递到函数中。
下面的示例将 junos.xsl 文件导入到脚本中,并将 jcs
前缀映射到 URI http://xml.juniper.net/junos/commit-scripts/1.0 标识的命名空间。该脚本演示了对模板的 jcs:edit-path
调用。
XSLT 语法
<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:jcs="http://xml.juniper.net/junos/commit-scripts/1.0"> <xsl:import href="../import/junos.xsl"/> ... <xsl:for-each select="interfaces/interface[starts-with(name, 'so-')]"> <xnm:warning> <xsl:call-template name="jcs:edit-path"/> <message>interface configured</message> </xnm:warning> </xsl:for-each> ... </xsl: stylesheet>
SLAX 语法
version 1.2; ns jcs = "http://xml.juniper.net/junos/commit-scripts/1.0"; import "../import/junos.xsl"; ... for-each ( interfaces/interface[starts-with(name,'so-') ) { <xnm:warning> { call jcs:edit-path(); <message> “interface configured”; } } ...
在 Python 脚本中使用命名模板功能
导入 jcs
模块的 Python 脚本可以执行与 SLAX 和 XSLT 脚本中使用的命名模板等效的 Python 等效函数。这些函数在 Python 脚本中提供的功能与相应的命名模板在 SLAX 或 XSLT 脚本中提供的功能基本相同。要确定哪些命名模板具有 Python 脚本中支持的功能,请参阅 了解 Junos OS 自动化脚本中的命名模板。
若要在 Python 脚本中调用与命名模板等效的函数,请包含任何必需的变量声明,调用该函数,并传递任何必需或可选参数。请注意,在 Python 脚本中,函数名称必须使用下划线而不是连字符。例如:
Python 语法
import jcs if __name__ == '__main__': script = "system-check.py" change_xml = """<system><scripts><op> <file><name>{0}</name></file></op> </scripts></system>""".format(script) jcs.emit_change(change_xml, "change", "xml")