Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte grafische Erläuterung des einfachen Host-Batch-Management-Tools von Python

Detaillierte grafische Erläuterung des einfachen Host-Batch-Management-Tools von Python

高洛峰
高洛峰Original
2017-03-15 15:28:291549Durchsuche

Ich habe heute ein sehr einfaches kleines Projekt gemacht, und ich hatte auch das Gefühl, dass meine Linux-Kenntnisse nicht gut waren~~

1. Anforderungen

Detaillierte grafische Erläuterung des einfachen Host-Batch-Management-Tools von Python

2. Einfache Bedarfsanalyse und Flussdiagramm


Es gibt nur sehr wenige Anforderungen, daher sage ich einfach:
 1. Die Host--Gruppierung kann durch Konfigurationsdatei (Ich verwende ein Wörterbuch zum Speichern von Daten).
 2. Die Anmeldefunktion funktioniert nicht. Nachdem Sie eine Gruppe ausgewählt haben, können Sie den Hostnamen und die IP-Adresse des entsprechenden Hosts in der Gruppe anzeigen
 3. >>>cmd: df (Geben Sie den Befehl ein, um mehrere Threads zu starten (abhängig davon, wie viele es in der Gruppe gibt) Hängt vom Host-Computer ab)
Ausgabe:
————————————— ———————h1———————————— ——— … (Die vom Befehl zurückgegebenen Daten)
---------------------------------------------- --- --
……
  >>>put test.yy (local file)
filename (put local Der Test. yy-Datei wird in das /root-Verzeichnis des Remote-Hosts übertragen) 4. Sie kann in die Konfigurationsdatei geschrieben werden. Einschließlich des Remote-Hosts: Hostname IP Benutzername Passwort Port

Flussdiagramm

Detaillierte grafische Erläuterung des einfachen Host-Batch-Management-Tools von Python

3.

Verzeichnisstruktur und Quellcode

Verzeichnisstruktur:

Detaillierte grafische Erläuterung des einfachen Host-Batch-Management-Tools von Python

from_windows.py (die Datei, die von hochgeladen werden soll)

main.py(Batch Host ManagementSchnittstelle)

"""批量主机管理接口"""

import core

if name == "main":
    core.run()

core.py (Kerncode, aufgerufen von der Schnittstelle)

"""核心代码"""
import settings
import paramiko
import threading
import os


class REMOTE_HOST(object):
    #远程操作主机
    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):
        """起线程连接远程主机后调用"""
        cmd_str = self.cmd.split()[0]
        if hasattr(self, cmd_str):      #反射 eg:调用put方法
            getattr(self, cmd_str)()
        else:
            #setattr(x,'y',v)is  equivalent  to   ``x.y=v''
            setattr(self, cmd_str, self.command)
            getattr(self, cmd_str)()  #调用command方法,执行批量命令处理

    def command(self):
        """批量命令处理"""
        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_command(self.cmd)
        result = stdout.read()
        print("%s".center(50, "-") % self.host)
        print(result.decode())
        ssh.close()

    def put(self):
        """上传文件"""
        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"""
    for index, key in enumerate(settings.msg_dic):
        print(index + 1, key, len(settings.msg_dic[key]))
    while True:
        choose_host_list = input(">>>(eg:group1)").strip()
        host_dic = settings.msg_dic.get(choose_host_list)
        if host_dic:
            #print(host_dic)
            for key in host_dic:
                print(key, host_dic[key]["IP"])
            return host_dic
        else:
            print("NO exit this group!")


def interactive(choose_host_list):
    """根据选择的分组主机起多个线程进行批量交互"""
    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_list[key]["password"]
                func = REMOTE_HOST(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)

settings.py (Konfigurationsdatei)

"""配置文件"""

msg_dic = {
    "group1":{    #分组1
        "h1":{"IP":"192.168.1.1", "username":"11", "password":"aa", "port":22},
        "h2":{"IP":"192.168.1.2", "username":"22", "password":"bb", "port":22},
        "h3":{"IP":"192.168.1.3", "username":"33", "password":"cc", "port":22},
        "h4":{"IP":"192.168.1.4", "username":"44", "password":"dd", "port":22},
        "h5":{"IP":"192.168.1.5", "username":"55", "password":"ee", "port":22},
        "h6":{"IP":"192.168.1.6", "username":"66", "password":"ff", "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},
        "h4":{"IP":"192.168.2.4", "username":"444", "password":"ddd", "port":22},
        "h5":{"IP":"192.168.2.5", "username":"555", "password":"eee", "port":22},
        "h6":{"IP":"192.168.2.6", "username":"666", "password":"fff", "port":22},
        "h7":{"IP":"192.168.2.7", "username":"777", "password":"ggg", "port":22},
        "h8":{"IP":"192.168.2.8", "username":"888", "password":"hhh", "port":22},
    },

    "group3":{
        "h1":{"IP":"192.168.179.133", "username":"root", "password":"zcl", "port":22},
    }
}

Test:

Hardwareeinschränkung, ich muss zum Testen nur eine virtuelle Maschine anschließen~

C:\Python34\python3.exe C:/Users/Administrator/PycharmProjects/laonanhai/host_manage/main.py1 group1 6
2 group3 1
3 group2 8
>>>(eg:group1)group3
h1 192.168.179.133
>>>put from_windows.py
put sucesss>>>
>>>ls------------------------192.168.179.133------------------------anaconda-ks.cfg
database_test
from_windows.py
install.log
install.log.syslog
m
oot
\root
tmp\from_windows.py>>>
Vor dem Hochladen gab es keine from_windows.py-Datei, aber nach dem Hochladen gab es eine!


Detaillierte grafische Erläuterung des einfachen Host-Batch-Management-Tools von Python

Das obige ist der detaillierte Inhalt vonDetaillierte grafische Erläuterung des einfachen Host-Batch-Management-Tools von Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn