使用 Junos PyEZ 操作表和视图分析结构化输出
结构化输出的 Junos PyEZ 操作 (op) 表从在 Junos 设备上执行的 RPC 的 XML 输出中提取特定数据。将表定义加载或导入到 Python 模块中后,可以检索表项目并提取和操作数据。
要从特定设备检索信息,必须创建一个表实例,并将其与 Device 表示目标设备的对象相关联。例如:
from jnpr.junos import Device
from jnpr.junos.op.ethport import EthPortTable
with Device(host='router.example.com') as dev:
eths = EthPortTable(dev)
以下部分将讨论如何检索和处理数据:
检索表项目
Table item 属性确定从操作命令输出中提取哪些项目。例如,此处包含的 Junos PyEZ EthPortTable 定义(供参考)默认执行 show interfaces "[afgxe][et]-*" media 命令并从输出中提取 physical-interface 项目。
---
EthPortTable:
rpc: get-interface-information
args:
media: True
interface_name: '[afgxe][et]-*'
args_key: interface_name
item: physical-interface
view: EthPortView
通过调用 get() 该方法并提供所需的任何参数,您可以在 Python 脚本中检索表项目。如果表定义在 args 属性中包含默认参数,则执行的 RPC 会在您调用 get() 时自动包含这些参数,除非您在参数列表中覆盖这些参数。
要检索所有表项,请使用空参数列表调用 get() 方法。
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()
您还可以通过将命令选项作为参数 get() 传递给方法来检索特定的表项目。如果命令选项为不带值的标志,则参数列表中将选项设置为等于 True。否则,请将参数和所需值作为键值对包含在参数列表中。您可以查看 Junos CLI 中操作命令的可能参数。
默认情况下,EthPortTable 会返回名称与表达式 "[afgxe][et]-*"匹配的以太网接口的信息。要仅检索 ge-0/3/0 接口的 Table 项,请将添加 interface_name='ge-0/3/0' 作为参数添加 get()。
eths = EthPortTable(dev)
eths.get(interface_name='ge-0/3/0')
如果 Junos OS 命令行界面 (CLI) 中的选项名称为连字符,则必须将名称中的任何短划线更改为下划线。但是,参数值是一个字符串,因此可以包含连字符。
如果 CLI 命令采用的可选第一个参数不需要显式指定选项名称或关键字,则只要 Table args_key 属性引用了该参数,则可以在方法参数列表中省略选项名称get()。在以下示例中,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
EthPortTable 定义 args_key 属性将可选参数 interface_name定义为,使您能够使用参数,而无需在 get() 方法参数列表中显式指定选项名称。
eths = EthPortTable(dev)
eths.get('ge-0/3/0')
默认情况下,Junos PyEZ 会规范所有操作表键和值,这会去除所有前导空格和尾部空格,并将内部空格字符序列替换为单个空格。要禁用规范化,请 normalize=False 作为方法参数 get() 添加。
eths = EthPortTable(dev)
eths.get(interface_name='ge-0/3/0', normalize=False)
访问表项目
检索表项目后,您可以将它们视为 Python 字典,这使您能够使用标准 Python 库中的方法来访问和操作这些项目。
要查看与表项名称对应的字典密钥列表,请调用 keys() 该方法。
eths = EthPortTable(dev).get(interface_name='ge-0/3/0')
print (eths.keys())
在本案例中,只有一个密钥。
['ge-0/3/0']
您可以使用 Python in 运算符验证“表”项中是否存在特定密钥。
if 'ge-0/3/0' in eths:
要查看与每个键关联的字段或值列表,请调用 values() 该方法。此方法 values() 将返回一个元组列表,其中为每个在视图中定义的字段都带有名称-值对。
print (eths.values())
[[('oper', 'down'), ('rx_packets', '0'), ('macaddr', '00:00:5E:00:53:01'), ('description', None), ('rx_bytes', '0'), ('admin', 'up'), ('mtu', 1514), ('running', True), ('link_mode', None), ('tx_bytes', '0'), ('tx_packets', '0'), ('present', True)]]
要查看完整的项列表,包括密钥和值,请调用 items() 方法。
print (eths.items())
[('ge-0/3/0', [('oper', 'down'), ('rx_packets', '0'), ('macaddr', '00:00:5E:00:53:01'), ('description', None), ('rx_bytes', '0'), ('admin', 'up'), ('mtu', 1514), ('running', True), ('link_mode', None), ('tx_bytes', '0'), ('tx_packets', '0'), ('present', True)])]
如何通过表进行迭代
表支持迭代,使您能够循环遍历每个 Table 项,其方式与遍历列表或字典的方式相同。这使得快速格式化和打印所需字段变得轻而易举。
模块中包含的 jnpr.junos.op EthPortTable 定义将执行 show interfaces "[afgxe][et]-*" media 命令并从输出中提取 physical-interface 项目。以下代码将遍历 physical-interface 这些项目,并打印每个以太网端口的名称和操作状态:
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 port in eths:
print ("{}: {}".format(port.name, port.oper))
在 oper EthPortView 中定义的字段与输出中元素的值 oper-status 相对应。EthPortView 定义不定义 name 字段。默认情况下,每个视图项目都有一个 name 属性,该属性引用用于唯一标识该项目的密钥。
输出包括接口名称和操作状态。
ge-0/3/0: up ge-0/3/1: up ge-0/3/2: up ge-0/3/3: up