在此页面上
定义解析结构化输出的 Junos PyEZ 操作表的视图
用于结构化输出的 Junos PyEZ 操作 (op) 表从在 Junos 设备上执行的 RPC 的 XML 输出中选择特定数据。一张表格与一个视图相关联,该视图用于访问表中的字段并将其映射到用户定义的 Python 变量。您将表与特定视图相关联,方法是将属性包括 view 在表定义中,该定义将 View 名称作为其论点。
视图将用户定义的变量映射到所选表项中的 XML 元素。视图允许您以变量身份访问输出中的特定字段,并具有可在 Python 中操纵的属性。Junos PyEZ 处理将数据提取到 Python 以及任何类型的转换或数据规范化。视图中定义的密钥必须是有效的 Python 可变名称。
Junos PyEZ 视图(如表)使用 YAML 格式化。解析结构输出的视图可以包含许多参数,这些参数汇总在 表 1 中。
查看参数名称 |
视图参数 |
描述 |
|---|---|---|
查看名称 |
– |
视图的用户定义标识符。 |
字段物品 |
|
密钥值对的关联阵列或字典,用于将用户定义的字段名称映射到 XPath 表达式,在表项中选择元素。字段名称必须是有效的 Python 可变名称。 |
字段组 |
|
密钥值对的关联阵列或字典,用于将用户定义的字段名称映射到 XPath 表达式,在表项中选择元素。XPath 表达式相对于相应组参数设置的上下文。字段名称必须是有效的 Python 可变名称。 |
组 |
|
密钥值对的关联阵列或字典,用于将用户定义的组名称映射到 XPath 表达式(相对于表项目上下文),用于为该组中的字段设置 XPath 上下文。 |
请考虑以下 Junos PyEZ 操作表和视图,此表包含在 Junos PyEZ 分配中。此表提取目标设备上的以太网接口的操作状态信息。
---
EthPortTable:
rpc: get-interface-information
args:
media: True
interface_name: '[afgxe][et]-*'
args_key: interface_name
item: physical-interface
view: EthPortView
EthPortView:
groups:
mac_stats: ethernet-mac-statistics
flags: if-device-flags
fields:
oper: oper-status
admin: admin-status
description: description
mtu: { mtu : int }
link_mode: link-mode
macaddr: current-physical-address
fields_mac_stats:
rx_bytes: input-bytes
rx_packets: input-packets
tx_bytes: output-bytes
tx_packets: output-packets
fields_flags:
running: { ifdf-running: flag }
present: { ifdf-present: flag }
以下部分讨论视图的不同组件:
查看名称
View 名称是用户定义的 View 标识符。您将表与特定视图相关联, view 方法是将属性包括在表定义中,并提供 View 名称作为其论点。例如:
--- EthPortTable: # Table definition view: EthPortView EthPortView: # View definition
字段(字段)
您可自定义视图,以便它们仅参考所选表项中的必要元素。为此, fields 您包括属性和关联阵列,其中包含用户定义字段名称与 XPath 表达式的映射,从表项中选择所需元素。字段名称必须是有效的 Python 可变名称。XPath 表达式相对于表项上下文。
考虑以下 RPC 输出示例:
<rpc-reply>
<interface-information>
<physical-interface>
<name>ge-0/3/0</name>
<admin-status junos:format="Enabled">up</admin-status>
<oper-status>down</oper-status>
<local-index>135</local-index>
<snmp-index>530</snmp-index>
<link-level-type>Ethernet</link-level-type>
<mtu>1514</mtu>
...
</physical-interface>
</interface-information>
</rpc-reply>
如果表 item 参数从输出中选择 <physical-interface> 元素,则视图定义中每个字段的 XPath 表达式相对于该上下文。以下视图定义将每个用户定义的字段名称映射到该元素的 <physical-interface> 一个子元素:
EthPortView:
fields:
oper: oper-status
admin: admin-status
mtu: { mtu : int }
在 Python 脚本中,您可以访问视图项目作为可变属性。默认情况下,每个查看项目都有一个属性,该属性引用唯一 name 标识该项的密钥。
from jnpr.junos import Device
from jnpr.junos.op.ethport import EthPortTable
with Device(host='router.example.com') as dev:
eths = EthPortTable(dev)
eths.get()
for item in eths:
print (item.name)
print (item.oper)
print (item.admin)
print (item.mtu)
字段格式用于确定字段值的类型。默认情况下,字段值作为字符串存储。您可以为字段映射中的字段值指定不同类型。以下示例定义了要整数的元素的价值 mtu :
EthPortView:
fields:
mtu: { mtu : int }
在 RPC 输出中,某些 Junos XML 元素只是充当标记的空元素。您可以显式地表示字段是现场映射中的一面标志。如果输出中存在该元素,并且如果没有元素,则标志的字段项目值是真实的。以下示例将元素 ifdf-running 定义为标志:
EthPortView:
fields:
mtu: { mtu : int }
running: { if-device-flags/ifdf-running : flag }
您还可以使用以下语法将字段项目值设置为布尔语法:
fieldname: { element-name: (True | False)=regex(expression) }
该元素的价值根据传递给的正则表达式进行 regex()评估。如果元素的值与表达式匹配,则字段项目值将设置为以格式定义的布尔。在以下示例中 oper_status_down ,如果元素的 oper-status 值包含“down”,则字段设置为 True:
oper_status_down: { oper-status: True=regex(down) }
您还可以使用更复杂的正则表达式并与多个值匹配。如果元素中的 rt-destination 地址以“198.51”开头,则以下字段项目设置为 True:
dc1_route: { rt-destination: True=regex(^198\.51\.) }
如果 no-refresh 元素在正则表达式中包含任一值,则以下字段项目设置为 True。
no_refresh: { no-refresh: 'True=regex(Session ID: 0x0|no-refresh)' }
组(组)和字段组 (fields_)
组提供快捷键方法,用于在表项中的特定节点集中选择和参考元素。
在以下 RPC 输出中 <if-device-flags> ,该元素包含多个子元件,这些元件对应于 CLI 输出中的字段中 Device flags 显示的值:
<rpc-reply>
<interface-information>
<physical-interface>
<name>ge-0/3/0</name>
...
<if-device-flags>
<ifdf-present/>
<ifdf-running/>
</if-device-flags>
...
</physical-interface>
</interface-information>
</rpc-reply>
在 View 定义中,您可以使用 fields 属性来访问儿童元素,方法是提供与所选表项目相关的每个元素的完整 XPath 表达式。例如,如果 EthPortTable 定义选择 <physical-interface> 项目,则字段项目映射将使用以下 XPath 表达式:
EthPortView:
fields:
present: if-device-flags/ifdf-present
running: if-device-flags/ifdf-running
或者,您可以创建一个组,将上下文设置到元素, <if-device-flags> 然后定义仅提供相对于该上下文的 XPath 表达式的字段组项目。您可以在 View 定义中定义任意数量的组。
要创建组,请将属性包括在 groups 一起,并将用户定义的组名称映射到 XPath 表达式,以定义新上下文。然后定义一个字段组,其名称后面是 fields_ 组名称。字段组是一个关联阵列,包含将用户定义的字段名称映射到 XPath 表达式,而 XPath 表达式现在相对于内部 groups设置的上下文。字段名称必须是有效的 Python 可变名称。
以下示例定义组flags和相应的字段组fields_flags。该flags组将上下文设置为physical-interface/if-device-flags层次结构级别,present并且running和字段分别访问和ifdf-presentifdf-running元素的值。
EthPortView:
groups:
flags: if-device-flags
fields_flags:
present: ifdf-present
running: ifdf-running
无论您是使用字段还是字段组,都可使用用户定义的字段名称,以相同的方式访问 Junos PyEZ 脚本中的值。