如何在操作脚本中使用 RPC 和操作模式命令
大多数 Junos OS 操作模式命令具有 XML 等效物。操作脚本可使用 远程过程调用 (RPC) 协议在本地或远程设备上执行这些 XML 命令。 Junos XML API 操作开发人员参考中列出了具有 XML 等效物的所有操作模式命令。
操作脚本中的 RPC 和操作模式命令的使用在以下部分中进行了更详细的讨论:
在操作脚本中使用 RPC
要在 SLAX 或 XSLT 操作脚本中使用 RPC,请将 RPC 包含在可变声明中,然后使用 jcs:invoke()
RPC 变量作为参数的或 jcs:execute()
扩展功能调用 RPC。该 jcs:invoke()
功能在本地设备上执行 RPC。该 jcs:execute()
功能与连接手柄一起在远程设备上执行 RPC。
下列片段在本地设备上调用 RPC,在 示例中进行了扩展并完全介绍 : 使用 Op 脚本自定义 show interfaces terse 命令的输出:
XSLT 语法
<xsl:variable name="rpc"> <get-interface-information/> # Junos RPC for the show interfaces command </xsl:variable> <xsl:variable name="out" select="jcs:invoke($rpc)"/> ...
SLAX 语法
var $rpc = <get-interface-information>; var $out = jcs:invoke($rpc);
以下片段在远程设备上调用相同的 RPC:
XSLT 语法
<xsl:variable name="rpc"> <get-interface-information/> # Junos RPC for the show interfaces command </xsl:variable> <xsl:variable name="connection" select="jcs:open('198.51.100.1', 'bsmith', 'test123')"/> <xsl:variable name="out" select="jcs:execute($connection, $rpc)"/> <xsl:value-of select="jcs:close($connection)"/> ...
SLAX 语法
var $rpc = <get-interface-information>; var $connection = jcs:open('198.51.100.1', 'bsmith', 'test123'); var $out = jcs:execute($connection, $rpc); expr jcs:close($connection);
在 Python 操作脚本中,使用 Junos PyEZ API 可轻松执行 RPC。每个 Junos PyEZ Device
类实例都有一个 rpc
属性,允许您执行通过 Junos XML API 可用的任何 RPC。与本地或远程设备建立会话后,可通过将属性和 RPC 方法名称附加 rpc
到设备实例来执行 RPC。返回值是从标记下 <rpc-reply>
的第一个元素开始的 XML 对象。
要在本地设备上执行 RPC,请使用空参数列表创建 Device
实例。要在远程设备上执行 RPC,请创建使用相应参数连接到该设备的 Device
实例。
以下代码在本地设备上调用 RPC 并打印回复:
Python 语法
from jnpr.junos import Device from lxml import etree with Device() as jdev: rsp = jdev.rpc.get_interface_information() print (etree.tostring(rsp, encoding='unicode'))
以下代码在远程设备上调用相同的 RPC 并打印回复:
Python 语法
from jnpr.junos import Device from lxml import etree import jcs user = jcs.get_input('Enter username: ') password = jcs.get_secret('Enter user password: ') with Device(host='198.51.100.1', user=user, password=password) as jdev: rsp = jdev.rpc.get_interface_information() print (etree.tostring(rsp, encoding='unicode'))
要在远程设备上执行 RPC,必须建立 SSH 会话。要使脚本建立连接,您必须为执行脚本的本地设备上的远程设备配置 SSH 主机密钥信息,或者远程设备的 SSH 主机密钥信息必须存在于执行脚本的用户的已知主机文件中。对于执行 RPC 的每个远程设备,使用以下一种方法配置 SSH 主机密钥信息:
要在本地设备上配置 SSH 已知主机,请包括
host
语句,并在配置的层次结构级别为远程设备[edit security ssh-known-hosts]
指定主机名和主机密钥选项。要手动检索 SSH 主机密钥信息,请发出
set security ssh-known-hosts fetch-from-server hostname
配置模式命令,指示 Junos OS 连接到远程设备并添加密钥。user@host# set security ssh-known-hosts fetch-from-server router2 The authenticity of host 'router2 (198.51.100.1)' can't be established. RSA key fingerprint is 30:18:99:7a:3c:ed:40:04:0f:fd:c1:57:7e:6b:f3:90. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'router2,198.51.100.1' (RSA) to the list of known hosts.
要从文件中手动导入 SSH 主机密钥信息,请使用
set security ssh-known-hosts load-key-file filename
配置模式命令并指定已知主机文件。user@host# set security ssh-known-hosts load-key-file /var/tmp/known_hosts Import SSH host keys from trusted source /var/tmp/known_hosts ? [yes,no] (no) yes
或者,执行脚本的用户可以登录本地设备,将 SSH 登录到远程设备,然后手动接受主机密钥,主机密钥被添加到用户已知的主机文件中。在以下示例中,root 登录到路由器 1。为了在路由器 2 上执行远程 RPC,root 通过发出
ssh router2
操作模式命令并手动接受密钥来添加路由器 2 的主机密钥。root@router1> ssh router2 The authenticity of host 'router2 (198.51.100.1)' can't be established. RSA key fingerprint is 30:18:99:7a:3c:ed:40:04:0f:fd:c1:57:7e:6b:f3:90. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'router2,198.51.100.1' (RSA) to the list of known hosts.
显示命令的 RPC 标记
您可在设备的 CLI 中显示用于操作模式命令的 RPC XML 标记。要显示用于命令的 RPC XML 标记,请在管道符号 (|) 后输入 display xml rpc
。
以下示例显示命令的 show route
RPC 标记:
user@host> show route | display xml rpc <rpc-reply xmlns:junos="http://xml.juniper.net/junos/10.1I0/junos"> <rpc> <get-route-information> </get-route-information> </rpc> <cli> <banner></banner> </cli> </rpc-reply>
SLAX 和 XSLT 脚本可使用 RPC XML 标记执行 RPC。Python 脚本必须将 RPC 标记和命令选项转换为适合 Python 的格式。有关使用 Junos PyEZ 执行 RPC 以及将 RPC 标记映射到相应的 Python 方法和方法参数的详细信息,请参阅 使用 Junos PyEZ 在运行 Junos OS 的设备上执行 RPC。
在 Op Scripts 中使用操作模式命令
某些操作模式命令没有 XML 等效物。SLAX 和 XSLT 脚本可以使用该元素执行没有 XML 等效物的<command>
命令。Python 脚本可使用类中Device
定义的 Junos PyEZ cli()
方法执行这些命令。
如果 Junos XML API 操作开发人员参考中未列出命令,则该命令没有 XML 等效项。确定命令是否有 XML 等效项的另一种方式是发出 命令,然后发出 | display xml
命令,例如:
user@host> operational-mode-command | display xml
如果输出中仅包含标记元素,如 <output>
, <cli>
和 <banner>
, 命令可能没有 XML 等效项。在以下示例中,输出表示命令 show host
没有 XML 等效项:
user@host> show host hostname | display xml <rpc-reply xmlns:junos="http://xml.juniper.net/junos/10.0R1/junos"> <output> ... </output> <cli> <banner></banner> </cli> </rpc-reply>
对于具有 XML 对应项的某些命令,管道| display xml
命令的输出不包括标记元素,<output>
<cli>
<banner>
而只是因为未配置相关功能。例如,命令show services cos statistics forwarding-class
具有 XML 等效项,用于在响应标记中<service-cos-forwarding-class-statistics>
返回输出,但是如果配置在层次结构级别上[edit class-of-service]
不包含任何语句,则不会显示命令的实际数据show services cos statistics forwarding-class | display xml
。输出与此类似:
user@host> show services cos statistics forwarding-class | display xml <rpc-reply xmlns:junos="http://xml.juniper.net/junos/8.3I0/junos"> <cli> <banner></banner> </cli> </rpc-reply>
因此, Junos XML API 操作开发人员参考 中的信息通常更可靠。
SLAX 和 XSLT 操作脚本可包含没有 XML 等效器件的命令。 <command>
使用脚本中的 、 <xsl:value-of>
和 <output>
元素,如以下代码片段所示。此片段在示例中进行了扩展并进行了全面介绍 :使用 Op Script 显示 DNS 主机名信息。
<xsl:variable name="query"> <command> <xsl:value-of select="concat('show host ', $hostname)"/> </command> </xsl:variable> <xsl:variable name="result" select="jcs:invoke($query)"/> <xsl:variable name="host" select="$result"/> <output> <xsl:value-of select="concat('Name: ', $host)"/> </output> ...
Python 操作脚本可使用 Junos PyEZ API 执行没有 XML 等效项的命令。在 cli()
类中 Device
定义的方法执行操作模式命令,并以文本格式返回输出。例如:
from jnpr.junos import Device def main(): with Device() as jdev: res = jdev.cli('show host hostname', warning=False) print (res) if __name__ == "__main__": main()
您也可指定 format='xml'
返回格式化为 Junos OS XML 元素的输出。有关 Junos PyEZ cli()
方法的详细信息,请 参阅 http://junos-pyez.readthedocs.org/en/latest/_modules/jnpr/junos/device.html#Device.cli。