1. 程式人生 > >Python簡單主機批量管理工具

Python簡單主機批量管理工具

== interact 主程 hid abs port view opened choose

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()
View Code

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},
 8
}, 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 }
View Code

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簡單主機批量管理工具