2016-07-09 24 views
2

Ich habe ein Python-Skript, das Fabric verwendet, um Tests auf Remote-Hosts zu starten, die otuput-Datei der Tests abzurufen und ein Parsing durchzuführen. Das Python-Skript ist keine Fabdatei.Wie können Sie Befehle auf Remote-Hosts parallel mit Fabric ohne Verwendung einer Fabdatei ausgeben?

Ich möchte die Tests parallel starten und ausführen. Ich habe gelesen, dass ich den "@parallel" -Dekorierer benutze, aber alle Beispiele, die ich gelesen habe, haben das Skript als Fabfile.

Mein Code ist so etwas wie dieses:

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)   

Dies ist eine vereinfachte Version des Codes. Ich habe nicht alles enthalten, aber ich gehe um Konfigurationsinformationen der Gastgeber, so dass schränkt mich bei der Verwendung dieses Skript als fabfile, wo ich etwas ausgeben wie:

„fab -H '10 .10.10.10' copy_test“

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

ich konnte RUN_TEST() unter Verwendung der threading.Threads Bibliothek ausführen, aber ich würde lieber tun, als letztes Mittel.

Wie Sie sehen können, führe ich dies nicht als Fabfile.

Gibt es eine Möglichkeit, run_test() mit dem parallelen Ausführungsmodell von Fabric auszuführen, ohne mein Skript als "fabfile" auszuführen?

Antwort

0

kann ich nicht kommentieren, so werde ich eine Antwort setzen Sie Ihre ändern Haupt zu:

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)  

, wenn Sie die fonction rufen mit execute() und Ihre fonction hat die @parallel es wird parallel

gestartet werden
+0

Nur eine andere Sache, wissen Sie über die Umgebungsvariable des Stoffes? Weil Sie Ihre Host-Liste in 'env.hosts' speichern könnten und dann müssten Sie sie nicht als Argumente übergeben – pwnsauce

+0

pwnsauce, danke für den Vorschlag. Ich werde es versuchen und sehen, ob es mein Problem löst. – SQA777