当你还在一台台ssh登录交换机,手动地备份配置文件时,我们的网管平台已经可以定时批量备份了。解锁了我们日常的重复工作,那我们自己能否利用python实现批量备份交换机配置文件呢?答案是肯定的。
今天我们就来实现这个功能,我们利用ftp来实现上传文件并保存到ftp服务器。还是熟悉的配方,熟悉的味道,熟悉的拓扑:
哈哈哈,一直延用至今的拓扑,实验都没问题,满足需求即可。
ftp服务器:这个可以用3cd,也可以微软ftp,也可以其它,随意。
本次实验我就用ANToolsPro里的FTP小工具来实现:
接下来直接看我们的批量备份的代码:
和之前文章巡检类似:我们利用netmiko ssh或telnet登录设备ftp命令,然后执行登录ftp的命令,然后执行put vrpcfg.zipip_vrpcfgzip把文件上传到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.close
for 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
‘