Help us improve your experience.

Let us know what you think.

Do you have time for a two-minute survey?

 
 

为 Junos PyEZ 操作表定义用于解析非结构化输出的视图

Junos PyEZ 操作 (op) 表,用于从在 Junos 设备上执行的 CLI 命令或在给定灵活 PIC 集中器 (FPC) 上执行的 vty 命令的文本输出中提取数据。表与视图相关联, 视图用于访问表项中的字段并将其映射到用户定义的 Python 变量。通过将属性包含在 view 表定义中来将表与特定视图相关联,该定义将视图名称作为其参数。

视图将用户定义的变量映射到所选表项中的数据。视图使您能够将输出中的特定字段作为变量访问,这些变量具有可在 Python 中操作的属性。Junos PyEZ 处理将数据提取到 Python 以及任何类型的转换或数据规范化。视图中定义的键必须是有效的 Python 变量名称。

本主题讨论视图的不同组件。

视图中用于解析非结构化输出的参数摘要

Junos PyEZ 视图与表一样,使用 YAML 进行格式化。解析非结构化输出的视图可以包含许多参数, 表 1 汇总了这些参数。

表 1:用于非结构化输出的 Junos PyEZ 操作表视图中的参数

查看参数

描述

视图名称

视图的用户定义标识符。

columns

(可选)命令输出中的列标题列表。

eval

(可选)一个或多个键值对的关联数组或字典,用于将用户定义的键映射到包含数学表达式的字符串。对于数据的每次迭代,将使用 Python eval 函数计算表达式。键和计算值将添加到与该迭代对应的数据中。

exists

(可选)将用户定义的键映射到字符串的键值对的关联数组或字典。如果输出中存在该字符串,则该变量设置为 True,否则,该变量设置为 False。

fields

(可选)键值对的关联数组或字典,用于将用户定义的键映射到解析命令输出的特定部分的嵌套表的名称。

filters

(可选)在 下 columns定义的一个或多个键的列表。最后一组数据仅包括所选列中的数据。

regex

(可选)匹配所需内容的正则表达式列表。

视图名称

视图名称是用户定义的视图标识符。通过将表与特定视图相关联,可以在 view 表定义中包含属性并提供视图名称作为其参数。

下面的示例定义一个名为 的视图,view该视图ChassisFanView由表的参数引用:

您可以在视图中使用该 columns 参数来提取和分析以行和列格式设置的命令输出。

请考虑以下命令 show ospf neighbor 输出:

若要提取数据,请在视图中包含 columns 参数,并将 Python 变量名称映射到列名称。应用程序将从该列的命令输出中提取的键和值存储为给定项的字典中的键值对。

以下视图从命令输出中 show ospf neighbor 的每一列中提取数据:

在 Junos PyEZ 应用程序中检索和打印数据时,每个邻接方的数据都包含列键和相应的数据。

若要筛选数据以仅包含所选列中的数据,请在视图中包括该 filters 参数。有关详细信息,请参阅 筛选器

某些命令输出包含跨多行的列标题,例如:

若要在视图中定义多行列标题,请将列键元素设置为等于该标题每行中的单词列表。以下视图定义了上一个命令输出的列:

评估表达式 (eval)

您可以使用可选 eval 参数在表视图返回的最终数据中添加或修改键值对。该 eval 参数将键名称映射到包含由 Python eval 函数计算的数学表达式的字符串。您可以在表和视图中包含 eval 参数,并且可以 eval 定义和计算多个值。

在表中使用 eval 时,它会引用用于计算的完整数据字典,并且键和计算值将作为单个附加项添加到字典中。在视图中使用 eval 时,表达式将在数据的每次迭代时计算,并将计算值添加到该迭代的数据中。 eval 如果键名称与视图中定义的键匹配, eval 则将该键的值替换为计算值。 eval 如果键名称与视图中定义的键不匹配, eval 则会将新键和计算值添加到数据中。

表达式 eval 可以引用视图返回的 data 字典。表达式必须使用 Jinja 模板变量进行引用 data ,以便 Junos PyEZ 可以在计算表达式时将变量替换为字典。

以下示例在视图定义中使用 eval 。该 cpu 条目修改数据字典中每个项目的字段的 cpu 现有值,并且该 max 条目为数据字典中的每个项目创建新的键值对。

请考虑 vty 命令的 show threads 以下示例输出:

View 的 eval 参数修改每个 cpu 条目以省略百分号 (%)。因此,数据包含“0”而不是“0%”。此外,它还为每个项目添加一个新键 max、 及其计算值。

有关在表定义中使用的eval示例,请参阅评估表达式 (eval)。

存在

您可以在视图中使用可选 exists 参数来指示命令输出中是否存在字符串。 exists 是键值对的字典,它将用户定义的 Python 变量名称映射到要在命令输出中匹配的字符串。如果输出中存在该字符串,则该变量设置为 True。否则,变量设置为 False

show host_loopback status-summary考虑 vty 命令输出。

下表定义了 exists 用于测试命令输出是否包含 No detected wedges 字符串或 No toolkit errors 字符串:

使用表和视图在 Junos PyEZ 应用程序中测试字符串并打印结果值时,在这种情况下,这两个变量都将设置为 True

领域

命令输出可能冗长而复杂,您可能需要不同的逻辑来分析输出的不同部分。在某些情况下,您无法使用单个表和视图充分分析命令输出。若要分析此类型的输出,可以在视图中包含可选 fields 参数。 fields 是一个键值对字典,用于将用户定义的键映射到选择命令输出的特定部分的嵌套表的名称。每个嵌套表都可以引用自己的视图,该视图用于分析该表选择的数据。

show xmchip 0 pt stats考虑 vty 命令输出,其中包含两个不同的数据部分:

以下XMChipStatsView视图使用该fields参数定义两个附加表,用于分析命令输出的两个不同部分。_WANPTStatTable_FabricPTStatTable表分别从和部分Fabric PT statistics中提取WAN PT statistics数据。在这种情况下,表使用该delimiter参数来提取和拆分数据,因此它们不需要引用单独的视图。

在 Junos PyEZ 应用程序中检索和打印数据时,下 fields 定义的每个密钥都包含相应表选择和解析的数据。

再举一个例子,考虑 show ttp statistics vty 命令输出:

FPCTTPStatsView视图使用该fields参数引用多个嵌套表,这些表提取输出不同部分中的数据。每个表引用自己的视图或使用delimiter参数来分析该节中的数据。

在 Junos PyEZ 应用程序中检索和打印数据时,每个 fields 密钥都包含由相应表提取和分析的数据。

过滤 器

columns 参数从以行和列格式设置的命令输出中提取数据。在视图中包括参数 columns 时,可以选择包含该 filters 参数以筛选最终输出中包含的列数据。该 filters 参数定义在 下 columns定义的一个或多个键的列表。最后一组数据仅包括所选列中的数据。您可以在视图定义中提供默认过滤器,也可以在 Junos PyEZ 应用程序中定义或覆盖过滤器值。

show ospf neighbor考虑命令输出:

在以下视图中,参数 columns 为相应命令输出中的所有列定义键,但 filters 该参数仅包含数据字典中 和 Address State 列中的数据。

以下 Junos PyEZ 代码首次调用get()时不带任何参数,它将使用视图中定义的筛选器的默认列表检索数据。对包含参数的get()filters第二次调用将覆盖视图中定义的筛选器列表。

执行应用程序时,第一次调用 使用 get() 视图中定义的筛选器,第二次调用使用调用中定义的筛选器,这些筛选器将覆盖视图中定义的筛选器。

Regex

您可以使用视图中的可选 regex 参数来匹配和提取命令输出中的特定字段。 regex 是将键映射到正则表达式的字典。如果对应的表没有定义 item: '*',Junos PyEZ 将正则表达式组合在一起,并将结果与每行输出进行匹配。但是,如果表定义为 item: '*' 将数据提取为单个文本字符串,则 Junos PyEZ 会将每个单独的正则表达式与整个文本字符串进行匹配。

正则表达式中定义的捕获组确定从字段提取并存储在数据字典中的数据。如果定义捕获组,则数据中仅存储该组的值。否则,Junos PyEZ 将存储与完整表达式匹配的值。例如, (d+.d+) 从字符串搜索表达式中检索和存储浮点值,而 (d+).d+ 仅存储数据的整数部分。如果定义多个组,则仅存储第一个组的值。

Junos PyEZ 利用该 pyparsing 模块定义了许多内置关键字,您可以使用这些关键字来代替正则表达式。 表 2 列出了关键字、简要说明和相应的表达式,其中 pp 派生自 import pyparsing as pp

表 2:正则表达式参数关键字

关键 字

描述

表达

hex_numbers

仅包含十六进制字符的单词

hex_numbers = pp.OneOrMore(pp.Word(pp.nums, min=1))
    & pp.OneOrMore(pp.Word('abcdefABCDEF', min=1))

numbers

由整数或浮点值组成的单词

numbers = (pp.Word(pp.nums) + pp.Optional(pp.Literal('.') +
     pp.Word(pp.nums))).setParseAction(lambda i: ''.join(i))

percentage

由数字和尾随百分号 (%) 组成的单词

percentage = pp.Word(pp.nums) + pp.Literal('%')

printables

一个或多个由可打印字符组成的单词(任何非空格字符)

printables = pp.OneOrMore(pp.Word(pp.printables))

word

由字母或字母数字字符组成的单词

word = pp.Word(pp.alphanums) | pp.Word(pp.alphas)

words

word一个或多个字符串

words = (pp.OneOrMore(word)).setParseAction(lambda i: ' '.join(i))

请考虑以下命令 show icmp statistics 输出。输出的每个部分都位于特定的部分标题下,数据由数字和一个或多个单词组成。

为了解析前面的输出,主视图定义了 fields,它引用嵌套的表和视图,这些表和视图解析输出的每个部分。嵌套视图定义 regex 要与相应表提取的数据匹配的参数。

例如, _ICMPDiscardsTable 表选择命令输出中该部分下 ICMP Discards 的数据。视图 _ICMPDiscardsView 定义了两个键, valuename,它们映射到正则表达式。 value 匹配一个或多个数字,并 name 匹配一个或多个单词。由于 表未定义 item: '*',正则表达式将组合并与该部分中的每一行数据进行匹配。

表选择 _ICMPErrorsTable 命令输出中该 ICMP Errors 部分下的数据。 _ICMPErrorsView 视图定义 errorname 键,并使用内置关键字 numbers 代替 words 显式定义正则表达式。

如果表定义了 item: '*',则提取的数据被视为一个文本字符串。在这种情况下,相应视图中的每个正则表达式都与整个字符串匹配。

show ithrottle id 0考虑命令输出。

下表用于 item: '*' 将数据提取为单个字符串。视图的 regex 参数定义三个正则表达式。每个正则表达式模式都与整个字符串匹配。由于正则表达式定义捕获组,因此 Junos PyEZ 仅存储与组匹配的数据。

在 Junos PyEZ 应用程序中检索和打印数据时,数据包括三个 regex 项目,其中包含与该表达式的捕获组匹配的值。