定义用于解析结构化输出的 Junos PyEZ 操作表
总结 创建自定义表,从 RPC XML 输出中选择特定项目,以便从 Junos 设备提取操作信息。
Junos PyEZ 操作 (op) 表,用于结构化输出,从在 Junos 设备上执行的 RPC 的 XML 输出中提取数据。这使您能够快速检索和查看设备的相关操作状态信息。
Junos PyEZ 表使用 YAML 进行格式化。Op 表定义可以包含许多必需参数和可选参数, 表 1 汇总了这些参数。
表参数名称 |
表参数 |
描述 |
|---|---|---|
表名 |
– |
表的用户定义标识符。 |
RPC 命令 |
|
请求要执行的 RPC 的标记名称。 |
RPC 默认参数 |
|
(可选)RPC 的默认命令选项和参数。 |
RPC 可选参数键 |
|
(可选)当命令的可选第一个参数不需要特定关键字时,引用该参数。 如果不包括此属性,则必须为检索操作数据时方法参数列表中包括的 |
表项 |
|
相对于元素中的 这些项将成为关联视图的参考。 |
表项键 |
|
(可选)XPath 表达式或 XPath 表达式列表,用于选择一个或多个标记,这些标记的值唯一标识不使用该元素作为标识符的 如果该项使用该 |
表视图 |
|
用于从表项目中提取字段数据的视图。 |
请考虑以下 Junos PyEZ op 表, EthPortTable它包含在 Junos PyEZ 发行版中。下表提取目标设备上以太网接口的操作状态信息:
---
EthPortTable:
rpc: get-interface-information
args:
media: True
interface_name: '[afgxe][et]-*'
args_key: interface_name
item: physical-interface
view: EthPortView
以下各节讨论该表的不同组件。
表名
表名称是表的用户定义标识符。YAML 文件或字符串可以包含一个或多个表。YAML 文档的开头必须左对齐。例如:
--- EthPortTable: # Table definition
RPC 命令 (rpc)
用于结构化输出的 Junos PyEZ 操作表从 RPC 的 XML 输出中提取特定信息。必须在操作表定义中包含该 rpc 属性,以指定要在设备上执行的 RPC。
该 rpc 值是命令的 Junos XML 请求标记。例如,命令的请求 show interfaces 标签名称为 get-interface-information。
rpc: get-interface-information
可以使用以下方法之一找到请求标记:
在
| display xml rpcJunos OS CLI 中的命令之后附加选项。执行 Junos PyEZ
Device实例display_xml_rpc('command', format='text')方法在 Junos XML API 资源管理器中查找命令和相应的标记
RPC 默认参数(参数)
可选 args 属性定义 RPC 的默认命令选项和参数。这些键值对列在 下 args缩进。当您在脚本中调用 get() 该方法并且不提供重写该默认值的参数时,将使用默认参数。
如果选项只是一个不需要特定值的标志,则可以通过在表定义中将True选项值设置为,将其包含在参数列表中。例如,命令映射到show interfaces mediaget-interface-information带有参数media: True的请求标记。如果选项需要值,请将参数值设置为要用作默认值的值。
rpc: get-interface-information
args:
media: True
interface_name: '[afgxe][et]-*'
如果 Junos OS 命令行界面 (CLI) 中的选项名称带有连字符,则必须将名称中的任何短划线更改为下划线。
默认情况下,Junos PyEZ 规范化所有表键和值,这将去除所有前导和尾随空格,并将内部空格字符序列替换为单个空格。要禁用表的规范化,请包含在 normalize: False 参数列表中。
args:
normalize: False
RPC 可选参数键 (args_key)
如果 CLI 命令采用不需要显式指定选项名称或关键字的可选第一个参数,则可以使用 optional args_key 属性。在以下示例中,命令 show interfaces 将接口名称作为可选参数:
user@router> show interfaces ? Possible completions: <[Enter]> Execute this command <interface-name> Name of physical or logical interface ge-0/0/0 ge-0/0/0.0
该 args_key 属性使您能够在检索操作数据时使用此可选参数,而无需显式指定关键字或选项名称。
args_key: interface_name
如果在表定义中包含该 args_key 属性,则可以指定参数值,但在检索数据时省略选项名称。
eths = EthPortTable(dev).get('ge-0/3/0')
如果在表定义中省略 args_key 该属性,则必须显式指定选项名称(如果要在检索数据时包括此参数)。
eths = EthPortTable(dev).get(interface_name='ge-0/3/0')
表项(项)
所有操作表定义中都需要的 Table item 属性标识要从 RPC 输出中提取的数据。该 item 值是相对于标记中 <rpc-reply> 用于选择所需元素的顶级元素的 XPath 表达式。这些项将成为关联视图的参考。
以下示例显示了截断的 CLI 命令输出示例:
user@router> show interfaces media "[afgxe][et]-*" | display xml
<rpc-reply xmlns:junos="http://xml.juniper.net/junos/15.1R1/junos">
<interface-information xmlns="http://xml.juniper.net/junos/15.1R1/junos-interface" junos:style="normal">
<physical-interface>
<name>ge-0/0/0</name>
<admin-status junos:format="Enabled">up</admin-status>
<oper-status>up</oper-status>
...
</physical-interface>
<physical-interface>
<name>ge-0/0/1</name>
<admin-status junos:format="Enabled">up</admin-status>
<oper-status>up</oper-status>
...
</physical-interface>
</interface-information>
</rpc-reply>
若要从此输出中选择 <physical-interface> 元素,请包含 item 该属性并指定选择该元素的 XPath。在这种情况下, <physical-interface> 元素是顶级 <interface-information> 元素的直接子元素,值的 item XPath 表达式只是元素名称。
item: physical-interface
这些项将成为关联视图的参考。
对于相同的 RPC,不同的设备可以发出不同的输出元素。因此,项目的 XPath 可能因系统而异。该 item 属性支持使用管道 ( | ) 运算符指定隐式“或”以从多个可能的节点中进行选择。 item 当属性包含此运算符时,该 key 属性必须使用列表。例如:
UTMStatusTable:
rpc: show-utmd-status
item: //multi-routing-engine-item/utmd-status | //utmd-status
view: UTMStatusView
key:
- re-name | Null
表项键(键)
可选 key 属性是一个 XPath 表达式或 XPath 表达式列表,用于选择用于唯一标识表项的一个或多个标记,以用于不使用该 <name> 元素作为标识符的项或要使用组合键的情况。
在以下命令输出中,每个 <physical-interface> 元素都由其 <name> 子元素唯一标识:
user@router> show interfaces media "[afgxe][et]-*" | display xml
<rpc-reply>
<interface-information>
<physical-interface>
<name>ge-0/0/0</name>
...
</physical-interface>
<physical-interface>
<name>ge-0/0/1</name>
...
</physical-interface>
</interface-information>
</rpc-reply>
如果 Table item 属性选择了<physical-interface>元素,则默认情况下要将该<name>元素用作键,则可以从 Table 定义中省略key该属性。
相反,请考虑以下命令 show route brief 输出:
<rpc-reply>
<route-information>
<route-table>
...
<rt junos:style="brief">
<rt-destination>10.0.0.0/24</rt-destination>
<rt-entry>
<active-tag>*</active-tag>
<current-active/>
<last-active/>
<protocol-name>Static</protocol-name>
<preference>5</preference>
<age junos:seconds="9450374">15w4d 09:06:14</age>
...
</rt-entry>
</rt>
<rt junos:style="brief">
<rt-destination>10.0.10.0/24</rt-destination>
<rt-entry>
<active-tag>*</active-tag>
<current-active/>
<last-active/>
<protocol-name>Direct</protocol-name>
<preference>0</preference>
<age junos:seconds="9450380">15w4d 09:06:20</age>
...
</rt-entry>
</rt>
</route-table>
</route-information>
</rpc-reply>
选择route-table/rt元素时,没有相应的<name>元素来唯一标识每个路由条目。<name>当缺少标识符时,key属性可以指定哪个或哪些标记唯一标识每个项。在这种情况下,可以通过用作<rt-destination>键来唯一标识每个route-table/rt项目。
item: route-table/rt key: rt-destination
此外,从 Junos PyEZ 2.3.0 版开始,可以定义 key: Null 一个表来指示不需要密钥。在这种情况下,表和视图将数据作为简单字典返回,而不是带有键的嵌套字典。
表项可以由由单个元素或多个元素组成的键定义。单元素键使用简单的 XPath 表达式作为属性的值 key 。组合键由 XPath 表达式列表定义。请考虑以下表定义:
PicHwTable:
rpc: get-chassis-inventory
item: .//name[starts-with(.,'PIC')]/parent::*
key:
- ancestor::*[starts-with(name,'FPC')]/name
- ancestor::*[starts-with(name,'MIC')]/name
- name
view: PicHwView
此表定义的组合键可能类似于以下内容:
('FPC 2', 'MIC 0', 'PIC 0')
如果复合键引用缺少的元素,Junos PyEZ 会将键 None中的值替换为 。
('FPC 0', None, 'PIC 0')
key当属性包含竖线 ( | ) 运算符时,item该属性必须使用列表。
该 key 属性还支持竖线 ( | ) 运算符,该运算符使表能够从多个可能的节点中进行选择。该运算符使您能够使用相同的表,即使在不同系统为同一 RPC 发出不同的输出元素的情况下也是如此。例如,此处显示以供参考的 LLDPNeighborTable 可以选择 lldp-local-interface or lldp-local-port-id 元素作为其键:
---
LLDPNeighborTable:
rpc: get-lldp-neighbors-information
item: lldp-neighbor-information
key: lldp-local-interface | lldp-local-port-id
view: LLDPNeighborView
LLDPNeighborView:
fields:
local_int: lldp-local-interface | lldp-local-port-id
local_parent: lldp-local-parent-interface-name
remote_type: lldp-remote-chassis-id-subtype
remote_chassis_id: lldp-remote-chassis-id
remote_port_desc: lldp-remote-port-description
remote_sysname: lldp-remote-system-name
当 key 属性使用该 | 运算符时,RPC 回复中存在的每个键都将添加到键列表中。该运算符可用于指定隐式“or”,在不同类型的配置或版本存在不同标记名称的情况下非常有用。例如,如果 RPC 作为一个设备的标识符返回 lldp-local-interface ,而同一个 RPC 作为另一个设备的标识符返回 lldp-local-port-id ,则表会自动选择相应的键。
表视图(视图)
该 view 属性将表定义与特定视图相关联。视图使用 XPath 表达式将用户定义的字段名称映射到所选表项目中的元素。您可以自定义视图以仅从表项目中选择必要的元素。