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

#!/usr/bin/env python
#_*_coding:utf-8_*_

import os
import sys

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)
print(BASE_DIR)

from core import src

if __name__ == '__main__':
    src.run()

 conf/settings.py

#!/usr/bin/env python
#_*_coding:utf-8_*_

host_dic = {
    "group1":{    #分组1
        "h1":{"IP":"192.168.11.1", "username":"test001", "password":"abc", "port":22},
        "h2":{"IP":"192.168.11.2", "username":"test002", "password":"abc", "port":22},
    },
    "group2":{    #分组2
        "h1":{"IP":"192.168.21.1", "username":"test003", "password":"abc", "port":22},
        "h2":{"IP":"192.168.21.2", "username":"test004", "password":"abc", "port":22},
        "h3":{"IP":"192.168.21.3", "username":"test005", "password":"abc", "port":22},
    },
}

 core/src.py

#!/usr/bin/env python
#_*_coding:utf-8_*_

from conf import settings
import paramiko
import threading
import os

class Host_remote():
    '''
    批量远程管理用户组主机
    '''
    #初始化
    def __init__(self, host, port ,username, password, cmd):
        self.host = host
        self.port = port
        self.username = username
        self.password = password
        self.cmd = cmd

    def run(self):
        '''
        用进程 连接远程 主机后调用
        :return:
        '''
        cmd_str = self.cmd.split()[0]
        if hasattr(self, cmd_str):      #反射 :调用put方法
            getattr(self, cmd_str)()
        else:
            setattr(self, cmd_str, self.cmd)
            getattr(self, cmd_str)()  #调用cmd方法,执行批量命令处理

    def cmd(self):
        '''
        批量命令处理
        :return:
        '''
        ssh = paramiko.SSHClient()  #创建ssh对象
        #允许连接不在know_hosts文件中的主机
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh.connect(hostname=self.host,port=self.port,username=self.username,password=self.password)
        stdin,stdout,stderr = ssh.exec_cmd(self.cmd)
        result = stdout.read()
        print("%s".center(40, "-") % self.host)
        print(result.decode())
        ssh.close()

    def put(self):
        '''
        发送文件
        :return:
        '''
        filename = self.cmd.split()[1]  #要上传的文件
        transport = paramiko.Transport((self.host, self.port))
        transport.connect(username=self.username, password=self.password)
        sftp = paramiko.SFTPClient.from_transport(transport)
        sftp.put(filename, filename)
        print("put sucesss")

        transport.close()


def show_host_list():
    '''
    选择用户组 显示 主机名 与 IP
    :return:
    '''
    for index, key in enumerate(settings.host_dic):
        print("%s\033[34m 主机组:%s \033[0m \033[33m 主机数量:%s\033[0m" %(index + 1,key,len(settings.host_dic[key])))
    while True:
        choose_host_list = input(">>(请输入用户组编号如:group1): ").strip()
        host_dic = settings.host_dic.get(choose_host_list)
        if host_dic:
            for key in host_dic:
                print(key, host_dic[key]["IP"])
            return host_dic
        else:
            print("不退出此组!")


def interactive(choose_host_list):
    '''
    根据选择的 用户组的 主机起 多个线程进行 批量交互
    :param choose_host_list:
    :return:
    '''
    thread_list = []
    while True:
        cmd = input(">>: ").strip()
        if cmd:
            for key in choose_host_list:
                host, port, username, password = choose_host_list[key]["IP"], choose_host_list[key]["port"], \
                                                 choose_host_list[key]["username"], choose_host_listy[key]["password"]
                func = Host_remote(host, port, username, password, cmd)  # 实例化类
                t = threading.Thread(target=func.run)  # 起线程
                t.start()
                thread_list.append(t)
            for t in thread_list:
                t.join()  # 主线程等待子线程执行完毕
        else:
            continue


def run():
    choose_host_list = show_host_list()
    interactive(choose_host_list)
 

猜你喜欢

转载自www.cnblogs.com/fuyuteng/p/9212162.html