题图由 PicsbyFran 在 Pixabay 上发布。
----------
上一篇《TTP - Text Template Parser:网工运维利器(1)》我们了解了使用 TTP 解析非结构化数据的简单方法。今天我们了解一些 TTP 的进阶操作。
我们还是使用 Cisco WLC 的 show output 作为例子。虽然这是一个小众产品,但是我觉得用来做 example 挺合适的,因为它的 output 很复杂,而且其本身并不支持 API。所以咱们这个 demo 完全是业务驱动的,并不是为了 demo 而 demo。
下面是 WLC 的 show ap auto-rf 802.11a ap_name 的输出结果。出于篇幅的限制,我把很多无用的信息都删掉了。业务需求是输出结构化数据,以便找出 AP 的同频干扰源,并为信道调整提供参考信息。
当处理完整的配置文件或者内容较多的 output 的时候,有必要将变量进行分组。
TTP 采用 XML 格式 <group></group> 作为分组语法。下面是第一个 demo 模版,将变量分成 2 组。其中 ap_info group 用来提取 AP 的基本信息;nearby group 用来提取 Nearby 信息。用变量原位替换相应位置的文本。不要改动文本前后的空格,否则会匹配失败。
利用这个模版,得到以下结构化数据:
但是我们的业务流程需要使用 AP Name 作为 key,上面的输出并不能满足要求。
我们可以在定义 TTP group name 的时候,就直接确定数据结构。模版如下:
在这份模版中,我们直接在 group name 中使用变量,并且通过 “.” 来定义数据结构。这一次的输出如下:
使用这种数据结构来处理数据就非常方便了。但还是存在一些问题:
信道利用率 “CU” 并不是一个可以直接参与计算的百分数
客户端数量 “clients” 和信号强度 “rssi” 是 str 格式,不是 int 格式
MAC 地址 “mac” 只是为了匹配方便,其实我们的业务不需要它
这份数据并没有办法体现频宽是 20MHz 还是 40MHz
我们当然可以做后期的数据清洗,但那样比较麻烦。TTP 内置了一些函数,也支持自定义函数,可以通过调用函数直接输出我们想要的结果,免去了后期的处理步骤。
在下面的模版中,我们在 <macro></macro> 代码块中定义 3 个函数:percentage_cu,str2int,check_if_40mhz 用来做数据处理。还调用了 TTP 内置的 del 函数来删除 mac 变量。
这一次的输出结果如下:
可以看到 “CU” 的格式变成了 float,“clients” 和 “rssi” 变成了 int,多了一个布尔值变量 “is_40mhz”,而 “mac” 变量已经不存在了。
这个输出可以直接拿来用,不再需要额外的数据处理。