ホームページ  >  記事  >  バックエンド開発  >  Pythonの簡易ホストバッチ管理ツールを詳しく解説

Pythonの簡易ホストバッチ管理ツールを詳しく解説

高洛峰
高洛峰オリジナル
2017-02-04 15:12:411214ブラウズ

今日は非常に単純な小さなプロジェクトを実行しましたが、paramikoモジュールの威力を感じましたが、私のLinuxスキルが十分ではないことも感じました~~

1. 要件

Pythonの簡易ホストバッチ管理ツールを詳しく解説

2. 簡単な要件分析とフローチャート

要件はほとんどないので、簡単に説明します。

1. ホストのグループ化は設定ファイルを通じて実装できます (データの保存に辞書を使用します)

2. ログイン機能は使用できません。グループを選択すると、グループ内の対応するホストのホスト名と IP アドレスが表示されます

3. >>>cmd (ホストの数に応じて、コマンドを入力します。がグループに属している) を同時に実行します)

Output:

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

...(dataコマンドで返される)

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

...

>>>put test .yy (ローカルファイル) ファイル名 (ローカルの test.yy ファイルをリモートホストの /root ディレクトリに転送します)

4. 設定ファイルに記述できます。リモートホストを含​​む: ホスト名 IP ユーザー名 パスワード ポート

フローチャート

Pythonの簡易ホストバッチ管理ツールを詳しく解説

3. ディレクトリ構造とソースコード

ディレクトリ構造:

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の簡易ホストバッチ管理ツールを詳しく解説

以上がこの記事の全内容であり、皆さんの学習に役立つことを願っています。そして皆さんも中国語のウェブサイトをサポートしてくれることを願っています。

Python のシンプルなホスト バッチ管理ツールに関する詳細な記事については、PHP 中国語 Web サイトに注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。