不得不说Python真是个好东西,当你面临着大量的重复性工作时,程序基本可以帮你完美解决。
最近有一大堆设备想备份一下配置,但是由于项目才开始,没有网管平台。所以,想偷个懒写个小python,解放自己的双手(写程序反而更累了,hhh)。本文只是作为日常技能提升记录,不是专业开发,大佬请多多指教。
最开始萌生这个想法的时候有三个思路,但是最后只有一个走通了:
- 在设备上启用FTP服务器,本地PC登陆网络设备下载配置文件。
- 在本地PC机使用3CDaemon创建FTP服务器,网络设备通过FTP登陆本地PC上传配置文件。
- 本地PC通过SSH登陆网络设备,通过display current-configuration 获取回显,保存到本地。
最终只有第三个方案成功了。第一个方案,由于网络设备上不让启用FTP服务,直接搁浅;第二个方案,本地搭建FTP服务后,通过Python程序向网络设备上传登陆FTP,部分设备无法登陆(华为设备可以通过send_command_timing()刷入FTP配置登陆,但是H3C设备死活不行,总是报错配置命令不存在;求大佬解答)。第三个方案,就是刷入配置,然后获取回显保存文件完事儿(正好之前刷网络配置的代码稍微改改就可以)。
整程序使用的是netmiko这个库,官方也有相关的教程:
官方指导手册:https://pynet.twb-tech.com/blog/automation/netmiko.html
这个程序主要涉及到两个文件需要读取,一个是记录设备IP地址及设备厂商命名的Excel表格,最终的配置文件名与设备命名保持一致;另外一个是记录FTP登陆命令的Txt文件(TXT文件改成其他配置命令就可以变为配置刷入程序了)。
Excel表格模板:
命令文件:
注意:如果,最终的配置文件显示不全,则说明需要改一下屏幕长度。增加一条screen-length disable命令就行。
代码如下:代码解释写在注释里了
from netmiko import ConnectHandler
import openpyxl
import threading
import os
import time
#读取Excel文件并格式化,将各个设备的信息存入字典。
def Read_excel(file_name):
wb = openpyxl.load_workbook(file_name)
sheet = wb.get_sheet_by_name('Sheet1')
row = sheet.max_row
column = sheet.max_column
device_list = {}
for i in range(2,row+1):
device_list['device{0}'.format(i-1)] = []
for j in range(1,column+1):
vla = sheet.cell(row = i,column = j).value
device_list['device{0}'.format(i-1)].append(vla)
return device_list
#执行命令并输出的函数
def Exe_command(net_connect,cmd):
print('正在执行命令:',cmd)
# send_command_timing 沿通道发送命令,返回输出(基于时序)。就是紧接着回显后边执行。
result = net_connect.send_command_timing(cmd)
#send_command 向下发送命令,返回输出(基于模式)。就是在回显的下一行刷入命令。
#result = net_connect.send_command(cmd)
return result
#SSH登陆设备,输入配置文件内容
def Connect(device,Backup_file_name):
print('正在连接{0}\n'.format(device['host']))
net_connect = ConnectHandler(**device)
net_connect.enable() #输入启用
save = open(Backup_file_name,'w')
#读取配置文件,配置文件存放在当前目录下
for i in open('command_backup.txt','r'):
cmd = i.replace('\n',' ')
result = Exe_command(net_connect,cmd)
save.write(result)
save.close()
# Exe_command(net_connect,'put flash:/vrpcfg.zip {0}.zip'.format(Backup_file_name))
# Exe_command(net_connect,'quit')
net_connect.disconnect()
def Huawei(ip):
huawei = {
'device_type':'huawei',
'host':ip,
'username':'admin',
'password':'admin',
}
return huawei
def H3c(ip):
h3c = {
'device_type':'hp_comware',
'host':ip,
'username':'admin',
'password':'admin',
}
return h3c
#初始化函数,主要用于设备类型的判断,配置备份文件名的构造
def Init(ip_file):
device_list = Read_excel(ip_file)
for device_name in device_list.keys():
try:
if device_list[device_name][1] == 'huawei':
device = Huawei(device_list[device_name][0])
#配置文件名前加了一个二级目录network_config
Backup_file_name = 'network_config\\'+device_list[device_name][2]+'.txt'
Connect(device,Backup_file_name)
elif device_list[device_name][1] == 'h3c':
device = H3c(device_list[device_name][0])
Backup_file_name = 'network_config\\'+device_list[device_name][2]+'.txt'
Connect(device,Backup_file_name)
else:
print('未定义设备!')
pass
except Exception as e:
print('连接超时:',e)
pass
time.sleep(1)
#def start_exe(Promgram):
# os.system(Promgram)
if __name__ == '__main__':
# Program = 'D:\\3CDaemon\\3CDaemon.EXE'
# thread = threading.Thread(target=start_exe,args=(Program,))
# thread.start()
Init('ip_add.xlsx')