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

高洛峰
リリース: 2017-03-15 15:28:29
オリジナル
1548 人が閲覧しました

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

1. 要件

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

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


要件は非常に少ないので、簡単に言います:
1. ホストグループ化設定ファイルで実装できます(データを保存するために辞書を使用します) ).
2. ログイン機能が動作しません。グループを選択すると、グループ内の対応するホストのホスト名と IP アドレスが表示されます。 3. >>>cmd: df (複数のスレッドを開始するコマンドを入力します (グループ内のホストの数に応じて異なります)。グループ)同時に実行する) ------------h2-----------

>>>put test.yy(ローカルファイル) ファイル名(ローカルのtest.yyファイルをリモートホストの/rootディレクトリに転送します)
4.設定ファイルに記述できます。リモートホストを含​​む: ホスト名 IP ユーザー名 パスワード ポート


3 つ、ディレクトリ構造 およびソースコード
ディレクトリ構造:

from_windows.py (アップロードするファイル)

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

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)
ログイン後にコピー

Pythonの簡易ホストバッチ管理ツールを図解で詳しく解説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},
    }
}
ログイン後にコピー
テスト:

ハードウェア制限、テストするには仮想マシンを1台接続するだけで済みます~

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>>>
ログイン後にコピー
アップロード前には from_windows.py ファイルはありませんが、アップロード後は存在します!

以上がPythonの簡易ホストバッチ管理ツールを図解で詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!