2012-07-22 14 views
5

Estoy escribiendo un script para iniciar un experimento de generación de carga en varios hosts. Podría escribir un script bash para iniciar varias sesiones ssh, pero esperaba usar algo más estructurado. Como utilizo Python para la mayoría de mis scripts, pensé que Fabric parecía una buena opción.Pasar diferentes argumentos a diferentes hosts en Fabric

El único problema es que tengo que pasar una pequeña cantidad de datos específicos del host con cada comando (realmente solo una identificación o contador), y me gustaría ejecutarlos en paralelo.

En otras palabras, me gustaría hacer algo como lo siguiente, donde host_num es diferente (posiblemente solo incrementado) para cada host.

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

¿Es esto posible en la tela? Si no, ¿hay alguna otra herramienta que pueda usar para lograr lo mismo?

Respuesta

3

Puede consultar con el usuario/host. Cada tarea sabe sobre el medio ambiente que actualmente se ejecutan en:

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

Siéntase libre de escribir en forma más elegante :) (Una sugerencia siendo diccionarios usado similar al caso las declaraciones de las operaciones de búsqueda ID)

+2

Gracias. Es una lástima que no haya un mecanismo mejor: este método no parece funcionar demasiado bien si desea ejecutar el mismo script en diferentes conjuntos de host. – bsowell

+0

¿Esto todavía se ejecutará en paralelo? Tengo el mismo desafío, pero tengo 20 hosts, que se activan en tiempo de ejecución (instancias de AWS EC2). Por lo tanto, no creo que programar las declaraciones '' if-then' antes de tiempo funcionaría. –

2

Si desea una introspección sobre qué host se está ejecutando dentro de la tarea, le sugiero que haga referencia a la variable env.host. Cada tarea sabe acerca de su estado de env, aunque en paralelo no comparten este estado, ya que todos se ejecutan como bifurcaciones. También hay un number of other env vars a su disposición.

Cuestiones relacionadas