Python簡單主機批量管理工具
阿新 • • 發佈:2017-11-18
== interact 主程 hid abs port view opened choose
View Code
Python簡單主機批量管理工具
一、程序介紹
需求:
簡單主機批量管理工具
需求:
1.主機分組
2.主機信息使用配置文件
3.可批量執行命令、發送文件,結果實時返回
4.主機用戶名密碼、端口可以不同
5.執行遠程命令使用paramiko模塊
程序結構:
Host_manage/ #程序目錄
├── bin #啟動程序目錄
│ └── start.py #啟動程序文件
├── conf #配置目錄
│ ├── __pycache__
│ │ └── settings.cpython-36.pyc
│ └── settings.py #配置文件
├── core #主程序目錄
│ ├── __pycache__
│ │ └── src.cpython-36.pyc
│ └── src.py #主程序
└── log
二、流程圖
三、代碼
bin/start.py
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 4 import os 5 import sys 6 7 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 8 sys.path.append(BASE_DIR) 9 print(BASE_DIR) 10 11 from core import src 12 13 if __name__ == ‘__main__‘: 14 src.run()
conf/settings.py
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 4 host_dic = { 5 "group1":{ #分組1 6 "h1":{"IP":"192.168.11.1", "username":"test001", "password":"abc", "port":22}, 7 "h2":{"IP":"192.168.11.2", "username":"test002", "password":"abc", "port":22}, 8View Code}, 9 "group2":{ #分組2 10 "h1":{"IP":"192.168.21.1", "username":"test003", "password":"abc", "port":22}, 11 "h2":{"IP":"192.168.21.2", "username":"test004", "password":"abc", "port":22}, 12 "h3":{"IP":"192.168.21.3", "username":"test005", "password":"abc", "port":22}, 13 }, 14 }
core/src.py
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 4 from conf import settings 5 import paramiko 6 import threading 7 import os 8 9 class Host_remote(): 10 ‘‘‘ 11 批量遠程管理用戶組主機 12 ‘‘‘ 13 #初始化 14 def __init__(self, host, port ,username, password, cmd): 15 self.host = host 16 self.port = port 17 self.username = username 18 self.password = password 19 self.cmd = cmd 20 21 def run(self): 22 ‘‘‘ 23 用進程 連接遠程 主機後調用 24 :return: 25 ‘‘‘ 26 cmd_str = self.cmd.split()[0] 27 if hasattr(self, cmd_str): #反射 :調用put方法 28 getattr(self, cmd_str)() 29 else: 30 setattr(self, cmd_str, self.cmd) 31 getattr(self, cmd_str)() #調用cmd方法,執行批量命令處理 32 33 def cmd(self): 34 ‘‘‘ 35 批量命令處理 36 :return: 37 ‘‘‘ 38 ssh = paramiko.SSHClient() #創建ssh對象 39 #允許連接不在know_hosts文件中的主機 40 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 41 ssh.connect(hostname=self.host,port=self.port,username=self.username,password=self.password) 42 stdin,stdout,stderr = ssh.exec_cmd(self.cmd) 43 result = stdout.read() 44 print("%s".center(40, "-") % self.host) 45 print(result.decode()) 46 ssh.close() 47 48 def put(self): 49 ‘‘‘ 50 發送文件 51 :return: 52 ‘‘‘ 53 filename = self.cmd.split()[1] #要上傳的文件 54 transport = paramiko.Transport((self.host, self.port)) 55 transport.connect(username=self.username, password=self.password) 56 sftp = paramiko.SFTPClient.from_transport(transport) 57 sftp.put(filename, filename) 58 print("put sucesss") 59 60 transport.close() 61 62 63 def show_host_list(): 64 ‘‘‘ 65 選擇用戶組 顯示 主機名 與 IP 66 :return: 67 ‘‘‘ 68 for index, key in enumerate(settings.host_dic): 69 print("%s\033[34m 主機組:%s \033[0m \033[33m 主機數量:%s\033[0m" %(index + 1,key,len(settings.host_dic[key]))) 70 while True: 71 choose_host_list = input(">>(請輸入用戶組編號如:group1): ").strip() 72 host_dic = settings.host_dic.get(choose_host_list) 73 if host_dic: 74 for key in host_dic: 75 print(key, host_dic[key]["IP"]) 76 return host_dic 77 else: 78 print("不退出此組!") 79 80 81 def interactive(choose_host_list): 82 ‘‘‘ 83 根據選擇的 用戶組的 主機起 多個線程進行 批量交互 84 :param choose_host_list: 85 :return: 86 ‘‘‘ 87 thread_list = [] 88 while True: 89 cmd = input(">>: ").strip() 90 if cmd: 91 for key in choose_host_list: 92 host, port, username, password = choose_host_list[key]["IP"], choose_host_list[key]["port"], 93 choose_host_list[key]["username"], choose_host_listy[key]["password"] 94 func = Host_remote(host, port, username, password, cmd) # 實例化類 95 t = threading.Thread(target=func.run) # 起線程 96 t.start() 97 thread_list.append(t) 98 for t in thread_list: 99 t.join() # 主線程等待子線程執行完畢 100 else: 101 continue 102 103 104 def run(): 105 choose_host_list = show_host_list() 106 interactive(choose_host_list)View Code
Python簡單主機批量管理工具