2017-05-02 10 views
-1

ファイルからサーバー名、他のファイルからコマンド名を読み取り、すべてのサーバーですべてのコマンドを実行して出力を出力するスクリプトを作成しました。forループの並列処理を利用する

import os, paramiko 
cmdlist =[] 

with open('command.txt') as f: 
    for line in f: 
     cmdlist.append(line.rstrip()) 

with open('server.txt') as f: 
    for line in f: 
     server = line.rstrip() 
     username, password = ('root', 'password') 
     ssh = paramiko.SSHClient() 
     ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy() 
     ssh.load_host_keys(os.path.expanduser(os.path.join("~", ".ssh", "known_hosts"))) 
     ssh.connect(server, username=username, timeout=60) 
     print "For Server " + server 
     for y in cmdlist: 
      ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command(y) 
      output1 = ssh_stdout.read() 
      print ">", output1.rstrip() 
     ssh.close() 

問題は、2番目のforループがシーケンシャルに実行されるため、時間がかかりすぎるということです。サーバーの順序は関係ありません。私は自分のスクリプトがすべてのサーバー上で並列にコマンドを実行し、次にファイルでコンパイルすることを望みます。

私はこれを試しました。私は「fast_process」と呼ばれる機能で、コードの上に置くと、以下のようなコードを記述します。

if __name__ == '__main__': 
    pool = Pool()       
    pool.map(fast_process) 

しかし、これは私に多くの引数を依頼しているようだが、私の機能は、任意の引数を取りません。私に何ができる?

+0

'pool.map(fast_process、range(times))'?とにかく、正確なトレースバックと完全なコードを投稿することは大いに役立ちます。 – lolopop

答えて

1

mapは、シーケンス機能を取る関数であり、シーケンスの各要素に関数を適用(マップのビットPythonのバージョンを簡素化)

それで、あなたが必要なもののサーバのシーケンスを作成して適用することですそれらに機能する。

import os, paramiko 

with open('command.txt') as f: 
    commands = tuple(line.rstrip() for line in f) 

with open('server.txt') as f: 
    servers = tuple(line.rstrip() for line in f) 

username, password = 'username', 'password' 
pool = Pool() 


def exec_commands(server): 
     ssh = paramiko.SSHClient() 
     ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()), 
     ssh.load_host_keys(os.path.expanduser('~/.ssh/known_hosts')) 
     ssh.connect(server, username=username, timeout=60) 
     for cmd in commands: 
      ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command(cmd) 
      output = ssh_stdout.read() 
      print('>', output.rstrip()) 
     ssh.close() 

pool.map(exec_command, servers) 
+0

コードは無限の時間 "pool.map(exec_commands、servers)"でハングします。私はpool.mapの後にpool.terminateを試みましたが、それは助けになりませんでした。 –

+0

まあ、 'pool.map'自体がブロックされているだけなので、データを並列に処理するだけなので、' pool.terminate'を追加した場合はそれが役に立たなくなります。問題は 'exec_commands' - >そこにある何かにあるべきです。デバッグする必要がありますが、いずれの場合でも、ブロック操作にタイムアウトを追加する必要があります。 – user1685095

関連する問題