Junos OS 自动化脚本中的全局参数和变量
Junos OS 在执行自动化脚本时会自动为其提供输入。脚本可以引用此输入,其中包括有关脚本执行环境的设备特定信息,例如设备主机名、脚本类型和执行脚本的用户。此信息对于创建响应各种复杂方案的脚本非常有用。
导入 junos.xsl 文件的 SLAX 和 XSLT 脚本可以使用 $junos-context
全局变量(节点集)引用此信息。 junos.xsl 导入文件还声明了几个预定义的全局参数,使脚本能够更轻松地引用此信息的子集。Python 脚本可以通过 junos.Junos_Context
字典引用此信息,该字典必须导入到脚本中。
要在 SLAX 和 XSLT 脚本中使用预定义参数或全局变量,必须导入 junos.xsl 文件,方法是将标记包含在 <xsl:import>
XSLT 脚本的样式表声明中,或者将语句包含在 import
SLAX 脚本中并指定 junos.xsl 文件位置,如以下示例代码所示:
XSLT 语法
<?xml version="1.0"?> <xsl:stylesheet version="1.0"> <xsl:import href="../import/junos.xsl"/> ... </xsl: stylesheet>
SLAX 语法
version 1.2; import "../import/junos.xsl";
蟒
要引用 Python 脚本中的信息,请导入 Junos_Context
字典。
from junos import Junos_Context
以下部分详细介绍了脚本输入:
SLAX 和 XSLT 脚本中提供的全局参数
多个预定义的全局参数可用于导入 junos.xsl 文件的 SLAX 和 XSLT 自动化脚本。这些参数提供有关 Junos OS 环境的信息。 表 1 描述了内置参数。
名字 |
描述 |
例 |
---|---|---|
$hostname |
本地设备的主机名 |
东京 |
$localtime |
执行脚本时的当地时间 |
2010 年 12 月 10 日星期五 11:42:21 |
$localtime-iso |
执行脚本时的本地时间,采用 ISO 格式 |
2010-12-10 11:42:21 PST |
$product |
本地设备的型号 |
M10i |
$script |
执行脚本的文件名 |
测试.slax |
$user |
执行脚本的用户的本地名称 |
根 |
预定义的全局参数在 junos.xsl 文件中声明。无需在脚本中声明这些参数即可使用它们。通过在参数名称前面加上美元符号 ($) 来访问脚本中全局参数的值,如以下示例所示:
SLAX 语法:
if ($user != "root") { var $script-message = $user _ " does not have permission to execute " _ $script; expr jcs:output($script-message); }
XSLT 语法:
<xsl:if test="$user != 'root'"> <xsl:variable name="script-message" select="concat($user, ' does not have permission to execute ', $script)"/> <xsl:value-of select="jcs:output($script-message)"/> </xsl:if>
自动化脚本中提供的全局变量
提交、事件和 op 脚本可以访问在执行时提供给脚本的特定环境信息。若要访问此信息,Python 脚本必须导入并引用 junos.Junos_Context
字典,而导入 junos.xsl 文件的 SLAX 和 XSLT 脚本可以引用 $junos-context
全局变量。 $junos-context
并 Junos_Context
包含相同的信息,但采用适合相应脚本语言的格式。
该 $junos-context
变量是一个节点集,其中包含 <junos-context>
节点和以下层次结构,该层次结构对于所有脚本的源树都是通用的,并嵌入到:
<junos-context> <chassis></chassis> <hostname></hostname> <localtime></localtime> <localtime-iso></localtime-iso> <pid></pid> <product></product> <re-master/> <routing-engine-name></routing-engine-name> <script-type></script-type> <tty></tty> <user-context> <class-name></class-name> <login-name></login-name> <uid></uid> <user></user> </user-context> </junos-context>
此外,根据所执行的脚本类型,还提供特定于脚本的信息。对于 op 脚本,该 <op-context>
元素也包含在提供给 op 脚本的源代码树中:
<junos-context> <op-context> <via-url/> </op-context> </junos-context>
对于提交脚本, <commit-context>
该元素也包含在提供给提交脚本的源代码树中:
<junos-context> <commit-context> <commit-comment>"This is a test commit"</commit-comment> <commit-boot/> <commit-check/> <commit-sync/> <commit-confirm/> <database-path/> </commit-context> </junos-context>
表 2 标识了变量 node-set 的每个 $junos-context
节点,提供了该节点的简要说明,并给出了未作为空标记输入脚本的任何元素的值示例。
父节点 |
节点 |
描述 |
示例内容 |
---|---|---|---|
<junos-context> |
<机箱> |
指定是在 路由矩阵的组件、 根系统域 (RSD) 还是 保护系统域 (PSD) 上执行脚本 |
scc, lcc (TX Matrix)psd, rsd (JCS)其他 |
<主机名> |
本地设备的主机名 |
东京 |
|
<当地时间> |
执行脚本时的当地时间 |
2010 年 12 月 10 日星期五 11:42:21 |
|
<localtime-iso> |
执行脚本时的本地时间,采用 ISO 格式 |
2010-12-10 11:42:21 PST |
|
<pid> |
cscript 进程 ID |
5257 |
|
<产品> |
本地设备的型号 |
M10i |
|
<re-master/> |
如果脚本在主路由引擎上执行,则包含空元素 |
||
<routing-engine-name> |
执行脚本的路由引擎 |
RE0 |
|
<脚本类型> |
正在执行的脚本类型 |
运维 |
|
<tty> |
用户会话的 TTY |
/dev/ttyp1 |
|
<junos-context><user-context> |
<类名> |
执行脚本的用户的登录名类 |
超级用户 |
<登录名> |
执行脚本的用户的登录名。对于 AAA 访问,这是 RADIUS/TACACS 用户名。 |
JSMITH公司 |
|
<uid> |
在设备配置中定义的执行脚本的用户的用户 ID 号 |
2999 |
|
<用户> |
执行脚本的用户的本地名称。Junos OS 使用本地名称进行验证。它可能与用于 AAA 身份验证的不同 |
根 |
|
<junos-context> <op-context> (仅限 op 脚本) |
<通过网址> |
如果使用 |
|
<junos-context><commit-context> (仅限提交脚本) |
<commit-boot/> |
在启动时提交时包含空元素 |
|
<commit-check/> |
执行 a |
||
<提交评论> |
用户对提交的评论 |
承诺修复转发问题 |
|
<提交确认/> |
执行 a |
||
<commit-sync/> |
执行 a |
||
<database-path/> |
指定会话的继承前候选配置位置的元素。对于正常配置会话,该元素的值是正常候选数据库的位置。对于专用配置会话,元素的值是专用候选数据库的位置。 |
该$junos-context
变量是一个节点集。因此,您可以通过包含正确的 XPath 表达式来访问整个脚本中的子元素。如果在初始启动期间执行提交,则以下 SLAX 提交脚本会将消息写入系统日志文件。该消息的设施值为 ,daemon
严重性值为 info
。有关更多信息,请参见 syslog()。
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 configuration { if ($junos-context/commit-context/commit-boot) { expr jcs:syslog("daemon.info", "This is boot-time commit"); } else { /* Do this ... */ } }
Python 脚本必须从junos
模块导入Junos_Context
字典才能访问提供给脚本的环境信息。字典中的Junos_Context
键名称与表 2 中概述的$junos-context
节点的名称相同。子元素嵌套在节点下的junos-context
节点(op-context
如user-context
、、和commit-context
)映射到 中的项Junos_Context
,其中键是节点名称,值是节点子元素的字典。例如:
'user-context': {'login-name': 'bsmith', 'user': 'bsmith', 'class-name': 'j-superuser', 'uid': '9999'}
以下示例输出显示 Junos_Context
在本地执行的 op 脚本的字典。请注意,op 脚本输入包含 op-context
键,在此方案中,该键为空。
{'product': 'm7i', 'user-context': {'login-name': 'bsmith', 'user': 'bsmith', 'class-name': 'j-superuser', 'uid': '9999'}, 'routing-engine-name': 're0', 'script-type': 'op', 're-master': None, 'hostname': 'R1', 'pid': '7136', 'tty': '/dev/ttyp1', 'chassis': 'others', 'op-context': ' ', 'localtime': 'Thu Jan 22 11:45:47 2015', 'localtime-iso': '2015-01-22 11:45:47 PST'}
以下示例输出显示 Junos_Context
操作期间 commit check
执行的提交脚本的字典。请注意,提交脚本输入包含密钥 commit-context
。
{'product': 'm7i', 'user-context': {'login-name': 'bsmith', 'user': 'bsmith', 'class-name': 'j-superuser', 'uid': '9999'}, 'routing-engine-name': 're0', 'script-type': 'commit', 're-master': None, 'hostname': 'R1', 'pid': '11201', 'tty': '/dev/ttyp1', 'commit-context': {'database-path': '/var/run/db/juniper.db', 'commit-check': None}, 'chassis': 'others', 'localtime': 'Thu Jan 22 16:23:55 2015', 'localtime-iso': '2015-01-22 16:23:55 PST'}
要访问字典中的单个值,请指定键名。例如:
Junos_Context['hostname'] Junos_Context['user-context']['class-name']