2016-10-19 8 views
1

fragte ich eine ähnliche Frage früher:Wie kann ich dies mit Fabric parallel ausführen lassen?

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

Ich habe Probleme Ausführung Tests parallel auf verschiedenen Test Hosts haben.

Mein Code sieht wie folgt aus:

@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) 

ich diesen Code gegen 2+ Test Hosts ausgeführt haben. Ich habe ein Skript, das überprüft, ob die Tests auf den Test-Hosts laufen. Die Tests werden nicht parallel ausgeführt.

Stattdessen werden die Tests sequenziell ausgeführt. Die Datei "test_localhost.py" wird zuerst am 10.10.10.10 ausgeführt. Nach Abschluss der Tests wird sie am 10.10.10.11 ausgeführt.

Gibt es noch etwas, was ich tun muss, um die Tests parallel laufen zu lassen?

Hinweis: Ich kann fabfile nicht verwenden, da ich verschiedene Testkonfigurationsdateien für jeden Testhost sende.

Antwort

2

Hier ist, was ich tun würde. Der Trick für verschiedene Parameter für verschiedene Hosts besteht darin, dem env context_manager Informationen hinzuzufügen, damit Sie hostspezifische Argumente für eine Aufgabe erfassen können. Stellen Sie nur sicher, dass der Host mit dem Schlüssel übereinstimmt, den Sie für das Wörterbuch verwenden, und die parallelen Befehle funktionieren einwandfrei. Schließlich werden Tasks in Fabric normalerweise über den Befehl fab ausgeführt. Ich habe es noch nie mit einem nativen Python-Skript versucht und bin mir nicht sicher, welche Auswirkungen es hat oder ob eine spezielle Behandlung erforderlich ist. Das typische Format für ein Fabric-Projekt besteht darin, Tasks in einer Datei namens fabfile.py zu definieren, und diese Tasks können unter Verwendung von fab ausgeführt werden.

In einer Datei namens 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) 

in der Befehlszeile:

fab run_my_test 
+0

2ps, danke für den Rat, aber ich kann keine fabfile verwenden, da es Konfigurationsdateien, die brauchen übergeben werden, dann vom Skript analysiert. In meinem Fall muss die fabfile.py Laufzeitargumente nehmen. – SQA777

+0

Fabric-Befehle können Laufzeitargumente annehmen. Fügen Sie einfach Argumente zur Funktion hinzu, die mit '@ task' verziert sind. – 2ps

+0

2ps: Ist env.host_data definiert? Ich schrieb meinen Skript zu sein, sehr ähnlich wie bei Ihnen, aber Python klagt an dieser Linie: env.host_data [x [ ‚ip_adresse‘]] = x Ich verwende Python 2.7 und ich importierte das env-Modul von fabric.context_manager – SQA777

Verwandte Themen