2017-03-22 3 views
0

ich eine einfache fabfile mit dem Namen haben env_fabfile.pyStoff env.hosts nicht identifiziert

# env_fabfile.py 
# makes use of fab env variables 

from fabric.api import env, run 
def login(): 
    env.hosts = ['[email protected]:1234', '[email protected]:2345'] 
    env.passwords = {'[email protected]:1234': 'pass1', '[email protected]:2345': 'pass2'} 
    env.parallel=True 

def run_lsb_release(): 
    run('lsb_release -a') 

Jetzt laufe ich die oben die Fab-Befehl wie:

fab -f env_fabfile.py login run_lsb_release

Und es läuft perfekt (parallel) und liefert die gewünschte Ausgabe

Jetzt wollte ich eigentlich den Zeitunterschied zwischen wh berechnen de Das gleiche Skript wird in serial vs ausgeführt, wenn es parallel ausgeführt wird. Also, dies zu tun, schrieb ich den folgenden Python-Skript: timecal.py

# timecal.py 
# runs the fabfile once in serial and calculates the time 
# then runs the same file in parallel and calculates the time 

from fabric.api import env, run 
import time 

def login(): 
    print "in login" 
    env.hosts = ['[email protected]:1234', '[email protected]:2345'] 
    env.passwords = {'[email protected]:1234': 'pass1', '[email protected]:2345': 'pass2'} 

def parallel(status): 
    print "in parallel" 
    env.parallel=status 

def run_lsb_release(): 
    print "in run" 
    run('lsb_release -a') 

def do_serial(): 
    start_time = time.time() 
    parallel(False) 
    login() 
    run_lsb_release() 
    elapsed_time = time.time() - start_time 
    return elapsed_time 

def do_parallel(): 
    start_time = time.time() 
    parallel(True) 
    login() 
    run_lsb_release() 
    elapsed_time = time.time() - start_time 
    return elapsed_time 


if __name__ == '__main__': 
    print "Running in serial mode " 
    print "Total time taken ", do_serial() 

    print "Running in parallel mode" 
    print "Total time taken ", do_parallel() 

aber wenn ich laufe timecal.py als

python timecal.py

bekomme ich die unten auf stdout (abgesehen von dem Druck Aussagen im Code)

No hosts found. Please specify (single) host string for connection:

Ich verstehe nicht warum? Auch, wie kann das Skript behoben werden, so dass ich das erreichen, was ich will (wie in der Frage oben)

Bei dem Versuch, eine andere Version von timecal.py, wie:

from fabric.api import run, settings, env 
import time 

def do_parallel(): 
    start_time = time.time() 
    env.hosts = ['[email protected]:1234', '[email protected]:2345'] 
    env.passwords = {'[email protected]:1234': 'pass1', '[email protected]:2345': 'pass2'} 
    env.parallel=True 
    run('lsb_release -a') 
    elapsed_time = time.time() - start_time 
    return elapsed_time 

def do_serial(): 
    start_time = time.time() 
    with settings(host_string='host1', port=1234, user='user', password='pass1'): 
     run('lsb_release -a') 
    with settings(host_string='host2', port=2345, user='user', password='pass2'): 
     run('lsb_release -a') 
    elapsed_time = time.time() - start_time 
    return elapsed_time 

if __name__ == '__main__': 
    try: 
     print "Running in parallel mode" 
     print "Total time taken ", do_parallel() 

     print "Running in serial mode " 
     print "Total time taken ", do_serial() 
    except Exception as e: 
     print e 

I holen Sie sich die folgenden Fehler:

Fatal error: Needed to prompt for the target host connection string (host: None), but input would be ambiguous in parallel mode

ich verstehe nicht, warum ist der Gastgeber: None hier? Was ist falsch an dem Code?

Antwort

1

Die kurze Antwort ist, dass Sie nicht den env.hosts Wert die Art und Weise festgelegt, sollten Sie zur Zeit tun werden, und env.passowrds ist super-skizzen (gebrochen vielleicht?), Und it's recommended to use SSH key-based access, insbesondere leveraging native SSH config files.

Hier ist die modifizierte Version Ihres timecal.py-Skripts, die wie erwartet funktioniert, und ich werde einige der Unterschiede unten ausrufen.

# timecal.py 
# runs the fabfile once in serial and calculates the time 
# then runs the same file in parallel and calculates the time 

from fabric.api import env, run, execute, parallel 
import time 

env.use_ssh_config = True 
env.roledefs = { 
    "my_servers": ['server_1', 'server_2'] 
} 


def run_lsb_release(): 
    print "in run" 
    run('lsb_release -a') 


def do_task(task_func): 
    start_time = time.time() 
    execute(task_func, roles=['my_servers']) 
    elapsed_time = time.time() - start_time 
    return elapsed_time 


if __name__ == '__main__': 
    print "Running in serial mode " 
    print "Total time taken ", do_task(run_lsb_release) 

    print "Running in parallel mode" 
    print "Total time taken ", do_task(parallel(run_lsb_release)) 

Der Hauptunterschied ist mit env.roledefs und die SSH-Konfigurationsdatei, anstatt Hosts & Passwörter. Diese Werte funktionieren NICHT im parallelen Ausführungsmodus, da diese Aufgaben in separaten Threads ausgeführt werden. The docs sind ein wenig dünn, aber das ist im Grunde, warum Sie dieses Problem haben.