当你还在一台台ssh登录交换机,手动地备份配置文件时,我们的网管平台已经可以定时批量备份了。解锁了我们日常的重复工作,那我们自己能否利用python实现批量备份交换机配置文件呢?答案是肯定的。

今天我们就来实现这个功能,我们利用ftp来实现上传文件并保存到ftp服务器。还是熟悉的配方,熟悉的味道,熟悉的拓扑:

ftp命令_命令ftp传输文件_ftp命令上传文件夹

哈哈哈,一直延用至今的拓扑,实验都没问题,满足需求即可。

ftp服务器:这个可以用3cd,也可以微软ftp,也可以其它,随意。

本次实验我就用ANToolsPro里的FTP小工具来实现:

命令ftp传输文件_ftp命令上传文件夹_ftp命令

接下来直接看我们的批量备份的代码:

和之前文章巡检类似:我们利用netmiko ssh或telnet登录设备ftp命令,然后执行登录ftp的命令,然后执行put vrpcfg.zipip_vrpcfgzip把文件上传到ftp服务器。

ftp命令_ftp命令上传文件夹_命令ftp传输文件

一般我们都是先登录一台测试命令是否正确,然后再写到代码里头,确保无误。

if not device_groups==[]:    for device_groups_1 in device_groups:        platforms.append(device_groups_1[5])    if platforms[0]=='huawei'or platforms[0]=='huawei_telnet' or platforms[0]=='huawei_vrpv8' or platforms[0]=='huawei_vrpv8_telnet' or platforms[0]=='huawei_olt' or platforms[0]=='huawei_olt_telnet':        cmd=['ftp %s %s'%(self.ftpserverip.get(),self.ftpport.get()),'%s'%(self.ftpusername.get()),'%s'%(self.ftppasswd.get()),'put vrpcfg.zip','quit']

这里是需要代入执行的命令,以列表的形式存储。

下面是主要的代码,我们的ip,username以形参的方式代入,可以看到,cmd.copy(),我们复制了列表赋值给到cmd_2ftp命令,这样cmd_2改变了就与cmd没有关系了,这里也可以写成cmd_2=cmd[:]。这些都是基础知识,平时有空要多多回顾。

def Device(ip,username,password,secret,port,platform,protocol,cmd,):    date = time.strftime('%Y%m%d', time.localtime()) #赋予date变量    cmd_2=cmd.copy()    try:        if platform=='huawei' or platform=='huawei_telnet'or platform=='huawei_vrpv8' or platform=='huawei_vrpv8_telnet'or platform=='huawei_olt' or platform=='huawei_olt_telnet'or platform=='hp_comware' or platform=='hp_comware_telnet':            huawei = {            'device_type':platform, #定义设备类型            'ip':ip, #调用变量ip            'port': port, #指定端口,默认为22            'username': username, #设备登录名            'password': password, #登录密码            #'secret' : 'admin' #enable密码            }        elif platform=='ruijie_os' or platform=='ruijie_os_telnet' or platform=='cisco_ios' or platform=='cisco_ios_telnet' or platform=='cisco_ios' or platform=='cisco_ios_telnet' or platform=='cisco_asa' or platform=='cisco_asa_telnet':            huawei = {            'device_type':platform, #定义设备类型            'ip':ip, #调用变量ip            'port': port, #指定端口,默认为22            'username': username, #设备登录名            'password': password, #登录密码            'secret' : secret, #enable密码            }        else:            huawei = {            'device_type':'autodetect', #定义设备类型            'ip':ip, #调用变量ip            'port': port, #指定端口,默认为22            'username': username, #设备登录名            'password': password, #登录密码            'secret' : secret, #enable密码            }                if protocol == 'ssh' :            huawei_connect3 = ConnectHandler(**huawei)        else:            huawei_connect3 = Netmiko(**huawei)
if cmd[3]=='put vrpcfg.zip':            cmd_2[3]='put vrpcfg.zip %s_vrpcfg.zip'%(ip) else: pass
try: for cmd1 in cmd_2: if cmd1==cmd_2[0]: result1=huawei_connect3.send_command(command_string=cmd1,expect_string=':') elif cmd1== cmd_2[1]: result1=huawei_connect3.send_command(command_string=cmd1,expect_string=':') elif cmd1==cmd_2[2]: result1=huawei_connect3.send_command(command_string=cmd1,expect_string=']',cmd_verify=False) elif cmd1==cmd_2[3]: result1=huawei_connect3.send_command(command_string=cmd1,expect_string=']') else: result1=huawei_connect3.send_command(command_string=cmd1,expect_string='>') print('%sn'%(result1))
except: pass
try: huawei_connect3.disconnect() #断开SSH连接 except:            pass print('%s已连接FTP服务器,备份成功n'%(ip)) except NetMikoAuthenticationException : #认证失败报错记录 e1 = open(f'SWcurconf\{date}.txt','a') print(date,ip,'[Error 1] Authentication failed.n',file = e1) e1.close except NetMikoTimeoutException : #登录超时报错记录 e2 = open(f'SWcurconf\{date}.txt','a') print(date,ip,'[Error 2] Connection timed out.n',file = e2) e2.close except : #未知报错记录 e3 = open(f'SWcurconf\{date}.txt','a') print(date,ip,'[Error 3] Unknown error.n',file = e3)        e3.closefor device_groups_1 in device_groups: ip=device_groups_1[0] username=device_groups_1[1] password=device_groups_1[2] secret=device_groups_1[3] port=device_groups_1[4] platform=device_groups_1[5]    protocol=device_groups_1[6] my_thread = threading.Thread(target=Device, args=(ip,username,password,secret,port,platform,protocol,cmd,)) threads.append(my_thread)for thread in threads: thread.start()for thread in threads: thread.join() # 等待子线程结束后,再往后面执行print('已完成本次备份任务n')

这里的device_groups就是我们的设备信息,这里不作过多的讲解。

huawei = {            'device_type':platform, #定义设备类型            'ip':ip, #调用变量ip            'port': port, #指定端口,默认为22            'username': username, #设备登录名            'password': password, #登录密码            #'secret' : 'admin' #enable密码            }

这个是我们netmiko连接交换机所需的参数,我们都以形参的方式代入函数。

for cmd1 in cmd_2:      if cmd1==cmd_2[0]:                                         result1=huawei_connect3.send_command(command_string=cmd1,expect_string=':')    elif cmd1== cmd_2[1]:        result1=huawei_connect3.send_command(command_string=cmd1,expect_string=':')    elif cmd1==cmd_2[2]:        result1=huawei_connect3.send_command(command_string=cmd1,expect_string=']',cmd_verify=False)    elif cmd1==cmd_2[3]:        result1=huawei_connect3.send_command(command_string=cmd1,expect_string=']')    else:        result1=huawei_connect3.send_command(command_string=cmd1,expect_string='>')    print('%sn'%(result1))

这里我们用的send_command方法,因为set方法会直接在【】模式执行,我们登录ftp的命令要在模式执行,这里也不作过多说明,大家可以看源码去理解参数的意思及使用。

最后我们使用多线程来跑程序,可以同时对多台设备进行备份操作。

最后我们看下执行后的效果吧:

通过对本篇文章的学习,期待大家可以开始动手写出自己的备份程序啦 !

———END———
限 时 特 惠: 本站每日持续更新海量各大内部创业教程,一年会员只需98元,全站资源免费下载 点击查看详情
站 长 微 信: bear68899

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注