摘要
本文主要写用python脚本远程连接多台服务器,然后批量执行命令,最终返回命令执行结果。
这个可以说是Ansible,Puppet等工具的最简单的雏形。
做运维的同学应该都知道的。
正文
multi_task.py
#_*_coding:utf-8_*_import multiprocessingimport paramikoimport getpassimport ConfigParserclass MultiTask(object): '''handles all the multi task works''' def __init__(self): msg = self._interactive() self.__run_cmd(msg) def __show_cmd_list(self,msg): '''show all available cmd list''' help_content = ''' run_cmd run cmd on multiple hosts run_cmd -u remote_user -g group1,group2 -cmd pwd run_cmd -u remote_user -re regular expression -cmd pwd ''' def _interactive(self):
msg = [] nodes = [] #parse setting.conf Config = ConfigParser.ConfigParser() Config.read("./setting.conf") groups = Config.sections() print groups # Input group name while True: try: group = raw_input("\033[33;1mPlease Input Group Name:\033[0m").strip() if len(group) == 0 : continue elif group not in groups: print "Wrong group name ! Please input again!" continue else :
print "You have choose group %s , the children in this group are :" % group break except (KeyboardInterrupt): print '\n' exit(1) items = dict(Config.items(group)) for node in items.values(): nodes.append(node) print node # Input command while True: try: cmd = raw_input("\033[33;1mPlease Input Command:\033[0m").strip() if len(cmd) == 0 : continue else: break except (KeyboardInterrupt): print '\n' exit(1) print "Command you input is %s" % cmd
# Input username and password while True: try: username = raw_input("\033[33;1mPlease Input username:\033[0m").strip() if len(username) == 0 : continue else: break except (KeyboardInterrupt): print '\n' exit(1) password = getpass.getpass() msg = [nodes,username,password,cmd] print msg return msg def __run_cmd(self,msg): pool = multiprocessing.Pool(5) lock = multiprocessing.Manager().Lock() res_list = [] #msg = [['10.9.214.10','haohzhang','871102_Hadoop'],['10.9.214.105','haohzhang','
871102_Hadoop'],['10.9.214.106','haohzhang','871102_Hadoop']] for host in msg[0]: p = pool.apply_async(run_task, args=(host,msg[1:],lock)) res_list.append(p) pool.close() pool.join() print '--------All task are finished!-------'def run_task(host,msg,lock): ip = host username = msg[0] password = msg[1] cmd = msg[2] print "ip %s, username %s, passwd %s, cmd %s" % (ip, username, password, cmd) port = 22 s = paramiko.SSHClient() #绑定实例 s.load_system_host_keys() #加载本机know host主机文件 s.set_missing_host_key_policy(paramiko.AutoAddPolicy()) try: s.connect(ip,port
,username,password,timeout=5) #连接远程主机 stdin,stdout,stderr = s.exec_command(cmd) #执行命令 cmd_result = stdout.read(),stderr.read() #读取命令结果 lock.acquire() print '----------- HOST:%s IP:%s -------------' %(username,ip) for line in cmd_result: print line, lock.release() s.close() except Exception,e: print '----------- HOST:%s IP:%s -------------' %(username,ip) print '\033[31;1mError:%s\033[0m' % e# vim:ts=4:sw=4:expandtab
setting.conf
[datanodes]node1=10.9.214.10node2=10.9.214.105node3=10.9.214.106node4=10.9.214.113[masternodes]masternode=10.9.214.15
main.py
from multi_task import MultiTask, run_tasktasks = MultiTask()
运行方法:
python main.py
解释: