Python自动化开发从浅入深-进阶(进程)
今天的作业涉及到了进程,那么就用作业来说明进程的用法:
这里我们定义了2个函数 getParamikoCmd 和 batchCmd,用于批量向远程服务器发送ssh命令,并返回执行结果。
执行batchCmd进行一些用户交互和参数获取(这里是一组服务器分组信息),循环发起进程批量执行ssh命令,每个进程调用getParamikoCmd 函数进行ssh命令执行。
进程之间是相互独立的,数据不会相互共享,这样可独立完成其任务而不会相互影响。
def getParamikoCmd(groupName,serverName,ip,port,username,passwod,cmd,lock): ''' 被进程调用:处理批量ssh命令 :param groupName: :param serverName: :param ip: :param port: :param username: :param passwod: :param cmd: :param lock: :return: ''' #lock.acquire() objParamiko = MyParamiko(paramiko,ip,port,username,passwod)#创建一个处理paramiko的实例 result,stdin,stderr = objParamiko.sshClientHandle(cmd)#获取ssh客户端句柄 print("服务器分组{}---服务器名称:{}:\n{}\n*******************************************************".format(groupName,serverName,str(result,'utf-8')))#打印读取的信息 #lock.release() #return result,stdin,stderr def batchCmd(serverGroupDict): ''' 批量命令处理程序,菜单中的 2 :param serverGroupDict: 服务器组信息字典 :return: ''' #print("batchCmd") cmdList = [] groupName = '' serverName = [] inpWho = input("向全部分组发送命令,请输入命令:'all'\n或 输入'服务器分组名称(如:group1)'向一个分组发送命令") inpCmd = input("发送命令>>>\n") lock = Lock() if inpWho == 'all':#向所有服务器组成员发信息 for k,v in serverGroupDict.items():#遍历组名称 groupName = k for k1,v1 in v.items():#遍历服务器名称,生成服务器参数列表 serverName.append(k1) cmdList.append(v1) for i in range(len(cmdList)):#遍历服务器参数列表 iPort = int(cmdList[i][1])#端口转为整数 #进程开始,传递:分组名,服务器名,ip port user password ,命令
p = Process(target=getParamikoCmd,args=(groupName,serverName[i],cmdList[i][0],iPort,cmdList[i][2],cmdList[i][3],inpCmd,lock)) p.start()#启动进程 p.join() cmdList = [] serverName = [] else:#选择分组 for k,v in serverGroupDict.items(): if inpWho == k: groupName = k for k1,v1 in v.items(): serverName.append(k1) cmdList.append(v1) for i in range(len(cmdList)):#遍历服务器参数列表 iPort = int(cmdList[i][1])#端口转为整数 p = Process(target=getParamikoCmd,args=(groupName,serverName[i],cmdList[i][0],iPort,cmdList[i][2],cmdList[i][3],inpCmd,lock))#生成一个进程对象,inpCmd为要执行的命令 p.start()#启动进程 p.join() cmdList = [] serverName = []