實(shí)驗(yàn)原理:
python對(duì)于網(wǎng)絡(luò)設(shè)備的操作屬于I/O密集型,在腳本運(yùn)行時(shí),存在大量的等待時(shí)間。我們便可以利用這些空閑的時(shí)間,進(jìn)行其他的操作。
由于python解釋器在同一時(shí)間只能運(yùn)行一個(gè)線程,所以不存在真正意義上的同時(shí)配置不同的設(shè)備。在多線程、多進(jìn)程和協(xié)程中推薦使用協(xié)程這種方法,讓一個(gè)線程不斷的切換執(zhí)行的任務(wù)。
實(shí)驗(yàn)拓?fù)洌?/p>
cloud連接本機(jī),ip地址為192.168.56.1,五臺(tái)交換機(jī)的配置的地址為192.168.1.201~205?,F(xiàn)在通過paramiko,ssh進(jìn)入五臺(tái)設(shè)備,并且在五臺(tái)設(shè)備上分別創(chuàng)建將192.168.56.0 0.0.0.255通告進(jìn)入OSPF。
版本:python3.9
實(shí)驗(yàn)步驟:
一、ssh配置:
##創(chuàng)建秘鑰 [sw2]dsalocal-key-paircreate ##配置SSH認(rèn)證類型(密碼/其他) [sw2]sshuserprinauthentication-typepassword [sw2]sshuserprinservice-typestelnet [sw2]stelnetserverenable ##配置認(rèn)證模式 [sw2]user-interfacevty04 [sw2-ui-vty0-4]authentication-modeaaa//配置認(rèn)證模式 [sw2-ui-vty0-4]protocolinboundssh//允許ssh連接虛擬終端 ##配置本地用戶信息 [sw2]aaa [sw2-aaa]local-userprinpasswordcipherHuawei@123 [sw2-aaa]local-userprinprivilegelevel15 [sw2-aaa]local-userprinservice-typessh
二、paramiko腳本:
ssh_device.py: 使用paramiko連接設(shè)備
importtime importparamiko defssh_multicmd(ip,username,password,cmd_list,asy_id,wait_time=2,verbose=True): try: print('tryssh'+str(asy_id)) ssh=paramiko.SSHClient() ssh.load_system_host_keys() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(ip,22,username,password,timeout=5,compress=True) print("Youhavesuccessfullyconnectto"+ip+' ') exceptparamiko.ssh_exception.AuthenticationException: print("Userauthenticationfailedfor"+ip+".") return #激活交互式shell command=ssh.invoke_shell() #等待網(wǎng)絡(luò)設(shè)備回應(yīng) command.send("system ") #執(zhí)行具體的命令 forcmdincmd_list: command.send(cmd) time.sleep(wait_time) #獲取路由器返回信息 output=command.recv(65535) x=output.decode('ascii') #關(guān)閉連接 ssh.close() ifverbose: print(x) returnx if__name__=='__main__': #執(zhí)行命令,查看showversion的值,和配置OSPF commands=['ospf1 ','area0 ','network192.168.56.00.0.0.255 '] return_results=ssh_multicmd('192.168.56.205','prin','Huawei@123',commands,1)
三、協(xié)程腳本與測(cè)試:
coroutine_ssh.py: 使用協(xié)程調(diào)用ssh_multicmd函數(shù)進(jìn)行快速批量配置
fromssh_deviceimportssh_multicmd importgevent fromgeventimportmonkey monkey.patch_all() commands=['ospf1 ','area0 ','network192.168.56.00.0.0.255 '] defget_ssh_result(i): print("start",i) #執(zhí)行的任務(wù)函數(shù) result=ssh_multicmd('192.168.56.20'+str(i),'prin','Huawei@123',commands,i,verbose=False) print("end",i) returnresult #同時(shí)執(zhí)行5個(gè)任務(wù),id為1-5 tasks=[gevent.spawn(get_ssh_result,i)foriin[1,2,3,4,5]] all_result=gevent.joinall(tasks) #獲取執(zhí)行信息 forxinall_result: print(x.get())
協(xié)程測(cè)試結(jié)果: 可以看到,多個(gè)任務(wù)‘同時(shí)’執(zhí)行,節(jié)約時(shí)間。
四、多進(jìn)程/多線程腳本配置和測(cè)試
multiprocessing_ssh.py: 使用多進(jìn)程或者多線程來(lái)配置腳本
fromssh_deviceimportssh_multicmd frommultiprocessingimportcpu_count,PoolasProcessPool frommultiprocessing.poolimportThreadPool frommultiprocessingimportfreeze_support results=[] commands=['ospf1 ','area0 ','network192.168.56.00.0.0.255 '] #多進(jìn)程 defmulti_process(ip_prefix,suffix,username,password,commands): freeze_support() cpus=cpu_count()#得到內(nèi)核數(shù)的方法 pool=ProcessPool(cpus)#有效控制并發(fā)進(jìn)程或者線程數(shù),默認(rèn)為內(nèi)核數(shù)(推薦) #設(shè)置對(duì)應(yīng)函數(shù)和傳入的參數(shù) foriinsuffix: result=pool.apply_async(ssh_multicmd,args=(ip_prefix+str(i),username,password,commands,i,2,False)) results.append(result) #調(diào)用join之前,先調(diào)用close函數(shù),否則會(huì)出錯(cuò)。執(zhí)行完close后不會(huì)有新的進(jìn)程加入到pool,join函數(shù)等待所有子進(jìn)程結(jié)束 pool.close() pool.join() forinfoinresults: print(info.get()) #多線程 defmulti_thread(ip_prefix,suffix,username,password,commands): pool=ThreadPool(100) #設(shè)置對(duì)應(yīng)函數(shù)和傳入的參數(shù) foriinsuffix: result=pool.apply_async(ssh_multicmd,args=(ip_prefix+str(i),username,password,commands,i,2,False)) results.append(result) #調(diào)用join之前,先調(diào)用close函數(shù),否則會(huì)出錯(cuò)。執(zhí)行完close后不會(huì)有新的進(jìn)程加入到pool,join函數(shù)等待所有子進(jìn)程結(jié)束 pool.close() pool.join() forinfoinresults: print(info.get()) if__name__=='__main__': #多線程 #multi_thread('192.168.56.20',range(1,6),'prin','Huawei@123',commands) #多進(jìn)程 multi_process('192.168.56.20',range(1,6),'prin','Huawei@123',commands)
協(xié)程測(cè)試結(jié)果: 同樣多個(gè)任務(wù)‘同時(shí)’進(jìn)行,節(jié)約了時(shí)間。
審核編輯:劉清
-
多線程
+關(guān)注
關(guān)注
0文章
277瀏覽量
19897 -
SSH
+關(guān)注
關(guān)注
0文章
184瀏覽量
16283 -
python
+關(guān)注
關(guān)注
55文章
4767瀏覽量
84375 -
華為交換機(jī)
+關(guān)注
關(guān)注
0文章
13瀏覽量
6292
原文標(biāo)題:分別使用多線程多進(jìn)程協(xié)程+paramiko在華為交換機(jī)批量快速進(jìn)行配置(eNSP模擬器)
文章出處:【微信號(hào):網(wǎng)絡(luò)技術(shù)干貨圈,微信公眾號(hào):網(wǎng)絡(luò)技術(shù)干貨圈】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論