「网络自动化运维」华为交换机配置自动化备份实践(基础篇)

深圳运维 网络维护 4.1K

作为大龄传统网络工程师,焦虑感是越来越重。在现在Devops流行的大背景下,仅仅是会敲命令的网工是注定跟不上时代的,通过学习Python来解决一些重复性工作很有必要。最近网上越来越多大佬分享通过Python来解决很多自动化配置网络设备的问题,才了解到其实现在网络界已经造出来了很多很好用的Python第三方模块的轮子,大大简化了网工编码的难度。从这篇文章开始记录我学习Python网络自动化运维的过程。

本文将实践通过Python的paramiko模块ssh登录到交换机进行自动化备份,日常备份网络设备配置是非常常见的需求,当网络设备规模达到上百台时,手动一台台备份根本就不可能。由于我目前所在公司网络设备环境大多数为华为设备,国内目前也是以国产网络设备为主流,网上的其他教程更多的是针对Cisco设备的,因此本文将分享使用华为设备作为实验对象。

本实验通过学习 @弈心大佬的《网络工程师的Python之路》后结合自己的理解和思路形成。

实验环境:模拟器: 华为ENSP

Python平台: 本机WIN10(开个Linux虚机运行Python脚本也可以,生产环境建议搭Linux服务器)

Python版本: 3.8.6

拓扑: 本机电脑Win 10,以及5台华为S5700交换机均通过Hub连接在一起,处于同一个网段192.168.134.0/24

「网络自动化运维」华为交换机配置自动化备份实践(基础篇)-第1张图片-贝塔运维

基础配置1、 首先将5台交换机SW1 - SW5都配置好管理IP、用户名密码、SSH登录,确保PC机与5台交换机之间都能ping通。

Vlan 10#interface Vlanif10 ip address 192.168.134.11x 255.255.255.0#interface GigabitEthernet0/0/1 port link-type access port default vlan 10#stelnet server enablessh authentication-type default password#aaa local-user python password cipher Python@123 local-user python privilege level 15 local-user python service-type ssh#user-interface vty 0 4 authentication-mode aaa protocol inbound ssh2、 在PC机上将paramiko这个模块装好(pip install paramiko),安装好后可以在cmd命令行敲入import paramiko如果不报错则表示已安装成功。Python安装步骤不再阐述。

「网络自动化运维」华为交换机配置自动化备份实践(基础篇)-第2张图片-贝塔运维

3、 在PC机的python项目目录下,新建一个devices_list.txt的文本文件,分别将SW1 - SW5的IP地址及主机名录入进去,设备IP和主机名之间留一个空格。

「网络自动化运维」华为交换机配置自动化备份实践(基础篇)-第3张图片-贝塔运维

「网络自动化运维」华为交换机配置自动化备份实践(基础篇)-第4张图片-贝塔运维

4、 另外在本机上安装FTP 服务端软件,用于交换机通过ftp命令将配置文件备份到FTP服务器上,具体什么软件都可以,比如Windows下可以用serv-u、Wing FTP,Linux下可以用vsftp。并确认ftp 21端口能够连通。

实验代码本次批量自动化备份交换机配置的完整代码如下,后面会对一些主要代码进行解析。一些基础的就不过多阐述,网上很多大佬已经有分享了很多python的基础知识。

「网络自动化运维」华为交换机配置自动化备份实践(基础篇)-第5张图片-贝塔运维

代码解析第一部分

import paramikoimport time#import getpassusername = 'python'password = 'Python@123'date = time.strftime('%Y-%m-%d')#如果考虑账户密码安全问题,可以通过input()及getpass()在交互窗口进行手动输入赋值# username = input(‘Username: ’)# password = getpass.getpass(‘Password: ’)f = open('devices_list.txt', 'r') #打开已经创建好的设备信息文件首先import两个主要的模块,分别是paramiko及time;

交换机的登录用户名密码分别赋值给两个变量username及password里,当然如果考虑到直接把用户名密码写进代码里可能会有安全问题,可以通过使用input()函数及getpass()函数来替代,即执行脚本的时候交互的方式手动输入用户名及密码来赋值给变量避免账户泄露风险。

然后定义一个date变量,使用time.strftime()方法来格式化输出当前的系统日期,格式为年-月-日‘%Y-%m-%d’,也可以输入完整的年-月-日-时间‘%Y-%m-%d, %H:%M:%S’,但我们这里只要日期即可,后面会讲到定义这个date有什么用。

通过open()函数,打开我们提前编辑好的用于存放交换机信息的devices_list.txt这个文件,并设置’r’只读。

第二部分

for line in f.readlines(): line_s = line.split( ) #注意括号里是空格,空格作为切割符 device_ip = line_s[0] device_name = line_s[1] ssh_client = paramiko.SSHClient() ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh_client.connect(hostname=device_ip, username=username, password=password)print('成功连接上 ', device_ip)#exec_command()函数是将服务器执行完的结果一次性返回给你;invoke_shell()函数类似shell终端,可以将执行结果分批次返回,看到任务的执行情况,不会因为执行一个很长的脚本而不知道是否执行成功command = ssh_client.invoke_shell()#配置备份前先保存,否则备份的配置可能不是最新的command.send('save\n')command.send('y\n')time.sleep(1) command.send('ftp 192.168.134.1\n') command.send('ftpuser\n') command.send('ftpuser\n') command.send('put vrpcfg.zip ' + date + '_' + device_name + '_vrpcfg.zip\n') command.send('bye\n') time.sleep(1)output = command.recv(65535) print(output.decode('UTF-8')) #解析为UTF-8编码,否则内容格式会很难看f.close()ssh_client.close()然后就是对打开的devices_list.txt进行for循环操作,逐行进行读取readlines()。

首先我们要对每一行的设备IP及主机名分别提取出来,用到split()这个方法来切割,切割符为“ ”空格。这样我们就能把切割后的第一个字段[0]赋值给ip_address,第二个字段[1]赋值给device_name。

接下来就是通过paramiko来连接设备,网上很多大佬已经详细介绍过这里不过多阐述,总之整个paramiko ssh登录设备套路就是这3行。

「网络自动化运维」华为交换机配置自动化备份实践(基础篇)-第6张图片-贝塔运维

ssh登录到设备后则执行具体的命令操作,通过paramiko的invoke_shell().send()执行以下命令,使用ftp登录到ftp服务器,将配置put上去。

save #先保存最新配置yftpuser #用户名ftpuser #密码put vrpcfg.zip 2021-6-13_SW1_vrpcfg.zipbye之前提到了定义date这个变量,作用就是给配置文件自动加入当天的日期,以便区分配置文件具体备份的日期,方便版本的区分和比对。另外配置文件也加上通过split()切割出来的主机名,比IP地址更能够更直观地看出配置文件属于哪台设备,最后备份的文件名为这个格式2021-06-12_SW1_vrpcfg.zip。 并将命令执行的整个操作记录输出到output这个变量,并且打印出来。

最后整个循环完成后,需要把open的devices_list及ssh连接关闭掉。

实验效果代码编写完成后,执行python文件。可以在Python脚本执行的过程中,看到整个命令的输出过程。

「网络自动化运维」华为交换机配置自动化备份实践(基础篇)-第7张图片-贝塔运维

脚本跑完后同时在FTP服务器上就能看到这5台交换机的配置文件了。解压后打开即可看到具体的配置文件。

「网络自动化运维」华为交换机配置自动化备份实践(基础篇)-第8张图片-贝塔运维

「网络自动化运维」华为交换机配置自动化备份实践(基础篇)-第9张图片-贝塔运维

总结通过本次实验,可以通过paramiko这个ssh远程登录模块实现华为交换机自动备份配置到FTP服务器的场景。但同时有以下不足,需要继续在代码层面优化的。

1、 Paramiko默认是单线程串行操作的,即执行完一台设备的备份再执行另一台,如果设备数量大的时候效率可能会没那么高,需要优化通过多线程的方式并行执行来达到代码执行效率的提升。

2、 没有异常处理机制,如果遇到中间某台设备因为某些原因连接不上,会中断代码的执行,后面的设备也无法继续备份了,需要引入异常处理来解决该问题。

后面的文章会继续学习通过一些方法来解决上述问题。

标签: 华为交换机配置

抱歉,评论功能暂时关闭!