版权声明:我已加入“维权骑士”(http://rightknights.com)的版权保护计划,所有知乎专栏“网路行者”下的文章均为我本人(知乎ID:弈心)原创,未经允许不得转载。

如果你喜欢我的文章,请关注我的知乎专栏“网路行者”https://zhuanlan.zhihu.com/c_126268929, 里面有更多像本文一样深度讲解计算机网络和Python网络运维自动化技术的优质文章。


有两个多月没发文章了,疫情期间在国内生活和远程工作难免有些懈怠了,还好最近回到了沙特逐渐找回了状态,《网络工程师的Python之路》系列文章将继续写下去,废话不多说下面进入正文。


在日常的网络运维工作中,对网络设备的配置做备份、知道网络设备的配置被做了哪些改动(安全审计)是一个网工最基本的工作,能够实现这些操作的NMS软件很多,但并不是每家公司都有能力和预算来购买和布置这些NMS软件,有时候需要我们自己动手造轮子。使用Python对网络设备的配置做自动备份的方法有很多,我在之前的专栏文章里已经有多次提到,这里不再赘述,今天主要讲下如何使用difflib这个Python内置的模块来实现对每天备份的网络配置做比较,找出其中的配置变化,并通过另外两个Python内置的模块:smtplib和email来将报告发送至我们指定的Gmail邮箱中。

首先简单介绍下difflib以及在脚本中如何使用它的整体思路:

Difflib是Python中内置的模块,功能强大也很复杂。我们可以借助它其中的ndiff()函数来对两个字符串列表(注意是列表)里的内容做比较,进而找出它们之间的差异。ndiff()返回的值是一个differ形式的生成器(generator),对我们网工来说,我们可以将交换机昨天和今天备份好的配置文件分别用open()函数打开,然后调用readlines()将两个配置文件里的文本内容转化为字符串列表,然后对它们使用difflib.ndiff()即可找出它们之间的差异,然后用list()函数将ndiff()返回的generator转换成列表然后再配合for循环遍历该列表里的内容,将它们一一写入另外一个用作报告的文本文件中即可。

在使用difflib对交换机配置文件做对比时,有四种情况是需要我们注意的:

  1. 昨天(或之前)的某个已有的配置在今天的配置中被删除了
  2. 昨天(或之前)的某个没有的配置在今天的配置中被添加了
  3. 昨天(或之前)的某个配置在今天的配置中被改动了(字符长度没有变或者变短了)
  4. 昨天(或之前)的某个配置在今天的配置中被改动了(字符长度变长了)

下面一一举例说明:

  1. 昨天(或之前)的某个已有的配置在今天的配置中被删除了

比如说之前交换机里配置了一个叫做python,特权级别为15,密码为123的用户名:

username python privilege 15 password 0 123

昨天有人在交换机里输入了no username python将该用户名删除了,那么在我们调用difflib.ndiff()对昨天和今天的配置文件做对比后生成的报告中,该变化会被ndiff()显示如下(注意前面的减号“-”以及“-”后面的空格

- username python privilege 15 password 0 123

2. 昨天(或之前)的某个没有的配置在今天的配置中被添加了

比如说我们之前在交换机的Gi0/0端口下面并没有配置duplex full:

interface GigabitEthernet0/0no switchportip address 10.1.1.1 255.255.255.0

昨天有人在该端口下添加了duplex full这条命令,那么在我们调用difflib.ndiff()对昨天和今天的配置文件做对比后生成的报告中,该变化会被ndiff()显示如下(注意前面的加号“+”以及“+”后面的空格

interface GigabitEthernet0/0no switchport+ duplex fullip address 10.1.1.1 255.255.255.0

3. 昨天(或之前)的某个配置在今天的配置中被改动了(字符长度没有变或者变短了)

假设我们之前交换机的Gi0/1端口下面的IP地址为100.100.100.100:

interface GigabitEthernet0/1no switchportip address 100.100.100.100 255.255.255.0

昨天有人将该端口的IP改为了100.100.100.199(字符长度没有改变),那么在我们调用difflib.ndiff()对昨天和今天的配置文件做对比后生成的报告中,该变化会被ndiff()显示如下(注意旧配置前的减号“-”和下面的问号“?”,以及新配置前的加号“+”和下面的问号“?”,问号后面指示配置具体改变位置的“^”符号不是我们脚本代码需要关心的

- ip address 100.100.100.100 255.255.255.255?                         ^^+ ip address 100.100.100.199 255.255.255.255?

如果昨天有人将Gi0/1的IP地址改为了100.100.100.1,(字符长度变短了),那么在我们调用difflib.ndiff()对昨天和今天的配置文件做对比后生成的报告中,该变化会被ndiff()显示如下(同样注意旧配置前的减号“-”和下面的问号“?”,以及新配置前的加号“+”和下面的问号“?”

- ip address 100.100.100.100 255.255.255.255?                         ^^+ ip address 100.100.100.1 255.255.255.255?                        ^

4. 昨天(或之前)的某个配置在今天的配置中被改动了(字符长度变长了)

假设我们之前交换机的Gi0/0端口下面的IP地址为10.1.1.1:

interface GigabitEthernet0/0no switchportip address 10.1.1.1 255.255.255.0

昨天有人将该端口的IP改为了10.1.1.100(字符长度变长了),那么在我们调用difflib.ndiff()对昨天和今天的配置文件做对比后生成的报告中,该变化会被ndiff()显示如下(注意旧配置前的减号“-”以及新配置前的加号“+”和下面的问号“?”,问号后面指示配置具体改变位置的“++”符号不是我们脚本代码需要关心的

- ip add 192.168.1.1 255.255.255.0+ ip add 192.168.1.100 255.255.255.0?                   ++


知道了difflib的大体用法后,下面进入实验环节:

实验拓扑和初始配置:

局域网IP地址段:192.168.2.0 /24

运行Python的客户端: 192.168.2.1

Layer3Switch-1: 192.168.2.11

Layer3Switch-2: 192.168.2.12

Layer3Switch-3: 192.168.2.13

Layer3Switch-4: 192.168.2.14

Layer3Switch-5: 192.168.2.15

后文中五个交换机分别简称为SW1,SW2,SW3,SW4和SW5。

所有交换机已经预配好了SSH,用户名: python 密码:123,并且客户端主机上已经保存了5个交换机昨天的配置(2020-09-06),另外还有一个ip_list.txt文件保存着5个交换机的IP地址。

实验目的:

使用Python登录所有交换机,将它们今天的show run配置(2020-09-07)备份,然后与昨天的配置做对比,将结果报告发到gmail邮箱中。

因为是实验环境,为了看到实验效果,我们这里会手动更改SW1和SW2的部分配置,SW3, SW4, SW5的配置则不作任何改变。

代码如下:

#coding=utf-8

代码整体没有太多好讲的,读过我《网络工程师的Python之路》一书的读者应该能做到无障碍理解全部代码内容。这里只部分讲下需要注意的地方:

  • 因为使用的是Python 3,所以在用Paramiko时,在回显内容output = command.recv(65535)后面加了.decode("ascii"),
  • datetime是Python自带的模块,我们可以调用它的datetime.date.today().isoformat()来以yyyy-mm-dd的格式来显示今天的日期,比如2020-09-07,注意datetime.date.today().isoformat()返回值的类型为字符串。
  • 如果要显示昨天的日期,可以使用(datetime.date.today() - datetime.timedelta(days=1)).isoformat(),这个有助于Python读取昨天的配置文件。
  • 关于下面这段代码,这里我们将今天的配置文件赋值给变量new_file,将昨天的配置文件赋值给变量old_file。将用Paramiko得到的交换机回显内容(也就是交换机的show run配置)通过write()函数写入进new_file,随后关闭new_file(不然刚才写入的文本内容不会被保存)。然后再次打开new_file,调用difflib.ndiff()对old_file.readlines()和new_file.readlines()做对比(注意昨天的配置文件(old_file)要写在difflib.ndiff()里的左边,今天的配置文件(new_file)要写在右边),将返回的值以列表的形式赋值给函数diff。
with 

  • 下面这段代码中我们结合之前对difflib中四种情况的讲解应该很容易理解,这里就不详细解释了。
try

  • 然后我们将报告提炼,汇入进最终报告(变量名为master_report),master_report里的内容将作为我们email的内容部分发给收件者(也就是你自己或你同事和老板)。
with 

  • 最后面发email部分的代码可以根据自己的情况更改 server.login('username', 'password'),username对应你的gmail邮箱地址,password对应你的邮箱密码。

下面我们将SW1和SW2的配置分别做如下五个改动:

a. 在SW1上将已有的vlan 200和vlan 300拿掉:

b. 在SW1的line vty 0 4下面添加配置transport output ssh

c. 在SW2上将已有的name-server从8.8.8.8改为8.8.6.6

d. 在SW2上将已有的enable密码从123改为12

e. 在SW2上将hostname从S2改为S222

做完上面的配置后开始运行代码,效果如下:

可以发现此时多了一个master_report_2020-09-07的文件,查看其内容:

最后登录GMAIL,查看邮箱:

注意:如果在代码执行过程中遇到下面错误,表示你的GMAIL邮箱的“Less secure app access”是关闭的,需要将其打开才能让Python访问你的GMAIL账号。

cisco 模拟器安装及交换机的基本配置实验心得_网络工程师的Python之路 -- 自动监测网络配置变化...相关推荐

  1. cisco 模拟器安装及交换机的基本配置实验心得_「分享」7个必看的Cisco实验

    1.修改cisco 路由器的名称及路由器密码命令操作 实验要求: 1.路由器名:cisconet 2.设置password为cisconet,secret为cisconet,vty为cisconet, ...

  2. cisco 模拟器安装及交换机的基本配置实验心得_看完这份1113页的TCP/IP协议+路由与交换机,成功上岸字节跳动...

    TCP是一个巨复杂的协议,因为它要解决很多问题,而这些问题又带出了很多子问题和阴暗面.所以学习TCP本身是个比较痛苦的过程,但对于学习的过程却能让人有很多收获. 之所以想写这篇文章,目的有三个: 一个 ...

  3. cisco 模拟器安装及交换机的基本配置实验心得_软考网络工程师级配置题总结 | 交换机配置、路由器配置、广域网接入配置、L2TP配置、IPSec配置、PIX防火墙配置...

    软考网络工程师级配置题总结 一. 交换机配置 1. 交换机的基本配置 Enable 进入特权模式 Config terminal 进入配置模式 Enable password cisco 设置enab ...

  4. 计算机交换机配置实验心得,网络配置实验心得

    <网络配置实验心得>由会员分享,可在线阅读,更多相关<网络配置实验心得(10页珍藏版)>请在人人文库网上搜索. 1.网络配置实验心得 #网络配置实验心得1#1.实验目的理解IC ...

  5. linux怎么配置网卡实训报告,网络配置实验心得5

    心得体会是指一种读书.实践后所写的感受性文字.语言类读书心得同数学札记相近;体会是指将学习的东西运用到实践中去,通过实践反思学习内容并记录下来的文字,近似于经验总结.下面是小编带来的有关网络配置实验心 ...

  6. python测网络连通性_网络工程师如何在ensp模拟器上玩python自动化配置交换机。...

    前面几期我们分享过利用Telnetlib.Netmiko模块来实现登录交换机修改配置,本期我们再介绍一个模块,叫Paramiko模块,这回我不打算用真机的,改用ensp模拟器试试看,这样大家也可以在没 ...

  7. 交换机的基本配置实验报告_无线网络设计配置即实验报告

    工程师ACK接到一个小型图书馆的网络组建项目,根据目前流行的网络组建以及项目地点的使用需要便捷性,采用AC控制的瘦AP模式.不需要AC来管理网络的AP是胖AP需要单独配置,有多少个AP就要配置多少次. ...

  8. 计算机交换机配置实验心得,交换机系统配置实验心得5

    你还在为交换机基本配置实验报告而烦恼么?不用担心,下面就是小编带来的交换机系统配置实验心得,希望能帮助大家! 交换机系统配置实验心得1 单交换机的VLAN配置 [基本原理] VLAN(Virtual ...

  9. 锐捷网络交换机配置命令大全,网络工程师收藏!

    基本命令 Enable 进入特权模式 #Exit 返回上一级操作模式 #End 返回到特权模式 #write memory 或copy running-config startup-config 保存 ...

最新文章

  1. 版本控制8(译文) -(完)
  2. 强制解除占用端口,最快速方便的解除占用端口,端口占用解决方案大全
  3. mos管开关电路_MOS管的知识,看这一篇就可以了
  4. java的语法树,JAVA语言语法树.doc
  5. java清除控制台_Java:清除控制台
  6. Spring @Async注解
  7. cctype,string,vector
  8. C++Kosaraju找有向图的强连通分量算法(附完整源码)
  9. STL 之replace,replace_if,replace_copy,replace_copy_if
  10. linux mysql select_MySQL-Select语句高级应用
  11. CISCO CCNA路由器密码管理
  12. 解读沃指数APP排行榜的三大亮点:垂直领域凶猛
  13. MFC网络通信程序设计——网络聊天室
  14. 腾讯社交广告大赛回来的感悟
  15. ITIL4 讲解:可用性管理
  16. ps无缝拼图教程一:无缝拼接花纹图案
  17. ROS2_Foxy学习1——前言与安装
  18. 从技术角度告诉你,区块链到底有哪些特点和运作机制
  19. APP-Log日志采集
  20. 如何保证GIS图件中字体大小是所要求的

热门文章

  1. python开发软件的实例-这可能是最好玩的python GUI入门实例!
  2. 学python能做什么类型的工作-python是什么?python可以用来干什么?
  3. python编程100个小程序-100个Python练手小程序
  4. php和python-PHP和Python性能比较:放弃PHP改用Python
  5. 用python画皮卡丘-实现童年宝可梦,教你用Python画一只属于自己的皮卡丘
  6. python为什么叫爬虫-Python为什么叫爬虫
  7. python学习网站-Python学习网站
  8. 语音识别中的CTC算法的基本原理解释
  9. 一种连续语音识别系统的制作方法
  10. Hbuilder 屏幕放大缩小