在此页面上
定义解析结构化输出的 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-present
ifdf-running
元素的值。
EthPortView: groups: flags: if-device-flags fields_flags: present: ifdf-present running: ifdf-running
无论您是使用字段还是字段组,都可使用用户定义的字段名称,以相同的方式访问 Junos PyEZ 脚本中的值。