一个使用nornir框架编写的跑脚本工具

This is an article that was created 521 days ago, and the information may have evolved or changed.

一个使用nornir框架编写的跑脚本工具。之前写过一版这个菜单式跑python脚本的工具,简直臃肿的不堪入目,后面发现需要添加改进功能真让我头大。了解nornir后,一直就想把功能移植过来,现在搞的差不多了,分享一下

在32位windows系统中无法使用本脚本,原因是有几个第三方库从某个版本开始不再开发和维护32位系统的代码,而库的依赖最低版本大于最后发布的32位版本,或者装不上,亦或装上了无法用。So……

介绍

  • 在nornir 3.3.0框架上进行功能编写
  • 使用nornir自带的并发机制,专注于功能的实现
  • nornir具有与其他开源模块的联动功能,如netboxsqlscraplinapalm等,具有强扩展性
  • main分支是在windows平台下运行的脚本
  • ubuntu-branch分支是在ubuntu server下运行的脚本(其他linux发行版,应该也可以)

测试环境

windows

  • Microsoft Windows 10 Pro 21H2
  • Visual studio code Update 1.77.3
  • Python 3.10.10
  • nornir==3.3.0

Ubuntu

  • Ubuntu 22.04.2 LTS
  • Python 3.10.6
  • nornir==3.3.0

Simulation Software

  • HCL 5.7.2
  • DeviceModel:H3C S5820V2-54QS-GE

Topology

lab_test

运行界面

脚本启动界面

01-startup

批量备份配置

02-export-conf.gif

批量修改配置

03-modify-conf

筛选–>执行

04-filter-run

获取交换机 端口-MAC地址 和 搜索MAC地址对应设备

05-get-mac-search.gif

批量snmp轮询

06-snmp

批量ssh可达性测试

07-ssh

批量ping可达性测试

08-ping

批量保存配置

09-save

查看设备清单

10-all-device

导出诊断信息和日志(TFTP)

11-diag

生成的文件

12-file-saved

文件根目录

ScreenCaputure230512235941

功能说明

  1. 批量备份配置
    • 根据加载的设备清单,读取ssh登陆信息登陆设备,执行display列中的display命令,将回显内容写入到EXPORT\当天日期\export_conf文件夹下,每个设备的回显内容分别记录在一个txt文件(格式:name + ip + 当前时间.txt),运行结果记录在EXPORT\当天日期\result_当天日期.log文件
  2. 批量修改配置
    • 根据加载的设备清单,读取ssh登陆信息登陆设备,执行config列中的config命令,将回显内容写入到EXPORT\当天日期\modify_conf文件夹下,每个设备的回显内容分别记录在一个txt文件(格式:name + ip + 当前时间.txt),运行结果记录在EXPORT\当天日期\result_当天日期.log文件
  3. 筛选–>执行
    • 选择该功能选项后,会在二级菜单显示主菜单中的1、2、6、7、8、9功能
    • 选择对应功能后进入筛选菜单
    • 筛选菜单:
      • IP地址-筛选
      • 平台-筛选
      • 设备型号-筛选
      • 区域-筛选
      • 组合筛选
  4. 获取交换机 端口-MAC地址
    • 该功能通过获取交换机MAC地址表和trunk接口信息,求差集获取到非trunk接口的MAC地址表,表格文件存储到EXPORT\当天日期\generate_table,格式为:当天日期_当前时间_MAC地址表.xlsx
    • 强烈建议在代码task.run前进行filter过滤接入交换机的nr对象
    • 运行结果记录在EXPORT\当天日期\result_当天日期.log文件
  5. 搜索MAC地址对应设备
    • 本功能依赖功能4中生成的MAC地址表,需要使用本功能先执行功能4
    • 输入的MAC地址格式任意,可以是全匹配如:4426-0f92-0d06,也可以是其中部分如:0d06 或 4426,或者任意字符(没有意义)
  6. 批量snmp轮询
    • 根据加载的设备清单,执行snmp_get操作,将获取到的结果写入到SNMP轮询结果表,表格文件存储到EXPORT\当天日期\generate_table,格式为:当天日期_当前时间_snmp轮询结果表.xlsx
    • 运行结果记录在EXPORT\当天日期\result_当天日期.log文件
  7. 批量ssh可达性测试
    • 根据加载的设备清单,读取ssh登陆信息登陆设备,以获取到设备的prompt作为依据判断ssh可达,运行结果记录在EXPORT\当天日期\result_当天日期.log文件
  8. 批量ping可达性测试
    • 根据加载的设备清单,执行ping操作,以没有异常作为依据判断ping可达,运行结果记录在EXPORT\当天日期\result_当天日期.log文件
  9. 批量保存配置
    • 根据加载的设备清单,执行netmiko_save_config操作,以没有异常作为依据判断保存成功,运行结果记录在EXPORT\当天日期\result_当天日期.log文件
  10. 显示设备清单
    • 根据加载的设备清单,列出[‘name’, ‘ip’, ‘platform’, ‘model’, ‘device_type’, ‘area’, ‘location’, ‘version’, ‘sn’]等内容
  11. 导出诊断信息和日志(TFTP)
    • 根据nr.filter(hostname=device_ip)过滤单台设备,对设备的诊断信息文件,诊断日志文件和日志文件上传到 TFTP 服务器

如何使用

下载

Github仓库地址:https://github.com/kiraster/netops_v2.0_beta

虚拟环境

由于正常运行需要安装很多第三方库,且有些库的依赖需要降级版本才能正常运行,或可能与你当前python环境会有冲突,建议在虚拟环境下运行

vscode软件举例:

  1. 代码编辑打开目录并控制台切换到代码根目录

  2. 创建虚拟环境

    1
    python -m venv venv
  3. 激活虚拟环境

    1
    .\venv\Scripts\Activate.ps1

安装 python 库

1
pip install -r requirements.txt

安装库的时候可能遇到timeout提示,检查网络;如遇报错看提示去Google

运行前说明

  1. 查看nornir.yaml文件,发现plugin: ExcelInventory,是因为本代码使用了【nornir_table_inventory 插件】

  2. excel_file: "inventory/inventory_unprotected.xlsx",这行配置指示了需要的excel文件,注意看文件名(unprotected),这是一个不带保护密码的excel文件,具体说明见README文件

  3. inventory文件夹下还有一个inventory_protected.xlsx文件,这是一个有保护密码的文件

  4. inventory_protected.xlsx文件需要自行制作并设置一个保护密码,以下是本机环境中的格式,可参照插件作者的示例增删改

    ScreenCaputure230513003040

  5. inventory_protected.xlsx文件中dispalyconfig列的内容是查看命令和配置命令,每个命令之间使用逗号,分隔;如在单元格内使用手动换行(换行符\n)需要修改代码中cmds = task.host.get('display').split(',')cmds = task.host.get('config').split(',')split(',')

  6. 可以根据实际情况修改num_workers并发进程数和日志记录

  7. 如修改inventory路径和excel文件名,自行更新代码中对应的路径变量

代码执行逻辑

ScreenCaputure230513004510

最后

  • 总有不足之处,可以提,但不一定改
  • 我总觉得使用display和show等命令去采集设备信息不是一个很妥的方式,特别是配合textfsm形成列表套字典再写入表格;且不说速度慢,每一个命令对应一个模板导致代码结构不简洁和繁多,每个厂商的命令也不尽相同,有时同厂商同命令的回显也有差异导致要修改模板;同一源IP地址过度使用ssh登陆可能会被安全设备记录异常行为,特别是设备不可达或密码错会被识别为爆破攻击。
  • 采集就由专业的snmp去干就好,速度快。很多公共的OID一轮询就得出结果。实在不济可以弄得专业点写个针对厂商和型号的snmp轮询模板(我不会),再专业点可以去下载设备的MIB文件鼓捣鼓捣(你来),很多厂商的网管平台号称可以纳管友商设备靠的不就是这个
  • 对于批量修改配置,我的看法是慎用,特别是涉及控制层面的配置;如果要使用尽量在风险可控的前提下使用,如改个设备名称,添加描述,设备开局的批量调试等等;如确实要跑脚本建议先验证再验证,先小范围跑一两台设备,重要设备就手敲;随时做好提桶跑路。
  • 现网运行业务的时候不要乱搞,看过一个运维的采购文件,中断一次扣多少钱,多长时间内不能恢复又扣钱,看的胆战心惊的,这很大程度上让我理解了为什么一个看似不大规模的运维项目最终报价高的离谱,可能也许包含了一部分这些风险
  • 欢乐的时光总是特别短,又到时候讲byebye
  • 欢迎“来电”来函探讨。

20230513 更新了此文章内容

电脑开关机邮件提醒 H3C自动配置(HTTP Python方式)
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×