CISCO、HUAWEI、H3C自动化备份
前言:
关键字:CISCO、HUAWEI、H3C、自动化备份;
这入篇博文,本来是已经写好的了,但在最后一次更新图片时,由于那该死的手机网络问题,导致这篇博文被清空了,所以现在博主啥也不想说了!
这个东西能做什么?能帮你自动化备份CISCO、HUAWEI、H3C等交换机与路由器的当前配置(仅限TELNET连接方式),而你需要做的,仅仅是正确的填写一个EXCEL表单;其实际上只是一个简单的PYTHON脚本,博主提供了百度网盘的下载连接,WIN7以下(含)可以直接解压使用;对于希望在LINUX上使用的话,实际也很简单,不过是执行一份".py"文件而已;
百度网盘:RS_BackUp 提取码:m07q
一、环境相关
注:相关说明以百度网盘的中的下载包为依据;
-
操作系统:WIN7以上(含)
-
PYTHON版本:3.7.9(不使用更高的版本是为了兼容WIN7)
-
PYTHON依据:openpyxl库、telnetlib库(默认标准库)
-
测试日期:2022年01月01日
二、ZIP包目录结构
从百度网盘下载的ZIP包可直接解压使用,目录结构与文件作用如下;
1 2 3 4 5 6 7 8 9 10 |
$ tree RS_BackUp/ RS_BackUp/ # 主目录 ├── Python # PYTHON程序目录 ├── RouteOrSwitch # 备份主目录 │ ├── BACKUP.BAT # WINDOW使用的BAT文件 │ ├── files │ │ └── data.xlsx # EXCEL数据文件 │ ├── RouteOrSwitch.py # 主要备份代码文件 │ └── saveConfig # 获取配置后保存至该目录 └── 说明文件.txt # 没什么用的说明 |
三、基本使用
1、正确填写"RS_BackUp/RouteOrSwitch/files/data.xlsx"文件,以下为操作示例[相关字段的填写见EXCEL内的使用说明,或见第三节最后说明图示部分];另外,下图标注的前三个字段,共同决定是否执行备份函数;
2、运行"RS_BackUp/RouteOrSwitch/BACKUP.BAT"文件[WIN7以上(含)];
3、至"RS_BackUp/RouteOrSwitch/saveConfig"目录内获取相关文件[注:文件名的形式为"日期_设备名称_IP地址"];
*、EXCEL"数据"表-说明图示:一
*、EXCEL"数据"表-说明图示:二
四、重要参数超时
备份程序中,有两个超时参数最为重要,设定位置分别为"RS_BackUp/RouteOrSwitch/files/data.xlsx"与"RS_BackUp/RouteOrSwitch/RouteOrSwitch.py":
"data.xlsx"内的"等待时长"字段[实际叫"获取配置超时"更合适,博主懒得改了],这个字段是定义设备上,获取当前配置所等待的时长,单位"秒";对于大部分情况下,设置为"10"已经足够;但在某些特殊情况下,例如网络状况不稳定、设备负载较高、设备配置较大等情况下,可能导致设备"当前配置"读取不完整(10秒时长不足以获取完整的配置),则可尝试调大此值;
"RouteOrSwitch.py"中变量"waitTime",该变量是控制设备上单条命令的执行超时设定,在网络极其不稳定的状态下,可尝试调大此值;
五、主要代码
"RouteOrSwitch.py"
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 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 |
#!/usr/bin/python # -*- coding: utf-8 -*- # 导入库 import os import time import datetime import telnetlib from openpyxl import load_workbook # startTime = datetime.datetime.now() # 变量定义 saveDate = datetime.datetime.strftime(datetime.datetime.now(), '%Y%m%d') # 数据文件 excelFile = r'./files/data.xlsx' # SHEEL表中的无效值定义 invaildVar = '__nodata__' # 备份配置保存目录 savePath = r'./saveConfig/' # 设备上执行单次命令输入的超时设定 # 数据表单中若存在网络连接不稳定的设备,可尝试调节此值 waitTime = 5 # 切换至当前".py"的工作目录 os.chdir(os.getcwd()) # 打开"EXCEL数据文件" openExcel = load_workbook(excelFile) # 定义所使用的"SHEEL" useExcelSheel = openExcel['数据'] # 思科配置备份 def ciscoTelnet(dataList, invaildVar, waitTime): print('') try: configName = savePath + saveDate + '_' + str(dataList[3]) + '_' + str(dataList[4]) prompt = str(dataList[3]).encode('ascii') connHost = telnetlib.Telnet(str(dataList[4]).encode('ascii'), timeout=waitTime) print('正在连接设备: ' + str(dataList[4])) if str(dataList[5]) != invaildVar: connHost.read_until(b'Username:', timeout=waitTime) connHost.write(str(dataList[5]).encode('ascii') + b'\n') if str(dataList[6]) != invaildVar: connHost.read_until(b'Password:', timeout=waitTime) connHost.write(str(dataList[6]).encode('ascii') + b'\n') if str(dataList[7]) != invaildVar: connHost.read_until(prompt + b'>', timeout=waitTime) connHost.write(b'enable\n') connHost.read_until(b'Password:', timeout=waitTime) connHost.write(str(dataList[7]).encode('ascii') + b'\n') else: connHost.read_until(prompt + b'>', timeout=waitTime) connHost.write(b'enable\n') print('TELNET登录成功[ ' + str(dataList[4]) + ' ]......') connHost.read_until(prompt + b'#', timeout=waitTime) connHost.write(b'terminal length 0\n') connHost.read_until(prompt + b'#', timeout=waitTime) connHost.write(b'show running-config\n') print('正在备份中... ' + str(dataList[2]) + ' ' + str(dataList[3]) + ' ' + str(dataList[4])) time.sleep(int(dataList[8])) configStatus = connHost.expect([prompt + b'#'], timeout=waitTime) openNote = open(configName, 'wb+') openNote.write(configStatus[2]) openNote.close() if configStatus[0] == 0: print('Save Success ! ' + configName) else: print('====================== ERROR =======================') print('Error Error !! 配置数据收集不完整,请校验配置正确性!') print('====================== ERROR =======================') connHost.close() except: configName = configName + '.fail' openNote = open(configName, 'wb+') openNote.close() print('=================== BACKUP FAIL ====================') print('BackUp Fail !! ' + str(dataList[2]) + ' ' + str(dataList[3]) + ' ' + str(dataList[4])) print(configName) print('=================== BACKUP FAIL ====================') # 华为/华三配置备份 def huaweiTelnet(dataList, invaildVar, waitTime): print('') try: configName = savePath + saveDate + '_' + str(dataList[3]) + '_' + str(dataList[4]) prompt = str(dataList[3]).encode('ascii') connHost = telnetlib.Telnet(str(dataList[4]).encode('ascii'), timeout=waitTime) print('正在连接设备: ' + str(dataList[4])) if str(dataList[5]) != invaildVar: connHost.read_until(b'Username:', timeout=waitTime) connHost.write(str(dataList[5]).encode('ascii') + b'\n') if str(dataList[6]) != invaildVar: connHost.read_until(b'Password:', timeout=waitTime) connHost.write(str(dataList[6]).encode('ascii') + b'\n') time.sleep(1) connHost.write(b'\n') if str(dataList[7]) != invaildVar: connHost.read_until(b'<' + prompt + b'>', timeout=waitTime) connHost.write(b'super\n') connHost.read_until(b'Password:', timeout=waitTime) connHost.write(str(dataList[7]).encode('ascii') + b'\n') connHost.read_until(b'<' + prompt + b'>', timeout=waitTime) connHost.write(b'system-view\n') else: connHost.read_until(b'<' + prompt + b'>', timeout=waitTime) connHost.write(b'system-view\n') print('TELNET登录成功[ ' + str(dataList[4]) + ' ]......') connHost.read_until(b'[' + prompt + b']', timeout=waitTime) connHost.write(b'user-interface vty 0 4\n') connHost.read_until(b'[' + prompt + b'-ui-vty0-4' + b']', timeout=waitTime) connHost.write(b'screen-length 0\n') connHost.read_until(b'[' + prompt + b'-ui-vty0-4' + b']', timeout=waitTime) connHost.write(b'quit\n') connHost.read_until(b'[' + prompt + b']', timeout=waitTime) connHost.write(b'display current-configuration\n') print('正在备份中... ' + str(dataList[2]) + ' ' + str(dataList[3]) + ' ' + str(dataList[4])) time.sleep(int(dataList[8])) openNote = open(configName, 'wb+') configStatus = connHost.expect([b'\[' + prompt + b']'], timeout=waitTime) openNote = open(configName, 'wb+') openNote.write(configStatus[2]) openNote.close() if configStatus[0] == 0: print('Save Success ! ' + configName) else: print('====================== ERROR =======================') print('Error Error !! 配置数据收集不完整,请校验配置正确性!') print('====================== ERROR =======================') connHost.close() except: configName = configName + '.fail' openNote = open(configName, 'wb+') openNote.close() print('=================== BACKUP FAIL ====================') print('BackUp Fail !! ' + str(dataList[2]) + ' ' + str(dataList[3]) + ' ' + str(dataList[4])) print(configName) print('=================== BACKUP FAIL ====================') # 程序执行 for row in range(2, int(useExcelSheel.max_row) + 1): dataList = [] for i in useExcelSheel[row]: dataList.append(i.value) if str(dataList[0]) == 'YES' and str(dataList[1]) == 'telnet': if str(dataList[2]) == 'cisco': ciscoTelnet(dataList, invaildVar, waitTime) if str(dataList[2]) == 'huawei' or str(dataList[2]) == 'h3c': huaweiTelnet(dataList, invaildVar, waitTime) if str(dataList[2]) == 'zte': ciscoTelnet(dataList, invaildVar, waitTime) # endTime = datetime.datetime.now() # print(endTime - startTime) |
"BACKUP.BAT"
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
:: ***** 编写日期:2021.12.24 @echo off :: ***** 切换至当前BAT文件所在目录 cd %~dp0 :: ***** 执行的PYTHON备份脚本 :: python.exe RouteOrSwitch.py ..\Python\python.exe RouteOrSwitch.py :: ***** 完成后提示信息 echo. echo 配置备份已完成,请手动校验数据完整性! echo 请按任意键退出! pause>nul |
六、结
由于本篇博客是不小心误删后再重新写的,而博主实在是没法再提起劲来用心写这一篇重复的博文了,所以,相对原来的那篇被误删的博文,本篇少了不小解释说明的内容,如果有什么疑问留言吧~
CISCO、HUAWEI、H3C自动化备份:等您坐沙发呢!