Help us improve your experience.

Let us know what you think.

Do you have time for a two-minute survey?

 
 

在 Junos 设备上为 YANG RPC 创建操作脚本

您可以添加 YANG 数据模型,用于在受支持的 Junos 设备上定义自定义远程过程调用 (RPC)。向设备中添加非字母 YANG RPC 时,还必须提供用作 RPC 处理器的操作脚本。RPC 定义引用操作脚本,在执行 RPC 时调用该脚本。操作脚本会执行操作并检索 RPC 所需的信息,并返回 RPC output 语句中定义的任何必要的 XML 输出元素。

操作脚本可以使用 Stylesheet Language Alternative SyntaX (SLAX) 或 Python 编写。SLAX 操作脚本类似于 SLAX 操作脚本,可以执行 Junos XML 管理协议和 Junos XML API 支持的 RPC 提供的任何功能。Python 操作脚本可以利用 Python 语言中的所有功能和结构,这提供了比 SLAX 脚本更高的灵活性。此外,Python 操作脚本支持 Junos PyEZ API,有助于在 Junos 设备上执行 RPC 和执行操作和配置任务。Python 脚本还可以利用库 lxml ,从而简化 XPath 的处理。此外,从 Junos OS 19.3R1 版开始,运行具有升级版 FreeBSD 支持的 Junos OS 的设备在 Python 操作脚本中使用 IPv6。

本主题讨论如何创建操作脚本,包括如何分析 RPC 输入参数、访问脚本中的操作和配置数据、发出 XML 输出以及如何在设备上验证和加载脚本。

操作脚本样板

SLAX 脚本样板

SLAX 操作脚本必须包括用于基本脚本功能的必要模板,以及脚本中使用的任何可选功能(如 Junos OS 扩展功能和指定模板)。此外,脚本必须使用语句声明所有 RPC 输入参数param。SLAX 操作脚本样板如下所示:

Python 脚本样板

Python 操作脚本必须包含一个解释器指令行,用于指定用于执行脚本的 Python 版本。 表 1 概述了可以在不同版本中使用的解释器指令行。

表 1:Python 操作脚本解释器指令行
Python 版本 解释器指令行 支持的版本

Python 3

#!/usr/bin/python3

#!/usr/bin/env python3

Junos OS 20.2R1 及更高版本

Junos OS Evolved 21.1R1 及更高版本

Python 2.7

#!/usr/bin/python

#!/usr/bin/env python

Junos OS 20.1 及更早版本

Junos OS 演化版 22.2 及更早版本

注意:

从 Junos OS 20.2R1 版和 Junos OS 演化版 22.3R1 开始,设备使用 Python 3 执行 YANG 操作和转换脚本。在早期版本中,Junos OS 仅使用 Python 2.7 执行这些脚本,而 Junos OS Evolved 默认使用 Python 2.7 执行脚本。

此外,Python 操作脚本还应导入脚本中使用的任何库、模块或对象。例如,除了标准 Python 库,Python 操作脚本可能导入以下内容:

  • jcs 库 — 使脚本能够在脚本中使用 Junos OS 扩展功能和 Junos OS 名为的模板 功能。

  • jnpr.junos 模块和类 — 使脚本能够使用 Junos PyEZ。

  • lxml 库 — 简化 XPath 处理。

例如:

解析 RPC 输入参数

输入参数概述

RPC 可以使用 optional input 语句定义输入参数。执行 RPC 并提供输入参数时,Junos OS 会调用 RPC 的操作脚本,并将这些参数传递到脚本。在 Python 或 SLAX 操作脚本中,您可以分别以相同的方式访问 RPC 输入参数,就像分别访问普通 Python 脚本或 Junos OS SLAX 操作脚本的命令行参数一样。

对于 get-host-status RPC,请考虑以下input语句:

RPC 可在 CLI 中执行,也可通过 NETCONF 或 Junos XML 协议会话执行。例如,您可以在 CLI 中执行以下命令:

同样,您也可以在远程会话中执行以下 RPC:

执行命令或 RPC 时,设备将调用操作脚本并传递参数。以下部分介绍如何在 SLAX 或 Python 操作脚本中处理参数。

注意:

从 Junos OS 19.2R1 版开始,自定义 YANG RPC RPC 在 Junos OS CLI 中执行命令时支持类型的empty输入参数,而传递给 action 脚本的值是参数名称。在早期版本中,仅在 NETCONF 或 Junos XML 协议会话中执行 RPC 且传递到操作脚本的值为字符串'none'时,才支持类型的empty输入参数。

SLAX 脚本输入参数

在 SLAX 操作脚本中,必须使用语句声明输入参数 param 。参数名称必须与 YANG 模块中定义的参数名称相同。

调用后,脚本将每个参数的值分配给相应的参数,然后您可以在整个脚本中引用该参数。声明参数时和访问其值时,都必须包括美元符号 ($)。如果参数为类型 empty,则参数名称将作为其值传入。

注意:

有关 SLAX 参数的更多信息,请参阅自动化脚本用户指南中的 SLAX 参数概述

Python 脚本输入参数

对于 Python 操作脚本,参数将按如下传递到脚本:

  • 第一个参数始终是操作脚本的文件路径。

  • 该列表的下一个参数是用户提供的每个输入参数的名称和值。

    参数名称的传入方式如下:

    • 在 Junos OS 21.1 及更低版本中,设备会传递参数的名称。

    • 在 Junos OS 21.2R1 及更高版本中,设备将单个连字符 (-) 前缀为单字符参数名称,并将两个连字符 (--) 前缀添加到多字符参数名称。

    注意:

    在 CLI 中执行 RPC 命令时,参数将按命令行上给出的顺序传递到脚本。在 NETCONF 或 Junos XML 协议会话中,XML 中的参数顺序是任意的,因此参数会按照在 RPC input 语句中声明的顺序传递到脚本。

  • 列表中最后两个参数(由系统而非用户提供)是 'rpc_name' RPC 的名称。

以下部分将讨论如何处理不同版本中传递给 Python 操作脚本的参数。

Python 操作脚本(21.2R1 或更高版本)

从 Junos OS 21.2R1 版和 Junos OS 演化版 21.2R1 开始,当设备将输入参数名称传递到 Python 操作脚本时,它将单个连字符 (-) 前缀为单字符参数名称,并将两个连字符 (--) 前缀为多字符参数名称。这使您能够使用标准命令行解析库来处理参数。

对于上一个 YANG RPC 示例,操作脚本的 sys.argv 输入参数列表为:

以下示例 Python 代码使用 argparse 库来处理参数。在这种情况下,解析器还必须考虑 rpc_name 系统传递到脚本的参数。

Python 操作脚本(21.1 及更早版本)

在 Junos OS 21.1 及更低版本中,设备将输入参数名称传递给 Python 操作脚本,与命令或 RPC 中给出的完全一样。您可以通过列表访问输入参数 sys.argv

对于上一个 YANG RPC 示例,操作脚本的 sys.argv 输入参数列表为:

以下示例 Python 代码演示了一种从 sys.arv 示例 RPC 的列表中提取每个参数的值的方法。该示例首先定义一个字典,其中包含可能参数名称作为密钥和每个参数的默认值。然后,代码会检查列表中的每个密钥 sys.argv ,并检索列表中参数名称的索引(如果存在)。然后,代码在相邻索引位置提取参数的值,并将其存储在相应密钥的字典中。此方法可确保在执行期间,如果参数以不同顺序传递到脚本,则为给定参数检索正确的值。

检索操作和配置数据

操作脚本可以从运行 Junos OS 的设备上检索操作和配置数据,然后解析这些数据以获取必要的信息。SLAX 操作脚本可以通过执行 Junos XML 管理协议和 Junos XML API 支持的 RPC 从设备检索信息。Python 操作脚本可以通过使用 Junos PyEZ API 或像在 shell 中使用操作脚本一 cli -c 'command' 样在操作脚本中使用 CLI 命令来检索操作和配置信息。要用 cli -c 该方法检索操作信息,请包括所需的操作命令。要检索配置信息,请使用 show configuration 命令。

以下 SLAX 片段使用等效<get-interface-information>请求标记在本地设备上执行show interfaces命令:

以下 Python 代码使用 Junos PyEZ 执行 get_interface_information RPC,这与 CLI 命令等效 show interfaces

注意:

有关使用 Junos PyEZ 在运行 Junos OS 的设备上执行 RPC 的信息,请参阅 使用 Junos PyEZ 在运行 Junos OS 的设备上执行 RPC

以下 Python 代码执行 show interfaces | display xml 命令并将字符串输出转换为 XML 树,可使用 XPath 结构解析所需的数据:

发出 RPC XML 输出

RPC 可以使用 optional output 语句定义输出元素。操作脚本必须为 RPC 输出定义并发出任何必要的 XML 元素。脚本发出的 XML 层次结构应反映 RPC output 语句定义中容器定义的树和叶语句。要返回 XML 输出,操作脚本必须发出 RPC 输出层次结构,并且仅发出输出层次结构。SLAX 脚本必须使用语句 copy-of 来发射 XML,而 Python 脚本可以使用 print 语句。

例如,考虑以下 YANG RPC output 语句:

操作脚本必须生成并发出相应的 XML 输出,例如:

检索所需输出元素的值后,Python 脚本可能会使用以下代码发出 XML 输出层次结构:

同样,SLAX 操作脚本也可能使用以下脚本:

在设备上验证和加载操作脚本

在 YANG RPC 定义中,可以通过包括 junos:commandjunos:action-execute 语句和 junos:script 子语句来指定 RPC 的操作脚本,这些子语句将操作脚本的文件名作为其值。您必须为每个 RPC 定义一个操作脚本,而且只定义一个操作脚本。例如:

注意:

从 Junos OS 17.3 版开始,该 action-execute 语句的子表示为 command。在早期版本中, action-executecommand 语句放置在同一级别,语句 command 是可选的。

注意:

为运行 Junos OS 的设备定义 RPC 的 YANG 模块必须导入 Junos OS DDL 扩展模块。

Python 操作脚本必须满足以下要求,才能在运行 Junos OS 的设备上执行脚本。

  • 文件所有者可以是 Junos OS super-user 登录类中的 root 用户。

  • 只有文件所有者对文件拥有写权限。

  • 脚本包括 操作脚本样板中概述的解释器指令行。

  • language python层次结构级别配置[edit system scripts]language python3语句以支持执行未签名的 Python 脚本。

注意:

从 Junos OS 20.2R1 版和 Junos OS 演化版 22.3R1 开始,设备使用 Python 3 执行 YANG 操作和转换脚本。在早期版本中,Junos OS 仅使用 Python 2.7 执行这些脚本,而 Junos OS Evolved 默认使用 Python 2.7 执行脚本。

注意:

用户只能在运行 Junos OS 的设备上执行未签名的 Python 脚本,前提是该脚本的文件权限包括用户属于第一类的读取权限,按用户、组或其他人的顺序。

您可以通过发出 request system yang validate action-script 命令并提供脚本的路径来验证 CLI 中操作脚本的语法。例如:

要使用操作脚本,必须使用包含相应 RPC 的 YANG 模块将其加载到设备上。您可以使用 request system yang addrequest system yang update 命令将 YANG 模块及其关联的操作脚本添加到设备上的新或现有 YANG 软件包中。将模块和操作脚本添加到设备后,可执行自定义 RPC。执行 RPC 时,设备会调用引用的脚本。

故障排除操作脚本

默认情况下,操作脚本在执行脚本时会记录信息跟踪消息。您可以查看跟踪消息,以验证 RPC 是否已调用脚本以及脚本是否正确执行。如果脚本因任何原因失败,错误将被记录到跟踪文件中。

Junos OS

要查看运行的 Junos OS 设备上的操作脚本跟踪消息,请查看 action.log trace 文件的内容。

Junos OS Evolved

要查看 Junos OS Evolved 设备上的操作脚本跟踪消息,请查看 cscript 应用程序跟踪消息,其中包括所有脚本类型的跟踪数据。

版本历史记录表
释放
描述
22.3R1-EVO
从 Junos OS Evolved 22.3R1 版开始,Junos OS Evolved 使用 Python 3 执行 YANG 操作和转换脚本。
21.2R1 和 21.2R1-EVO
从 Junos OS 21.2R1 和 Junos OS 演化版 21.2R1 版开始,当设备将命令行参数传递到 Python 操作脚本时,它将单个连字符 (-) 前缀为单字符参数名称,并将两个连字符 (--) 前缀为多字符参数名称。
20.2R1
从 Junos OS 20.2R1 版开始,Junos OS 使用 Python 3 执行 YANG 操作和转换脚本。
19.2R1
从 Junos OS 19.2R1 版开始,自定义 YANG RPC RPC 在 Junos OS CLI 中执行命令时支持类型的 empty 输入参数,而传递给 action 脚本的值是参数名称。
17.3R1
从 Junos OS 17.3 版开始,该 action-execute 语句的子表示为 command