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 = []
posted @ 2016-03-19 18:19  赵洪  阅读(263)  评论(0编辑  收藏  举报