本篇是基于pexpect的網(wǎng)絡(luò)自動(dòng)化配置的總結(jié)帖减响,目前需要實(shí)現(xiàn)的功能均已良好實(shí)現(xiàn),期間遇到多個(gè)困難龟糕,在此進(jìn)行復(fù)盤。
第一個(gè)問題悔耘,for 循環(huán)取出ip列表讲岁, ip.txt里基于回車作分割,里面存放了所有網(wǎng)絡(luò)設(shè)備的ip地址衬以, 如何用for循環(huán)逐個(gè)取出催首,并且做ssh登錄。
在解決了第一個(gè)問題后泄鹏,開始做配置備份腳本,本質(zhì)理論就是用child.logfile做日志記錄輸出秧耗,通過pexpecet? 把dis cu ,show run ,等命令 备籽,打到網(wǎng)絡(luò)設(shè)備上去。有好多種網(wǎng)絡(luò)配置備份的方法分井,本人認(rèn)為還是pexpect最好车猬,原因如下:
1:pexpect靈活 ,只要網(wǎng)絡(luò)設(shè)備能支持telnet ssh登錄尺锚,即可進(jìn)行配置抓取珠闰,不需要其它模塊支持,比如偏門的神碼設(shè)備瘫辩,或中興設(shè)備伏嗜,或型號(hào)較為老舊的設(shè)備,只要支持telnet ssh即可伐厌。
2: pexpect 安全性高承绸, 把命令打到設(shè)備上去,打錯(cuò)了挣轨,問題也不大军熏, 比如dis cu? ,誤打成了? diss cuu, 網(wǎng)絡(luò)設(shè)備不識(shí)別這條命令卷扮,只會(huì)報(bào)錯(cuò)忽略荡澎, 雖然命令執(zhí)行出錯(cuò)均践,但不會(huì)出亂子。例外是把router ospf , 打成了 no router ospf . 這種錯(cuò)誤是不行的摩幔。
3:pexpect的備份基于命令輸出記錄日志彤委,那同樣可以做設(shè)備配置。經(jīng)多次大坑后總結(jié)热鞍, pexpect在sendline之后葫慎, 不一定總是要做 pexpect expect ,只要加下time.sleep.薇宠,讓命令稍后再打即可偷办, 前提是要求網(wǎng)工算好每條命令在Sendline后的輸出反饋時(shí)間。
4: 基于pexpect的配置備份要求設(shè)備配置支持terminal length 0之類的命令澄港,目前備份過的設(shè)備均有類似命令椒涯,因?yàn)槿绻麤]有類似命令,在輸出后會(huì)提示類似? ? more? ?, 則無(wú)法記錄輸出記錄日志和配置回梧。
因此最初基于上面完成了全網(wǎng)網(wǎng)絡(luò)設(shè)備的配置废岂,通過httpd? + fotiguard firewall+ crontal做了一套配置自動(dòng)備份平臺(tái)。
后來(lái)又發(fā)現(xiàn)一個(gè)問題狱意,二層的交換機(jī)有時(shí)候會(huì)down掉湖苞,不通。當(dāng)在ip.txt列表文件中的某個(gè)交換機(jī)不通后详囤,pexpect登錄交換機(jī)就會(huì)timeout,腳本就會(huì)報(bào)錯(cuò)退出财骨,導(dǎo)致后續(xù)交換機(jī)全部備份失敗。
后來(lái)為了解決這個(gè)問題藏姐, 加了一個(gè)if 判斷隆箩, 取出pexpect登錄交換機(jī)的返回值 ,當(dāng)index的值為eof 或timeout也就是報(bào)錯(cuò)時(shí)羔杨, pass掉捌臊,忽略這個(gè)錯(cuò)誤,繼續(xù)執(zhí)行后續(xù)的代碼兜材,避免了因?yàn)槟硞€(gè)交換機(jī)下線不通理澎,導(dǎo)致代碼報(bào)錯(cuò)退出,后續(xù)設(shè)備無(wú)法備份的情況出現(xiàn)护姆,所以在這里其實(shí)用continue更合適矾端,?
continue會(huì)不再執(zhí)行后續(xù)的代碼, 重新返回到for循環(huán)卵皂。
腳本大概類似于下面這樣:
腳本做到這一步秩铆, 依然還面臨這兩個(gè)重大問題:
1: 不支持多線程, 100多交換機(jī)需要半個(gè)多小時(shí)才能備份完配置。
2:交換機(jī)的命令是用Sendline的方式一條一條打進(jìn)去的殴玛, 沒有做到模塊化捅膘。
第二個(gè)問題需要盡快解決,因?yàn)楣救毡竟緯?huì)有20幾臺(tái)cisco交換機(jī)要配置滚粟, 供應(yīng)商會(huì)配置好管理地址寻仗, 腳本里給每臺(tái)交換機(jī)用Sendline改改改,或者每臺(tái)交換機(jī)再登錄凡壤, 都會(huì)很麻煩署尤。
為了解決第二個(gè)問題, 腳本調(diào)用兩個(gè)文件亚侠, 一個(gè)是ip.txt ,一個(gè)是command.txt , 前者用于存放交換機(jī)的ip地址曹体,后者用于存放交換機(jī)的配置命令。
做到這一步硝烂, 只剩下多線程了箕别,腳本如下:
大量配置命令需要發(fā)送到網(wǎng)絡(luò)設(shè)備的話, 需要考慮到 time.sleep()時(shí)間滞谢。
=================
20190826更新
在飛塔上遇到了一個(gè)坑串稀,因?yàn)閒orti的輸出特別快,但沒考慮到輸出特別長(zhǎng)狮杨,導(dǎo)致show的輸出被截?cái)啵?剛好斷在有 關(guān)鍵字 console的部分母截, 以為這個(gè)輸出就完整了。
考慮到forti支持通過ftp備份橄教,因?yàn)橛胿sftpd搭建了一個(gè)Ftp服務(wù)器微酬, 每個(gè)ftp用戶都單獨(dú)新建了家目錄,然后forti全部備份到ftp上颤陶。?
之所以需要為每臺(tái)設(shè)備新建用戶, 是因?yàn)樵趂orti上執(zhí)行ftp 備份沒有辦法變更路徑陷遮。
waf? 在web上可以直接指定配置Ftp 備份滓走,奇怪的是命令行沒有ftp備份方式,只有tftp備份帽馋。
之所以重新變更了配置備份搅方,是因?yàn)榭拥?臺(tái)1500D , 4個(gè)電源模塊全掛了绽族。