2016-07-09 3 views
2

私はFabricを使用してリモートホスト上でテストを起動し、テストのotuputファイルを取得し、解析を行うPythonスクリプトを用意しています。 Pythonスクリプトはファブファイルではありません。fabfileを使用せずにFabricを使用してリモートホスト上で並列にコマンドを発行するにはどうすればよいですか?

テストを並行して起動して実行したいと思います。私は "@parallel"デコレータの使い方を読んだことがありますが、私が読んだ例ではスクリプトがfabfileとしてあります。これは、コードの簡易版である

from fabric.api import * 

# Copy the testfile on each of the hosts. This is sequential, it could be 
# done in parallel but doing it in parallel is not that important 
def copy_test(host_list, testfile_name): 
    for x in host_list: 
     env['host_string'] = x 

     target_testfile_name = "/tmp/" + testfile_name 

     put(testfile_name, target_testfile_name) 


@parallel # Would this decorator work? 
def run_test(host_list, testfile_name): 

    target_testfile_name = "/tmp/" + testfile_name 
    for x in host_list: 
     env['host_string'] = x 
     run(target_testfile_name) 


if __name__ == '__main__': 

    HOSTS = ['10.10.10.10', '10.10.10.11', '10.10.10.12', '10.10.10.13'] 

    testfile_name = "foo.py" 

    copy_test(HOSTS, testfile_name) 

    # I would like to launch run_test() in parallel 
    run_test(HOSTS, testfile_name)   

私のコードは次のようなものです。私はすべてを含めていないが、それは私が何か発行fabfileとしてこのスクリプトを使用して、私を制限して、私は、ホストの設定情報を中心に渡す:「FAB -H '10 .10.10.10' copy_test」

"FAB -H '10 .10.10.10' RUN_TEST" -P

私は(RUN_TESTを実行することができる)threading.Threadsライブラリを使用したが、私はむしろ、最後の手段としてあることをするでしょう。

ご覧のとおり、私はこれをファブファイルとして実行していません。

"fabfile"としてスクリプトを実行せずに、Fabricの並列実行モデルを使用してrun_test()を実行する方法はありますか?

答えて

0

私はそう私はあなたのメインを変更答えを出してあげるコメントすることはできません:あなたは​​とfonctionを呼び出し、あなたのfonctionは、それが並列

に発売されます @parallelを持っている場合

if __name__ == '__main__': 

    HOSTS = ['10.10.10.10', '10.10.10.11', '10.10.10.12', '10.10.10.13'] 

    testfile_name = "foo.py" 

    execute(copy_test,HOSTS, testfile_name) 

    # I would like to launch run_test() in parallel 
    execute(run_test,HOSTS, testfile_name)  

+0

もう一つのことは、ファブリックの環境変数について知っていますか? 'env.hosts'にあなたのホストリストを保存することができるので、引数として渡す必要はありません – pwnsauce

+0

pwnsauce、提案に感謝します。私はそれを試し、私の問題を解決するかどうかを見ます。 – SQA777

関連する問題