Heim  >  Artikel  >  Backend-Entwicklung  >  Ausführliche Erläuterung des einfachen Host-Batch-Management-Tools von Python

Ausführliche Erläuterung des einfachen Host-Batch-Management-Tools von Python

高洛峰
高洛峰Original
2017-02-04 15:12:411248Durchsuche

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

1 >

Ausführliche Erläuterung des einfachen Host-Batch-Management-Tools von Python2. Einfache Bedarfsanalyse und Flussdiagramm


Die Nachfrage ist sehr gering, ich sage einfach:


1 Gruppierung kann konfiguriert werden. Dateiimplementierung (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 (abhängig davon, wie viele Threads sich in der Gruppe befinden) Abhängig vom Host) gleichzeitig ausführen)


Ausgabe:


----------- --h1---------- ---


......(vom Befehl zurückgegebene Daten)


--- ---------h2------- -----


......


>> >Dateiname test.yy (lokale Datei) eingeben (die lokale Datei test.yy in das /root-Verzeichnis des Remote-Hosts übertragen)


4. Kann in die Konfigurationsdatei geschrieben werden. Einschließlich des Remote-Hosts: Hostname IP Benutzername Passwort Port


Flussdiagramm

Ausführliche Erläuterung des einfachen Host-Batch-Management-Tools von Python3. Verzeichnisstruktur und Quellcode


Verzeichnisstruktur:

Ausführliche Erläuterung des einfachen Host-Batch-Management-Tools von Pythonfrom_windows.py (hochzuladende Datei)


main.py (Batch-Host-Verwaltungsschnittstelle)

core.py (Kerncode, aufgerufen von der Schnittstelle)
"""批量主机管理接口"""
 
import core
 
if __name__ == "__main__":
  core.run()

settings.py (Konfigurationsdatei)
"""核心代码"""
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)

Test:
"""配置文件"""
 
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},
  }
}


Hardwareeinschränkung, ich muss zum Testen nur eine Verbindung zu einer virtuellen Maschine herstellen~

Vor dem Hochladen gab es keine from_windows.py-Datei, aber nach dem Hochladen gibt es sie!
C:\Python34\python3.exe C:/Users/Administrator/PycharmProjects/laonanhai/host_manage/main.py
1 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
 
>>>

Ausführliche Erläuterung des einfachen Host-Batch-Management-Tools von Python Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass er zum Lernen aller beiträgt. Ich hoffe auch, dass jeder die PHP-Chinesisch-Website unterstützt.

Ausführlichere Erläuterungen zu den einfachen Host-Batch-Management-Tools von Python finden Sie auf der chinesischen PHP-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