實驗原理:
python對于網絡設備的操作屬于I/O密集型,在腳本運行時,存在大量的等待時間。我們便可以利用這些空閑的時間,進行其他的操作。
由于python解釋器在同一時間只能運行一個線程,所以不存在真正意義上的同時配置不同的設備。在多線程、多進程和協程中推薦使用協程這種方法,讓一個線程不斷的切換執行的任務。
實驗拓撲:
cloud連接本機,ip地址為192.168.56.1,五臺交換機的配置的地址為192.168.1.201~205?,F在通過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文章
277瀏覽量
19923 -
SSH
+關注
關注
0文章
185瀏覽量
16304 -
python
+關注
關注
56文章
4782瀏覽量
84455 -
華為交換機
+關注
關注
0文章
13瀏覽量
6298
原文標題:分別使用多線程多進程協程+paramiko在華為交換機批量快速進行配置(eNSP模擬器)
文章出處:【微信號:網絡技術干貨圈,微信公眾號:網絡技術干貨圈】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論