>  기사  >  백엔드 개발  >  Python의 간단한 호스트 배치 관리 도구에 대한 자세한 설명

Python의 간단한 호스트 배치 관리 도구에 대한 자세한 설명

高洛峰
高洛峰원래의
2017-02-04 15:12:411214검색

오늘 아주 간단한 작은 프로젝트를 했는데 파라미코 모듈의 위력을 느꼈고, 리눅스 실력도 부족하다는 걸 느꼈습니다~~

1. >

Python의 간단한 호스트 배치 관리 도구에 대한 자세한 설명2. 간단한 수요 분석 및 흐름도


수요가 매우 적으므로 간단히 말씀드리겠습니다.


1. 그룹화를 구성할 수 있습니다.(저는 사전을 사용하여 데이터를 저장합니다.)


2. 로그인 기능이 작동하지 않습니다. 그룹을 선택하면 해당 그룹에 속한 호스트의 이름과 IP 주소를 확인할 수 있습니다.


3. >>>cmd: df (여러 스레드를 시작하려면 명령을 입력하세요. (그룹에 있는 스레드 수에 따라 다름) 호스트에 따라 다름) 동시에 실행)


출력:


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


......(명령에서 반환된 데이터)


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


......


>> >test.yy(로컬 파일) 파일명 입력(로컬 test.yy 파일을 원격 호스트의 /root 디렉터리로 전송)


4. 구성 파일에 작성할 수 있습니다. 원격 호스트 포함: 호스트 이름 IP 사용자 이름 비밀번호 포트


흐름도

Python의 간단한 호스트 배치 관리 도구에 대한 자세한 설명디렉터리 구조 및 소스 코드


디렉토리 구조:

Python의 간단한 호스트 배치 관리 도구에 대한 자세한 설명from_windows.py(업로드할 파일)


main.py(일괄 호스트 관리 인터페이스)

"""批量主机管理接口"""
 
import core
 
if __name__ == "__main__":
  core.run()

core.py(인터페이스에서 호출되는 핵심 코드)

"""核心代码"""
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(구성 파일)

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

테스트:


하드웨어 제한, 가상머신 하나만 연결하면 테스트할 수 있어요~

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
 
>>>

업로드 전에는 from_windows.py 파일이 없는데, 업로드 후에는 있어요!

Python의 간단한 호스트 배치 관리 도구에 대한 자세한 설명 그게 다입니다. 이 기사의 전체 내용이 모든 사람의 학습에 도움이 되기를 바라며, 또한 모든 사람이 PHP 중국어 웹사이트를 지지해 주기를 바랍니다.

파이썬의 간단한 호스트 배치 관리 도구에 대한 자세한 설명은 PHP 중국어 홈페이지를 참고해주세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.