2012-07-22 17 views
5

Sto scrivendo uno script per avviare un esperimento di generazione del carico su diversi host. Potrei scrivere uno script bash per avviare più sessioni ssh, ma speravo di usare qualcosa di più strutturato. Dal momento che utilizzo Python per la maggior parte dei miei script, ho pensato che Fabric sembrasse una buona opzione.Passaggio di argomenti diversi a diversi host in Fabric

L'unico problema è che ho bisogno di passare una piccola quantità di dati specifici dell'host con ciascun comando (in realtà solo un id o contatore), e mi piacerebbe eseguirli in parallelo.

In altre parole, vorrei fare qualcosa di simile al seguente, dove host_num è diverso (eventualmente appena incrementato) per ogni host.

@parallel 
def launch(): 
    with cd('/working/dir'): 
     run("./start/script -id=%d", host_num) 

E 'possibile in Tessuto? Se no, c'è un altro strumento che potrei usare per realizzare la stessa cosa?

risposta

3

È possibile verificare l'utente/l'host. Ogni attività conosce l'ambiente che attualmente eseguiti in:

env.hosts = ['[email protected]', '[email protected]'] 

@task 
def test(): 
    print '%(user)[email protected]%(host)s' % (env) 

    if env.host == 'host1.com': 
     id = 1 
    elif ... 

    run('echo "%s"' % (id)) 

Sentitevi liberi di scrivere in modo più elegante :) (un suggerimento che sono usati dizionari simile al caso dichiarazioni per la ricerca id)

+2

Grazie. Peccato che non ci sia un meccanismo migliore: questo metodo non sembra funzionare troppo bene se vuoi eseguire lo stesso script su diversi set di host. – bsowell

+0

Continuerà a funzionare in parallelo? Ho la stessa sfida, ma ho 20 host, che vengono avviati in fase di esecuzione (istanze AWS EC2). Quindi, non penso che codificare duramente le dichiarazioni "if-then" prima del tempo funzionerebbero. –

2

Se desideri un'introspezione su quale host stai eseguendo all'interno dell'attività, ti suggerisco di fare riferimento alla variabile env.host. Ogni attività sa del suo stato env, sebbene in parallelo non condividano questo stato, poiché sono tutti in esecuzione come fork. C'è anche un number of other env vars a tua disposizione.

Problemi correlati