實驗原理:
python對于網絡設備的操作屬于I/O密集型,在腳本運行時,存在大量的等待時間。我們便可以利用這些空閑的時間,進行其他的操作。
由于python解釋器在同一時間只能運行一個線程,所以不存在真正意義上的同時配置不同的設備。在多線程、多進程和協程中推薦使用協程這種方法,讓一個線程不斷的切換執行的任務。
實驗拓撲:
cloud連接本機,ip地址為192.168.56.1,五臺交換機的配置的地址為192.168.1.201~205。現在通過paramiko,ssh進入五臺設備,并且在五臺設備上分別創建將192.168.56.0 0.0.0.255通告進入OSPF。
版本:python3.9
實驗步驟:
一、ssh配置:
##創建秘鑰 [sw2]dsalocal-key-paircreate ##配置SSH認證類型(密碼/其他) [sw2]sshuserprinauthentication-typepassword [sw2]sshuserprinservice-typestelnet [sw2]stelnetserverenable ##配置認證模式 [sw2]user-interfacevty04 [sw2-ui-vty0-4]authentication-modeaaa//配置認證模式 [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連接設備
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() #等待網絡設備回應 command.send("system ") #執行具體的命令 forcmdincmd_list: command.send(cmd) time.sleep(wait_time) #獲取路由器返回信息 output=command.recv(65535) x=output.decode('ascii') #關閉連接 ssh.close() ifverbose: print(x) returnx if__name__=='__main__': #執行命令,查看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)
三、協程腳本與測試:
coroutine_ssh.py: 使用協程調用ssh_multicmd函數進行快速批量配置
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) #執行的任務函數 result=ssh_multicmd('192.168.56.20'+str(i),'prin','Huawei@123',commands,i,verbose=False) print("end",i) returnresult #同時執行5個任務,id為1-5 tasks=[gevent.spawn(get_ssh_result,i)foriin[1,2,3,4,5]] all_result=gevent.joinall(tasks) #獲取執行信息 forxinall_result: print(x.get())
協程測試結果: 可以看到,多個任務‘同時’執行,節約時間。
四、多進程/多線程腳本配置和測試
multiprocessing_ssh.py: 使用多進程或者多線程來配置腳本
fromssh_deviceimportssh_multicmd frommultiprocessingimportcpu_count,PoolasProcessPool frommultiprocessing.poolimportThreadPool frommultiprocessingimportfreeze_support results=[] commands=['ospf1 ','area0 ','network192.168.56.00.0.0.255 '] #多進程 defmulti_process(ip_prefix,suffix,username,password,commands): freeze_support() cpus=cpu_count()#得到內核數的方法 pool=ProcessPool(cpus)#有效控制并發進程或者線程數,默認為內核數(推薦) #設置對應函數和傳入的參數 foriinsuffix: result=pool.apply_async(ssh_multicmd,args=(ip_prefix+str(i),username,password,commands,i,2,False)) results.append(result) #調用join之前,先調用close函數,否則會出錯。執行完close后不會有新的進程加入到pool,join函數等待所有子進程結束 pool.close() pool.join() forinfoinresults: print(info.get()) #多線程 defmulti_thread(ip_prefix,suffix,username,password,commands): pool=ThreadPool(100) #設置對應函數和傳入的參數 foriinsuffix: result=pool.apply_async(ssh_multicmd,args=(ip_prefix+str(i),username,password,commands,i,2,False)) results.append(result) #調用join之前,先調用close函數,否則會出錯。執行完close后不會有新的進程加入到pool,join函數等待所有子進程結束 pool.close() pool.join() forinfoinresults: print(info.get()) if__name__=='__main__': #多線程 #multi_thread('192.168.56.20',range(1,6),'prin','Huawei@123',commands) #多進程 multi_process('192.168.56.20',range(1,6),'prin','Huawei@123',commands)
協程測試結果: 同樣多個任務‘同時’進行,節約了時間。
審核編輯:劉清
-
多線程
+關注
關注
0文章
278瀏覽量
20022 -
SSH
+關注
關注
0文章
189瀏覽量
16359 -
python
+關注
關注
56文章
4800瀏覽量
84820 -
華為交換機
+關注
關注
0文章
13瀏覽量
6312
原文標題:分別使用多線程多進程協程+paramiko在華為交換機批量快速進行配置(eNSP模擬器)
文章出處:【微信號:網絡技術干貨圈,微信公眾號:網絡技術干貨圈】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
使用paramiko在eNSP的交換機中批量創建VLAN
![使用<b class='flag-5'>paramiko</b>在eNSP的<b class='flag-5'>交換機</b>中<b class='flag-5'>批量</b>創建VLAN](https://file1.elecfans.com/web2/M00/BD/89/wKgZomWrmACAbrVJAAAy03ICO24920.png)
多線程和多進程的區別
python多線程和多進程對比
LINUX系統下多線程與多進程性能分析
如何選好多線程和多進程
![如何選好<b class='flag-5'>多線程</b>和<b class='flag-5'>多進程</b>](https://file.elecfans.com/web1/M00/50/9B/pIYBAFr1Ub6AeeozAAAPOPJtzso177.png)
多進程與多線程的深度比較
淺談Linux網絡編程中的多進程和多線程
![淺談Linux網絡編程中的<b class='flag-5'>多進程</b>和<b class='flag-5'>多線程</b>](https://file1.elecfans.com/web2/M00/8F/C5/wKgaomTSAv-AIthnAAZCl1xl1VM169.jpg)
Linux系統上多線程和多進程的運行效率
![Linux系統上<b class='flag-5'>多線程</b>和<b class='flag-5'>多進程</b>的運行效率](https://file1.elecfans.com/web2/M00/AD/6A/wKgaomVNmzGARi3NAAH_Fup2hME169.jpg)
你還是分不清多進程和多線程嗎?一文搞懂!
Python中多線程和多進程的區別
![Python中<b class='flag-5'>多線程</b>和<b class='flag-5'>多進程</b>的區別](https://file1.elecfans.com/web2/M00/0A/EF/wKgaomcYcmaAS08XAAAsH7JtzO0544.png)
評論