查看: 131|回复: 1

《网络工程师的Python之路》(net_inspect实验2,配合ntc ...

[复制链接]

5

主题

9

帖子

19

积分

新手上路

Rank: 1

积分
19
发表于 2022-12-4 19:59:25 | 显示全部楼层 |阅读模式
大家好!我又来了!上篇我们已经对net_inspect轮子进行了初探,安排练习对回显成功进行了解析。这篇我们再继续推进一点。net_inspect是一个国内网工界自己开发的开源轮子,赞一个!此外,作者 @Elin 还开发了ntc_templates分仓ntc_templates_elinpf,旨在更好地适配国内厂商设备,同样也是一个国产轮子。这篇我们就一起来看看net_inspect配合ntc_templates_elinpf使用。
〇、参考资料

本专栏简介及目录入口,如果你不知道从何读起,建议从这篇《目录》开始,链接如下:
@弈心 大神教学文章、视频汇总,链接如下:
Net_inspect 模块代码已在github仓库发布,提供了正式的交流渠道,如提Issues等。
Net_inspect 模块作者 @Elin 自己也在知乎上撰写了该模块使用教程,链接如下:
一、虚拟环境搭建

1.1 为何虚拟环境

我们顺着@Elin 的net_inspect模块手册往下看,解析插件parse_plugin 用到了ntc_templates_elinpf模块。 这个模块同样是@Elin 开发与维护,为ntc-templates分仓,主要是为了更好地支持国内厂商设备的TextFSM解析。 关于ntc_templates_elinpf模块的官方资料见如下。


1.2 虚拟环境搭建

文档手册有这么一句表述,需要先卸载ntc_templates,再安装ntc_templates_elinpf。 我们如果不想卸载原先的ntc_templates的话,此时Python虚拟环境即可派上用场了。 关于Python虚拟环境的操作,可参考如下文章:
python -m venv venv_net_inspect     # 创建虚拟环境

venv_net_inspect\Scripts\activate   # 激活虚拟环境

如果对Pycharm情有独钟的话,可以联动Pycharm,这里我继续“朴实无华”地保持CMD和IDLE操作。
1.3 安装相应模块

pip freeze  # 安装前可以先检查一下
pip install net_inspect -U         # -U 表示更新到最新的发布版本
pip install ntc_templates_elinpf   # 经观察,安装install net_inspect的过程会把ntc_templates_elinpf一并安装

net_inspect模块的更新频率还是比较高的,也说明了开发者目前比较活跃,大家要多用起来哈。在我写作本文的时候,他已从1.3.4更新至1.4.0 。
(venv_net_inspect) E:\>pip show net_inspect
Name: net-inspect
Version: 1.4.0
Summary: 基于已收集的网络设备信息进行的结构化数据分析框架
Home-page: https://github.com/Elinpf/net_inspect
Author: Elin
Author-email: 365433079@qq.com
License: Apache-2.0
Location: e:\venv_net_inspect\lib\site-packages
Requires: loguru, ntc_templates_elinpf, rich, rich_typer, textfsm
Required-by:

(venv_net_inspect) E:\>好滴,此时你拥有一个用于实验(或生产)的net_inspect专属虚拟环境。该环境与Python主环境和其它虚拟环境相互隔离,互不影响。


我们也可以到这个虚拟环境的文件夹中,浏览一下目录结构,此时的ntc_templates文件夹中已有不少国内厂商模板。
搭建后,我们可以把实验1的脚本拷贝过来跑一下。


lab1使用的是1.3.4,现在已经升级到1.4.0了,模块做了部分调整,此时我们收到提示,可以按照提示修改,把我们自己写代码修改一下。
net.run(path='log')net.run(input_path='log')
修改后再运行实验1的Python脚本就不会再报红字提示了。至此,我们的实验环境部署暂告一段落,继续推进!
二、配合 ntc_templates_elinpf 模板

我们跟着手册走到【进阶教程】,我们依然要查看display clock这个信息,这个在ntc_templates_elinpf 模板库中是有的。


那我们自然就可以直接调用,这里需要注意一下,官网手册在这里有“假设”字眼,后面其实是在描述,如果没有,我们可以自己弄这个模板。现在对应路径上有这个模板,我们就可以直接用。
2.1 实验文件夹



2.2 回显文本 SW-wgsy.log

我们准备一份回显文本,内容如下:
<SW-wgsy>display clock
2022-10-5 16:01:11+08:00
Tuesday
Time Zone(BeiJing) : UTC+08:00
<SW-wgsy>2.3 Python 脚本 lab2.py

我们把示例脚本再次简化,只保留华为的即可。
from net_inspect import NetInspect, vendor

net = NetInspect()
net.set_plugins(input_plugin='console')
net.run(input_path='log')    # 1.4.0 版本的新参数形式。

print('total devices:', len(net.cluster.devices))

for device in net.cluster.devices:
    info = device.info
    clock = ''
    if device.vendor == vendor.Huawei:
        with device.search_cmd('display clock') as cmd:
            if cmd.parse_result:
                ps = cmd.parse_result[0]
                clock = f"{ps['year']}-{ps['month']}-{ps['day']} {ps['time']}"
    print(' | '.join([info.hostname, clock]))2.4 运行 Python 脚本

我们运行一下脚本lab2.py看看。


很遗憾,并没有出现官网示例的日期和时间内容。
2.5 调测 Python 脚本

我们在lab2.py加多一个print。(当然,我并不是马上就知道这么加的,我也是试来试去。)
...
for device in net.cluster.devices:
    info = device.info
    print(info) # 增加这一句
    clock = ''
...再次运行!DefaultVendor字眼出来了。


以上表明net_inspect在回显文件的内容中并不能判断出设备厂商,所以出现了DefaultVendor ,于是后面代码if device.vendor == vendor.Huawei: 便不再运行了。因此,这样我们还不能得到期望结果。
2.6 修改回显文本 SW-wgsy.log

结合lab1,我们可以用display version来判断设备厂商。于是我们干脆把lab1的回显也放进来。
[SW-wgsy]DIS VER
Huawei Versatile Routing Platform Software
VRP (R) software, Version 5.150 (S5300 V200R005C00SPC500)
Copyright (C) 2000-2015 HUAWEI TECH CO., LTD
Quidway S5328C-EI Routing Switch uptime is 0 week, 6 days, 16 hours, 13 minutes

<SW-wgsy>display clock
2022-10-5 16:01:11+08:00
Tuesday
Time Zone(BeiJing) : UTC+08:00
<SW-wgsy>运行一下lab2.py。


成功解析,至此!复现了示例代码的效果。
三、配合本地textFSM模板

3.1 假设 ntc_templates_elinpf 中没对应模板

回到官网手册,现在假设假设解设ntc_templates_elinpf中没有模板,来个本地的textFSM模板仓库。怎么假设呢?我们就去对应文件夹中把这个文件删掉即可!我们把huawei_vrp_display_clock.textfsm这个文件剪切走,不要保留在\site-packages\ntc_templates\templates文件夹中。 为了等下方便,可以把它暂时放在其它路径保存好!


此时在再运行lab2.py就得不到解析结果了!请自行尝试。
3.2 准备本地 TextFSM 模板

原文这么说“要解决ntc_templates_elinpf中没有模板的问题,我们可以自己写一个本地的textFSM模板仓库,然后调用。”
3.3 实验文件夹

文件目录依然还有点复杂,我们再次精简成只有华为设备即可。
├── local_templates
│   ├── huawei_vrp_display_clock.textfsm
│   ├── index



3.4 回显文本 SW-wgsy.log 和 index 文件

与2.6步骤保持一致。
[SW-wgsy]DIS VER
Huawei Versatile Routing Platform Software
VRP (R) software, Version 5.150 (S5300 V200R005C00SPC500)
Copyright (C) 2000-2015 HUAWEI TECH CO., LTD
Quidway S5328C-EI Routing Switch uptime is 0 week, 6 days, 16 hours, 13 minutes

<SW-wgsy>display clock
2022-10-5 16:01:11+08:00
Tuesday
Time Zone(BeiJing) : UTC+08:00
<SW-wgsy>index文件可参考\site-packages\ntc_templates\templates文件夹中的index文件内容。
Template, Hostname, Platform, Command
huawei_vrp_display_clock.textfsm, .*, huawei_vrp, dis[[play]] clo[[ck]]3.5 Python 脚本 lab2.py

加多一句net.set_external_templates('local_templates'),路径可自定义。
from net_inspect import NetInspect, vendor

net = NetInspect()
net.set_plugins(input_plugin='console')
net.set_external_templates('local_templates')  # 调用本地模板库
net.run(input_path='log')    # 1.4.0 版本的新参数形式。

print('total devices:', len(net.cluster.devices))

for device in net.cluster.devices:
    info = device.info
    # print(info)   # 此处注释掉
    clock = ''
    if device.vendor == vendor.Huawei:
        with device.search_cmd('display clock') as cmd:
            if cmd.parse_result:
                ps = cmd.parse_result[0]
                clock = f"{ps['year']}-{ps['month']}-{ps['day']} {ps['time']}"
    print(' | '.join([info.hostname, clock]))3.6 运行 Python 脚本



四、本文总结

ntc_templates_elinpf是ntc_templates的一个分仓,其使用的模块目录结构与ntc_templates是完全一致的。 这种情况下,为了兼顾原来的ntc_templates使用,虚拟环境就自然派上用场了。有时候,学习和实践就是这么巧,我在上篇文章写虚拟环境的时候,完全没想到这篇文章就用起来了。有意思!动起来,很多东西很奇妙!

我读过的书、用过的物(持续更新)
感谢阅读,欢迎关注点赞收藏评论交流。
发布2022年10月于广东汕头
更新2022年10月于广东汕头
回复

使用道具 举报

5

主题

10

帖子

20

积分

新手上路

Rank: 1

积分
20
发表于 2022-12-4 19:59:33 | 显示全部楼层
感谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表