自动化脚本中的全局Junos OS和变量
Junos OS自动化脚本执行时,这些脚本将自动提供输入。脚本可参考此输入,包括有关脚本执行环境的设备特定信息,例如设备主机名、脚本类型和执行脚本的用户。此信息有助于创建响应各种复杂情景的脚本。
导入 junos.xsl $junos-context
文件的 SLAX 和 XSLT 脚本可以使用节点集全局变量来参考此信息。 junos.xsl 导入文件还声明多个预定义的全局参数,使脚本能够更轻松地引用此信息的子集。Python 脚本可通过必须在 junos.Junos_Context
脚本中导入的词汇表引用此信息。
要使用 SLAX 和 XSLT 脚本中的预定义参数或全局变量,您必须将标记包括到 XSLT import
脚本的样式表声明内,或者将 语句包括到 SLAX 脚本中并指定 junos.xsl 文件位置,如以下示例代码所示,导入 junos.xsl <xsl:import>
文件:
XSLT 语法
<?xml version="1.0"?> <xsl:stylesheet version="1.0"> <xsl:import href="../import/junos.xsl"/> ... </xsl: stylesheet>
SLAX 语法
version 1.0; import "../import/junos.xsl";
Python
要引用 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 |
执行脚本的文件名 |
test.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>
自动化脚本中提供的全局变量
提交、事件和操作脚本可以访问执行时提供给脚本的特定环境信息。要访问这些信息,Python junos.Junos_Context
脚本必须导入和引用词汇表,导入 junos.xsl $junos-context
$junos-context
文件的 SLAX 和 XSLT 脚本可以引用全局变量。包含 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-context>
元素还包含在提供给 op 脚本的源 树中:
<junos-context> <op-context> <via-url/> </op-context> </junos-context>
对于提交脚本, <commit-context>
元素还包含在提供给 commit 脚本的源树中:
<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 $junos-context
标识可变节点集的每个节点,提供节点的简要说明,并提供了不作为空标记输入脚本的任何元素的值示例。
父节点 |
节点 |
描述 |
示例内容 |
---|---|---|---|
<junos上下文> |
<> |
指定是在路由矩阵、根系统域 (RSD) 或保护系统域 (PSD) 的组件上执行脚本 |
scc、lcc (TX Matrix)psd、rsd (JCS)其他 |
<主机名> |
本地设备的主机名 |
东京 |
|
<本地> |
执行脚本时的本地时间 |
2010 年 12 月 10 日 11:42:21 |
|
<本地时间-iso> |
执行脚本时,本地时间(采用 ISO 格式) |
2010-12-10 11:42:21(PST) |
|
<pid> |
规范进程 ID |
5257 |
|
<生产> |
本地设备的型号 |
m10i |
|
<re-master/> |
如果在主程序上执行脚本,则包含空路由引擎 |
||
<路由引擎-名称> |
路由引擎执行脚本的一个工具 |
re0 |
|
<规范类型> |
要执行的脚本类型 |
操作 |
|
<tty> |
用户会话的 TTY |
/dev/ttyp1 |
|
<junos上下文><环境信息> |
<类名称> |
执行脚本的用户的登录类 |
超级用户 |
<login-name> |
执行脚本的用户的登录名称。对于 AAA 访问,这是RADIUS/TACACS 用户名。 |
j工 |
|
<一> |
执行脚本的用户 ID 号(在设备配置中定义) |
2999 |
|
<> |
执行脚本的用户的本地名称。Junos OS使用本地名称进行身份验证。它可能与用于安全 |
根 |
|
<junos上下文><上下文> (仅操作脚本) |
<via-url> |
使用 命令执行远程操作脚本时包含的空 |
|
<与上下文><上下文> (仅提交脚本) |
<启动/> |
提交在启动时包含的空元素 |
|
<检查/> |
执行 时包括的 |
||
<意见> |
有关提交的用户评论 |
提交修复转发问题 |
|
<确认/> |
执行 时包括的 |
||
<同步/> |
执行 时包括的 |
||
<base-path/> |
指定会话预继承候选配置位置的元素。对于常规配置会话,元素的值是正常候选数据库的位置。对于专用配置会话,元素的值是专用候选数据库的位置。 |
该 $junos-context
变量是一个节点集。因此,可以通过包含正确的 XPath 表达式来访问整个脚本中的子元素。如果初始启动期间执行提交,则以下 SLAX commit 脚本会将一条消息写入系统日志文件。该消息将获得 一个 设备 值 daemon
和 一个 严重性值 info
。有关详细信息,请参阅 syslog ()。
version 1.0; 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_Context
导入此junos
词汇,以访问提供给脚本的环境信息。词汇表中的密钥Junos_Context
名称与表 $junos-context
2 中概述的节点名称相同。子元素嵌套junos-context
user-context
在 节点下(如 和 op-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 脚本的词汇 commit check
表。请注意,commit 脚本输入包含密钥 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']