Python實現自動備份網路設備配置

最近研究一個非常好使的能夠自動登錄網路設備並把想要的信息保存下來並且自動上傳到ftp伺服器的Python腳本,這裡主要跟大家分享一下Python NetMiko模塊的使用。

安裝方法: pip install netmiko

此庫已經被python收錄:pypi.python.org/pypi/ne

官方指導手冊:pynet.twb-tech.com/blog


實驗運行環境:

整個環境都在EVE-ng(Vmware Esxi上運行)的平台上運行

操作系統:Kali-linux(VMware Esxi主機上運行)

網路設備:思科路由器

Python編輯器:Sublime text 3.0

Python版本:Python3.5

需要準備的文件:ips和commands(ips文件存放IP地址列表,commands文件存放需要執行的命令,文件內容存放格式都是一個行一個)

實驗拓撲:

EVE-NG

演示代碼:

NetMiko主程序:

#!/usr/bin/python3.5# -*- coding: utf-8 -*-from netmiko import ConnectHandlerfrom ftp_client import main #導入ftp上傳模塊import osimport timeimport redef Cisco(ip): #cisco swith_config export function cisco_881 = { device_type: cisco_ios, ip: ip, username: cisco, password: cisco, port: 22, secret: cisco, verbose: False, }思科設備的username cisco privilege 15 password cisco,privilege 15許可權為最大可以執行的命令越多 print (u正在連接Devices:{0}
.format(ip)) net_connect = ConnectHandler(**cisco_881) net_connect.enable() timestr = time.strftime(%Y-%m-%d, time.localtime(time.time())) for cmds in open(commands, r): cmd = cmds.replace(
, ) filename = (u{0}_{1}_{2}.txt.format(ip,cmd.replace( ,_).replace(/,-), timestr)) save = open(/root/python_code/config_scrtpt/config/ + filename, w) print (u正在執行命令:
+ cmds) result = net_connect.send_command(cmds) time.sleep(1) save.write(result) print(u命令執行完畢,結果保存於當前目錄{0}中!
.format(filename)) save.close() net_connect.disconnect()if __name__ == __main__: for ips in open(ips,r): ip = ips.replace(
,) try: Cisco(ip) except Exception as e: print (連接超時! ,e) pass time.sleep(1) print (u=====上傳文件至目標伺服器=====) main() #ftp上傳主程序 print (u
文件上傳成功!)

FTP上傳主程序:

#!/usr/bin/python3.5# -*- coding: utf-8 -*-from ftplib import FTPimport reimport osdef ftpconnect(host, username, password): ftp = FTP() ftp.connect(host, 21) ftp.login(username, password) return ftpdef uploadfile(ftp, localpath, remotepath): bufsize = 1024 fp = open(localpath, rb) ftp.storbinary(STOR + remotepath, fp, bufsize) ftp.set_debuglevel(0) fp.close() def filename(): #獲取指定路徑下的所有文件將文件名存放到列表 f1 = os.getcwd() + /config/ f2 = os.listdir(f1) filename = [] for i in f2: #正則找出所有結尾為txt的文件,然後添加到filename列表裡 if .join(re.findall(.tx(t$),i)) == t: filename.append(i) return filenamedef main(): # print (正在連接伺服器...) ftp = ftpconnect(192.168.31.254, config, config) #獲取路徑/root/python_code/config_script path1 = os.getcwd() #/root/python_code/config_script + /config/ fullpath = path1 + /config/ # print (文件所在路徑+fullpath) #獲取待上傳的文件名 fn = filename() #文件上傳到ftp伺服器後的文件名稱,與源文件保持一致eg:123.txt fullremotepath = fn # print (fullremotepath) #本地路徑需要加上路徑+具體文件名eg:/root/python_code/config_script/123.txt fulllocalpath = [] for i in fn: fulllocalpath.append(fullpath + i) for r in range(len(fulllocalpath)): for l in range(len(fulllocalpath)):1,首先第一個for第一次循環第二個for也是第一次循環時r=0,l=0,r=l,此時p1和p2會被賦值,2,然後第二個for循環的第二次循環r依然=0,l=1,p1和p2不會被賦值3,當第一個for第二次循環時第二個for第一次循環r=1,l=0,p1和p2不會被賦值, 4,第二個for的第二次循環r=1,l=1,此時p1和p2會被賦值 if r == l: p1 = fulllocalpath[l] p2 = fullremotepath[r]#得出的結果就是uploadfile(ftp, /root/python_code/config_script/123.txt, 123.txt) uploadfile(ftp, p1, p2) print (列出目標伺服器文件列表:) ftp.dir() ftp.quit()if __name__ == __main__: main()

效果截圖:

如果目標關機或者埠不可達會返回time-out

程序執行過程中

文件上傳成功後list出所有文件名


推薦閱讀:

DevOps之我見
優維科技融資3000萬,DevOps 運維時代已來!
系統排除故障的九大「道」術
【玖陸零電力科技】配電室運維,讓您更省心。
[譯]一個系統管理員眼中的DevOps

TAG:Python | 運維自動化 | 網路工程師 |