1 批量主机管理 工具开发
实现批量命令执行、文件分发
core.py
1 import sys 2 3 sys.path.append('../conf') 4 import settings 5 import paramiko 6 from multiprocessing import Process 7 8 9 class operation_client(object): 10 # 远程操作主机 11 def __init__(self, host, port, username, password, cmd): 12 self.host = host 13 self.port = port 14 self.username = username 15 self.password = password 16 self.cmd = cmd 17 18 def run(self): 19 ''' 20 起线程连接远程主机后调用 21 :return: 22 ''' 23 cmd_str = self.cmd.split()[0] 24 if hasattr(self, cmd_str): # 反射 eg:调用upload方法 25 getattr(self, cmd_str)() 26 else: 27 # setattr(x,'y',v)is equivalent to ``x.y=v'' 28 setattr(self, cmd_str, self.command) 29 getattr(self, cmd_str)() # 调用command方法,执行批量命令处理 30 31 def command(self): 32 """批量命令处理""" 33 ssh = paramiko.SSHClient() # 创建ssh对象 34 # 允许连接不在know_hosts文件中的主机 35 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 36 ssh.connect(hostname=self.host, port=self.port, username=self.username, password=self.password) 37 stdin, stdout, stderr = ssh.exec_command(self.cmd) 38 result = stdout.read() 39 print("%s".center(30, "-") % self.host) 40 print(result.decode()) 41 ssh.close() 42 43 def upload(self): 44 """上传文件""" 45 filename = self.cmd.split()[1] # 要上传的文件 46 transport = paramiko.Transport((self.host, self.port)) 47 transport.connect(username=self.username, password=self.password) 48 sftp = paramiko.SFTPClient.from_transport(transport) 49 sftp.put(filename, filename.split('\')[-1]) 50 print('上传文件:' + str(filename) + ' 成功!') 51 transport.close() 52 53 54 def show_host_list(): 55 """通过选择分组显示主机名与IP""" 56 num_list = [] 57 for index, key in enumerate(settings.msg_dic): 58 num_list.append(key) 59 print('主机组编号:' + str(index + 1), ' 主机组名:' + str(key), ' 主机数量:' + str(len(settings.msg_dic[key]))) 60 while True: 61 choose_host_list = input("请输入批量操作的主机组编号(或者输入q退出):>>>").strip() 62 if choose_host_list.lower() == 'q': 63 break 64 host_dic = settings.msg_dic.get(num_list[int(choose_host_list) - 1]) 65 if host_dic: 66 for key in host_dic: 67 print(key, host_dic[key]["IP"]) 68 return host_dic 69 else: 70 print("对不起!您输入的主机组编号有误! ") 71 continue 72 73 74 def interactive(host_dic): 75 ''' 76 根据选择的分组主机多线程批量操作 77 :param host_dic: 78 :return: 79 ''' 80 str_info = ''' 81 批量主机管理工具功能说明: 82 1、批量文件上传:upload file_path 83 例如:upload C:\Users\YG\Desktop\file.txt 84 85 2、批量操作主机:df -h 、ls 、pwd ...... 86 ''' 87 print(str_info) 88 thread_list = [] 89 while True: 90 command = input("请输入操作命令(或者输入q退出):>>>").strip() 91 if command.lower() == 'q': 92 print('感谢使用批量主机管理工具!再见!') 93 break 94 elif command: 95 for key in host_dic: 96 host, port, username, password = host_dic[key]["IP"], host_dic[key]["port"], host_dic[key]["username"], 97 host_dic[key]["password"] 98 func = operation_client(host, port, username, password, command) # 实例化类 99 t = Process(target=func.run) # 起线程 100 t.start() 101 thread_list.append(t) 102 for t in thread_list: 103 t.join() # 主线程等待子线程执行完毕 104 else: 105 continue 106 107 108 def run(): 109 host_dic = show_host_list() 110 interactive(host_dic)
settings.py
1 msg_dic = { 2 "group1": 3 { 4 "client_1": {"IP": "192.168.111.2", "username": "root", "password": "root", "port": 8080}, 5 }, 6 "group2": 7 { 8 "client_1": {"IP": "192.168.121.6", "username": "root", "password": "root", "port": 8080}, 9 "client_2": {"IP": "192.168.134.8", "username": "root", "password": "root", "port": 8080}, 10 }, 11 }
main.py
1 import sys 2 sys.path.append('../src') 3 import core 4 5 if __name__ == "__main__": 6 core.run()