定义用于解析结构化输出的 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 rpc
Junos OS CLI 中的命令之后附加选项。执行 Junos PyEZ
Device
实例display_xml_rpc('command', format='text')
方法在 Junos XML API 资源管理器中查找命令和相应的标记
RPC 默认参数(参数)
可选 args
属性定义 RPC 的默认命令选项和参数。这些键值对列在 下 args
缩进。当您在脚本中调用 get()
该方法并且不提供重写该默认值的参数时,将使用默认参数。
如果选项只是一个不需要特定值的标志,则可以通过在表定义中将True
选项值设置为,将其包含在参数列表中。例如,命令映射到show interfaces media
get-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 表达式将用户定义的字段名称映射到所选表项目中的元素。您可以自定义视图以仅从表项目中选择必要的元素。