实验原理:
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文章
277浏览量
19924 -
SSH
+关注
关注
0文章
185浏览量
16311 -
python
+关注
关注
56文章
4784浏览量
84502 -
华为交换机
+关注
关注
0文章
13浏览量
6299
原文标题:分别使用多线程多进程协程+paramiko在华为交换机批量快速进行配置(eNSP模拟器)
文章出处:【微信号:网络技术干货圈,微信公众号:网络技术干货圈】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论