cisco 模拟器安装及交换机的基本配置实验心得_网络工程师的Python之路 -- 自动监测网络配置变化...
版权声明:我已加入“维权骑士”(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对交换机配置文件做对比时,有四种情况是需要我们注意的:
- 昨天(或之前)的某个已有的配置在今天的配置中被删除了
- 昨天(或之前)的某个没有的配置在今天的配置中被添加了
- 昨天(或之前)的某个配置在今天的配置中被改动了(字符长度没有变或者变短了)
- 昨天(或之前)的某个配置在今天的配置中被改动了(字符长度变长了)
下面一一举例说明:
- 昨天(或之前)的某个已有的配置在今天的配置中被删除了
比如说之前交换机里配置了一个叫做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之路 -- 自动监测网络配置变化...相关推荐
- cisco 模拟器安装及交换机的基本配置实验心得_「分享」7个必看的Cisco实验
1.修改cisco 路由器的名称及路由器密码命令操作 实验要求: 1.路由器名:cisconet 2.设置password为cisconet,secret为cisconet,vty为cisconet, ...
- cisco 模拟器安装及交换机的基本配置实验心得_看完这份1113页的TCP/IP协议+路由与交换机,成功上岸字节跳动...
TCP是一个巨复杂的协议,因为它要解决很多问题,而这些问题又带出了很多子问题和阴暗面.所以学习TCP本身是个比较痛苦的过程,但对于学习的过程却能让人有很多收获. 之所以想写这篇文章,目的有三个: 一个 ...
- cisco 模拟器安装及交换机的基本配置实验心得_软考网络工程师级配置题总结 | 交换机配置、路由器配置、广域网接入配置、L2TP配置、IPSec配置、PIX防火墙配置...
软考网络工程师级配置题总结 一. 交换机配置 1. 交换机的基本配置 Enable 进入特权模式 Config terminal 进入配置模式 Enable password cisco 设置enab ...
- 计算机交换机配置实验心得,网络配置实验心得
<网络配置实验心得>由会员分享,可在线阅读,更多相关<网络配置实验心得(10页珍藏版)>请在人人文库网上搜索. 1.网络配置实验心得 #网络配置实验心得1#1.实验目的理解IC ...
- linux怎么配置网卡实训报告,网络配置实验心得5
心得体会是指一种读书.实践后所写的感受性文字.语言类读书心得同数学札记相近;体会是指将学习的东西运用到实践中去,通过实践反思学习内容并记录下来的文字,近似于经验总结.下面是小编带来的有关网络配置实验心 ...
- python测网络连通性_网络工程师如何在ensp模拟器上玩python自动化配置交换机。...
前面几期我们分享过利用Telnetlib.Netmiko模块来实现登录交换机修改配置,本期我们再介绍一个模块,叫Paramiko模块,这回我不打算用真机的,改用ensp模拟器试试看,这样大家也可以在没 ...
- 交换机的基本配置实验报告_无线网络设计配置即实验报告
工程师ACK接到一个小型图书馆的网络组建项目,根据目前流行的网络组建以及项目地点的使用需要便捷性,采用AC控制的瘦AP模式.不需要AC来管理网络的AP是胖AP需要单独配置,有多少个AP就要配置多少次. ...
- 计算机交换机配置实验心得,交换机系统配置实验心得5
你还在为交换机基本配置实验报告而烦恼么?不用担心,下面就是小编带来的交换机系统配置实验心得,希望能帮助大家! 交换机系统配置实验心得1 单交换机的VLAN配置 [基本原理] VLAN(Virtual ...
- 锐捷网络交换机配置命令大全,网络工程师收藏!
基本命令 Enable 进入特权模式 #Exit 返回上一级操作模式 #End 返回到特权模式 #write memory 或copy running-config startup-config 保存 ...
最新文章
- 版本控制8(译文) -(完)
- 强制解除占用端口,最快速方便的解除占用端口,端口占用解决方案大全
- mos管开关电路_MOS管的知识,看这一篇就可以了
- java的语法树,JAVA语言语法树.doc
- java清除控制台_Java:清除控制台
- Spring @Async注解
- cctype,string,vector
- C++Kosaraju找有向图的强连通分量算法(附完整源码)
- STL 之replace,replace_if,replace_copy,replace_copy_if
- linux mysql select_MySQL-Select语句高级应用
- CISCO CCNA路由器密码管理
- 解读沃指数APP排行榜的三大亮点:垂直领域凶猛
- MFC网络通信程序设计——网络聊天室
- 腾讯社交广告大赛回来的感悟
- ITIL4 讲解:可用性管理
- ps无缝拼图教程一:无缝拼接花纹图案
- ROS2_Foxy学习1——前言与安装
- 从技术角度告诉你,区块链到底有哪些特点和运作机制
- APP-Log日志采集
- 如何保证GIS图件中字体大小是所要求的