2016-10-19 10 views
1

私は以前、関連する質問を:これをFabricを使用して並列実行するにはどうすればよいですか?

How to issue commands on remote hosts in parallel using Fabric without using a fabfile?

を、私はさまざまなテストホスト上で並行してテストを実行して問題を抱えています。

@parallel 
def run_test(arg_list): 
    # arg_list is a list of dictionary. Each entry in 
    # arg_list has a 'ip_address' and a 'test_config_file' 

    for x in arg_list: 
     ip_address = x['ip_address'] 
     test_config_file = x['test_config_file'] 
     env['host_string'] = ip_address 
     # The test program "test_localhost.py" is already on all the Test hosts 
     cmd = "/root/test_localhost.py --ip_addr=" + ip_address + " --config=" + test_config_file 
     run(cmd) 


if __name__ == '__main__': 

    env.parallel = True 

    # Each test host will have unique test_config_files 
    arg_list = list() 
    arg_list.append({'ip_address':'10.10.10.10', 'test_config_file': "config_01.json"}) 
    arg_list.append({'ip_address':'10.10.10.11', 'test_config_file': "config_02.json"}) 

    execute(run_test, arg_list) 

私は2+のテストホストに対してこのコードを実行しました:

私のコードは次のようになります。テストホストでテストが実行されているかどうかを確認するスクリプトがあります。テストは並行して実行されません。

代わりに、テストは順次実行されます。「test_localhost.py」は10.10.10.10で最初に実行され、その後は10.10.10.11で実行されます。

テストを並行して実行するために何か必要なことはありますか?

注:テスト用のホストごとに異なるテスト構成ファイルを送信しているため、fabfileを使用することはできません。

答えて

2

ここで私は何をしますか?異なるホストの異なるパラメータのためのトリックは、env context_managerに情報を追加して、タスクのホスト固有の引数を保持できるようにすることです。ホストが辞書に使用するキーまで一致し、パラレルコマンドがうまく動作することを確認してください。最後に、ファブリック内のタスクは通常、fabコマンドで実行されます。私はネイティブのPythonスクリプトを使用してそれを試したことはありませんし、結果が分からない場合や、特別な処理を行う必要があるかどうかはわかりません。ファブリックプロジェクトの一般的な形式は、fabfile.pyというファイルにタスクを定義し、fabを使用してそれらのタスクを実行することです。ファイルで

fabfile.pyと呼ばれる:

from fabric.decorators import task, parallel 
from fabric.operations import run 
from fabric.context_managers import env 

@task 
def run_test(arg_list): 
    # arg_list is a list of dictionary. Each entry in 
    # arg_list has a 'ip_address' and a 'test_config_file' 
    env.hosts = [ x['ip_address'] for x in arg_list ] 
    env.host_data = dict() 
    for x in arg_list: 
     env.host_data[x['ip_address']] = x 
    execute(run_command) 

@parallel 
def run_command(): 
    context = env.host_data[env.host] 
    cmd = '/root/test_localhost.py --ip_addr=%(ip_address)s --config=%(test_config_file)s' % context 
    run(cmd) 

@task 
def run_my_test(): 
    arg_list.append({'ip_address':'10.10.10.10', 'test_config_file': "config_01.json"}) 
    arg_list.append({'ip_address':'10.10.10.11', 'test_config_file': "config_02.json"}) 
    run_test(arg_list) 

コマンドライン実行から:

fab run_my_test 
+0

2PS、アドバイスに感謝が、必要な設定ファイルがあるので、私はfabfileを使用することはできません渡され、スクリプトによって解析されます。 私の場合、fabfile.pyは実行時引数を取る必要があります。 – SQA777

+0

ファブリックコマンドは実行時引数を取ることができます。 '@ task'で修飾された関数に引数を追加するだけです。 – 2ps

+0

2ps:env.host_dataは定義されていますか?私はあなたに非常に似ているように私のスクリプトを書きましたが、Pythonはこのラインで文句を言う: env.host_data [X [「のip_address」]] = X 私は、Python 2.7を使用していると私はfabric.context_manager – SQA777

関連する問題