python 主机批量管理

一.需求

二.流程图



三.代码目录结构



四.源代码

small ansible.py(执行脚本)

    

import os,sys

base_path=os.path.dirname(os.path.dirname(__file__))
# print(base_path)
sys.path.append(base_path)

from core import main
from conf import setting

main.main()

# grouplist=setting.group_list()
# print(grouplist)



setings.py(定义组和帐号信息)

 
 
msg_dic = {
 "group1":{    #分组1
     "h1":{"IP":"192.168.117.11", "username":"root", "password":"26", "port":22},
     "h2":{"IP":"192.168.117.1", "username":"root", "password":"54", "port":22}

 },

   "group2":{    #分组2
       "h1":{"IP":"192.168.2.1", "username":"111", "password":"aaa", "port":22},
       "h2":{"IP":"192.168.2.2", "username":"222", "password":"bbb", "port":22},
       "h3":{"IP":"192.168.2.3", "username":"333", "password":"ccc", "port":22},

    },

     "group3":{
         "h1":{"IP":"192.168.179.13", "username":"root", "password":"11", "port":22},
     }
 }



main.py(主函数)


 
 
import configparser,paramiko,threading,os
from conf import settings




class client():

    def __init__(self,ip,username,passwd,port):
        self.ip=ip
        self.username=username
        self.passwd=passwd
        self.port=port

    def run(self,cmd):   #进行映射 执行相应的函数
        cmd_first=cmd.split()[0]
        if hasattr(self,cmd_first):
            func=getattr(self,cmd_first)
            func(cmd)
        else:
            print("命令不存在")

    def batch_run(self,cmd):


        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

        ssh.connect(hostname=self.ip, port=self.port, username=self.username, password=self.passwd)
        cmd_com=cmd.split()[1]
        print("--------")
        print(cmd_com)
        stdin, stdout, stderr = ssh.exec_command(cmd_com)
        result = stdout.read()

        print(result.decode())#不加decode打印出的内容为一行 
        ssh.close()


    def batch_put(self,cmd):
        local_file=cmd.split()[1]
        remote_file=cmd.split()[2]
        print("local:%s    remote:%s "%(local_file,remote_file))
        if os.path.isfile(local_file):
            transport = paramiko.Transport((self.ip, self.port))
            transport.connect(username=self.username, password=self.passwd)

            sftp = paramiko.SFTPClient.from_transport(transport)

            sftp.put(local_file, remote_file)



            transport.close()
        else:
            print("file is not exsit")

def show_group_list():
    for index,item in enumerate(settings.msg_dic,1):
        print(index,item,":",len(settings.msg_dic[item]))

    group=input(">>select group (ex group1):")
    group_check=settings.msg_dic.get(group)
    if group_check:
        for i in range(1,len(settings.msg_dic[group])+1):
            print(settings.msg_dic[group]["h"+str(i)]["IP"])
        return group_check
    else:
        print("group is not exsit")
        exit()

def thread(choose_group):
    thread_list=[]
    while True:
        cmd=input("input command >>>:")
        if cmd:              #如果输入为空则不执行
            for key in choose_group:
                IP=choose_group[key]["IP"]
                username=choose_group[key]["username"]
                passwd=choose_group[key]["password"]
                port=choose_group[key]["port"]
                func=client(IP,username,passwd,port)
 

                t=threading.Thread(target=func.run,args=(cmd,))
                t.start()
                thread_list.append(t)
            for i in thread_list:
                i.join()


def main():
    list_dir = show_group_list()
    thread(list_dir)



猜你喜欢

转载自blog.csdn.net/a824701419/article/details/80782195
今日推荐