利用Pool类多进程实现批量主机管理
1 #!/usr/bin/python 2 # -*- coding: UTF-8 -*- 3 # Author: liulixin 4 # Time: 2017-03-02 5 # Description: Achieve the Multiple Processes(High Concurrent) to execute single or multiple commands functions by pool class of Python Lang. 6 7 import time 8 import commands, subprocess 9 import os, re, sys 10 import paramiko 11 from multiprocessing import Pool 12 13 # print color 14 COLOR_PINK = ‘\033[95m‘ 15 COLOR_BLUE = ‘\033[94m‘ 16 COLOR_GREEN = ‘\033[92m‘ 17 COLOR_YELLOW = ‘\033[93m‘ 18 COLOR_RED = ‘\033[91m‘ 19 COLOR_DEFAULT = ‘\033[0m‘ 20 21 def Check_IP(ip): 22 ip_str = r‘^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$‘ 23 if re.match(ip_str, ip): 24 return True 25 else: 26 return False 27 28 def Get_IPS(ipfile): 29 ‘‘‘Generate ip list.‘‘‘ 30 ips = [] 31 with open(ipfile) as iplist: 32 content = iplist.readlines() 33 for line in content: 34 if line.startswith(‘#‘): 35 continue 36 elif Check_IP(line.strip(‘\n‘)): 37 ips.append(line.strip(‘\n‘)) 38 else: 39 print ‘%s is invalid ip address!‘ % line.strip(‘\n‘) 40 continue 41 return ips 42 43 def concurrentFunc(ip, cmd): 44 ‘‘‘single cmd to exec...‘‘‘ 45 #RET = subprocess.check_output("ssh [email protected]%s 2> /dev/null mkdir /data/rtmpd && mv /opt/soft/rtmpd/logs/ /data/rtmpd/logs && ln -s /data/rtmpd/logs/ /opt/soft/rtmpd/logs" % ip, shell = True) 46 #status, output = commands.getstatusoutput("ssh [email protected]%s 2> /dev/null grep ‘^PasswordAuthentication yes‘ /etc/ssh/sshd_config" % ip) 47 #status, output = commands.getstatusoutput("ssh [email protected]%s 2> /dev/null mkdir /data/rtmpd && mv /opt/soft/rtmpd/logs/ /data/rtmpd/logs && ln -s /data/rtmpd/logs/ /opt/soft/rtmpd/logs" % ip) 48 #return ip+": "+output+", status: "+bytes(status) 49 #return ip+": "+RET 50 ‘‘‘multiple cmd to exec...‘‘‘ 51 PORT = 22 52 USER = "root" 53 KEY = "/home/liulixin/.ssh/known_hosts" 54 ssh = paramiko.SSHClient() 55 try: 56 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 57 ssh.connect(ip, PORT, USER, KEY, timeout=10) 58 except paramiko.AuthenticationException: 59 print ip+" ssh timeout, continue..." 60 return "SSH ERROR, exit..." 61 output = [] 62 output.append(ip) 63 for m in cmd: 64 stdin, stdout, stderr = ssh.exec_command(m) 65 output.append(stdout.readlines()) 66 return output 67 68 def callBackFunc(ret): 69 print "This is callback func of %s" % ret[0] 70 71 def output(res_list): 72 print "%s=================RESULT====================%s" % (COLOR_GREEN, COLOR_DEFAULT) 73 for res in res_list: 74 try: 75 print res.get()[0] + " -> " + ‘‘.join(res.get()[1]) 76 except Exception, e: 77 print "%sOUTPUT ERROR: %s %s" % (COLOR_YELLOW, e, COLOR_DEFAULT) 78 continue 79 80 if __name__ == ‘__main__‘: 81 ipfile = sys.argv[1] 82 if os.path.isfile(ipfile): 83 ips = Get_IPS(ipfile) 84 elif Check_IP(ipfile): 85 ips = [sys.argv[1]] 86 else: 87 print ‘%s is invalid ip address!‘ % ipfile 88 sys.exit(1) 89 90 res_list = [] 91 #cmd = [‘ls -l /opt/soft/rtmpd/logs |awk \‘{print $9,$10,$11}\‘‘, ‘ls -l /opt/soft/rtmpd/logs/error.log |awk \‘{print $6" "$7" "$8}\‘‘] 92 cmd = [‘/opt/soft/ats/bin/traffic_ctl config status‘] 93 t_start=time.time() 94 #pool = Pool(32) 95 pool = Pool(10) 96 for ip in ips: 97 #维持执行的进程总数为processes,当一个进程执行完毕后会添加新的进程进去 98 res = pool.apply_async(func=concurrentFunc, args=(ip, cmd,), callback=callBackFunc) 99 res_list.append(res) 100 pool.close() 101 pool.join() 102 pool.terminate() 103 output(res_list) 104 t_end=time.time() 105 t=t_end-t_start 106 print ‘%sDealt %d, used time is :%s.%s‘ % (COLOR_BLUE, len(res_list), t, COLOR_DEFAULT)
时间: 2024-10-08 03:24:32