因工作原因本人日常会跟大量交换机打些交道,而交换机管理起来如果没有什么集成的网管平台也会挺复杂的。我个人是出于好奇,想深入学习下网管平台那边关于交换机的自动化运维(备份)的一些原理。我用的是python+Tftp64+数据库 这样一个环境。
前期准备:python、Tftp64、HeidiSQL
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 # 导入模块 import pymysql import paramiko import time import os import shutil ############################################################ ###这一块主要是用来生成备份的文件名及文件夹名等 ############################################################ now = time.strftime('%Y-%m-%d_%H-%M-%S', time.localtime(time.time())) # 系统当前时间年份 year = time.strftime('%Y', time.localtime(time.time())) # 月份 month = time.strftime('%m', time.localtime(time.time())) # 日期 day = time.strftime('%d', time.localtime(time.time())) # 切换到备份文件路径 os.chdir("D:/Tftpd64/backup") #年路径 fileYear = os.getcwd() + '/' + year #月路径 fileMonth = fileYear + '/' + month #日路径 fileDay = fileMonth + '/' + day #判断路径是否存在,不存在创建文件夹 if not os.path.exists(fileYear): os.mkdir(fileYear) os.mkdir(fileMonth) os.mkdir(fileDay) else: if not os.path.exists(fileMonth): os.mkdir(fileMonth) os.mkdir(fileDay) else: if not os.path.exists(fileDay): os.mkdir(fileDay) ############################################################ ###这里是链接到数据库的操作 ############################################################ # 1.连接到mysql数据库 db = pymysql.connect(host='数据库地址,在本机就localhost', user='数据库账号', password='数据库密码', db='数据库db', charset='utf8') # localhost连接本地数据库 user 用户名 password 密码 db数据库名称 charset 数据库编码格式 cursor = db.cursor() #cursor.execute("show tables;") #swb = cursor.fetchall() # 返回执行SQL代码后的结果集,默认为元组 #打印 sql = "select * from huawei " cursor.execute(sql) f = cursor.execute(sql) num = 0 #开始循环 #################################################################### ###这里是记录备份的一个日志功能,就显示下正在备份哪台交换机,有没有问题等等 #################################################################### print('开始循环') log = open('backup.log', 'a') log.write(now+'——备份时间-----------------------------------\n') log.close() while True: if num < f: row = cursor.fetchone() print('此时的row:') print(row) #上传文件 # 创建SSH对象 ssh = paramiko.SSHClient() #print('创建SSH对象') # 允许连接不在know_hosts文件中的主机 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #获取地址 IP = row[0] my = '存备份文件的服务器IP地址' User = row[1] Pwd = row[2] # 连接服务器 #print('连接服务器') ssh.connect(IP, 22, User, Pwd, look_for_keys=False) # 执行命令 #print('执行命令') file = IP + '_' + now stdin, stdout, stderr = ssh.exec_command( ('tftp ' + my + ' put config.cfg %s.cfg') % file) # 获取命令结果 res, err = stdout.read(), stderr.read() result = res if res else err #print(result.decode()) time.sleep(30) # 关闭连接 ssh.close() #print('远程结束') print(row) #如果文件上传成功 if os.path.exists('D:\\Tftpd64\\backup\\' + file+ '.cfg'): print('上传成功') #移动文件 mv = shutil.move mv('D:\\Tftpd64\\backup\\' + file + '.cfg', fileDay) #print(IP+'备份完成') #写入日志 log = open('backup.log', 'a') log.write(file+'____备份完成'+ '\n') log.close() time.sleep(5) num +=1 else: print(str(row) + '上传失败') time.sleep(5) num +=1 #否则退出循环 else: print('--------------华为备份循环结束,退出循环------------------') log = open('backup.log', 'a') log.write('华为备份循环结束,退出循环\n') log.close() break