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

fff02ae342aff4ba0342b9388d7c507b.png

版权声明:我已加入“维权骑士”(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/0
 no switchport
 ip address 10.1.1.1 255.255.255.0

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

interface GigabitEthernet0/0
 no switchport
 + duplex full
 ip address 10.1.1.1 255.255.255.0

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

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

interface GigabitEthernet0/1
 no switchport
 ip 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/0
 no switchport
 ip 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的大体用法后,下面进入实验环节:

实验拓扑和初始配置:

20670ea53540b71d9b8b8e9750ac3708.png

局域网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地址。

1b79fab1031542ac5e95ccfe8bcfbc05.png

实验目的:

使用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拿掉:

62ea7f5ae6d8d3dd863591a0b60d43fb.png

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

eefd70f08120f201396b62d7cf0d1e31.png

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

4215ab8650746537b1c507965e2de815.png

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

fded95940631d7ab36198fa8be769e87.png

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

d444ebde68b3085d322be318e9d8cd34.png

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

2beff305e12d07b2e689066a57c81ef4.png

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

c69428f3f366646d3ece568ea47e1f57.png

5f61db39ae8658625afcaf7f9adabe86.png

ff5eed6f6d44bd5608d7d9b9e28e4c60.png

最后登录GMAIL,查看邮箱:

992156a2be84be97308c1c15cf4b5395.png

262b7893737e58c02639ab6ab54f7469.png

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

6bc9ed83aebf9eb74a353b19c8bf7d62.png

1fe59070398d6f09dfc95d897f8c3870.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值