2011-11-29 10 views
39

Me gustaría pasar algunos valores de la estructura en el entorno remoto, y no veo una gran manera de hacerlo. El mejor que he encontrado hasta el momento es:¿La mejor manera de agregar una variable de entorno en el tejido?

with prefix('export FOO=BAR'): 
    run('env | grep BAR') 

Esto parece funcionar, pero parece como un poco de un truco.

Miré en el repositorio de GIT y parece que esto es issue #263.

+1

¿Pero las variables persistirán después de que el tejido cierre la conexión? De la documentación ('prefix' y' shell_env') entiendo que las variables de entorno se establecerán solo para los comandos envueltos. – glarrain

Respuesta

11

Creo que su solución basada en prefix es perfectamente válida. Sin embargo, si usted quiere tener un gestor de shell_env contexto como el propuesto en issue#263, puede utilizar la siguiente implementación alternativa en los archivos de Fab:

from fabric.api import run, env, prefix 
from contextlib import contextmanager 

@contextmanager 
def shell_env(**env_vars): 
    orig_shell = env['shell'] 
    env_vars_str = ' '.join('{0}={1}'.format(key, value) 
          for key, value in env_vars.items()) 
    env['shell']='{0} {1}'.format(env_vars_str, orig_shell) 
    yield 
    env['shell']= orig_shell 

def my_task(): 
    with prefix('echo FOO1=$FOO1, FOO2=$FOO2, FOO3=$FOO3'): 
     with shell_env(FOO1='BAR1', FOO2='BAR2', FOO3='BAR3'): 
      run('env | grep BAR') 

Tenga en cuenta que este gestor de contexto modifica env['shell'] en lugar de env['command_prefixes'] (como prefix gestor de contexto lo hace), por lo que:

  • todavía puede utilizar prefix (véase el ejemplo de salida abajo) sin los problemas de interacción mencionados en issue#263.
  • tiene que aplicar los cambios a env['shell'] antes de usar shell_env. De lo contrario, se sobrescribirán los cambios shell_env y las variables de entorno no estarán disponibles para sus comandos.

Al ejecutar el archivo fab anterior, se obtiene el siguiente resultado:

$ fab -H localhost my_task 
[localhost] Executing task 'my_task' 
[localhost] run: env | grep BAR 
[localhost] out: FOO1=BAR1, FOO2=BAR2, FOO3=BAR3 
[localhost] out: FOO1=BAR1 
[localhost] out: FOO2=BAR2 
[localhost] out: FOO3=BAR3 
[localhost] out: 

Done. 
Disconnecting from localhost... done. 
+1

He estado usando esta técnica, pero he notado en versiones posteriores de la tela que ya no funciona. En su lugar, debe/debe usar la implementación fabric.context_managers.shell_env, que funciona. –

2

Tela 1.5.0 (actualmente en Git) toma shell como local) argumento (con nombre. Si pasa '/ bin/bash' allí lo pasa al argumento ejecutable de Popen.

Sin embargo, no ejecutará su .bashrc porque .bashrc se origina en la invocación interactiva de bash. Puede fuente de cualquier archivo que desee en el interior de locales:

local('. /usr/local/bin/virtualenvwrapper.sh && workon focus_tests && bunch local output', shell='/bin/bash') 
56

A partir del tejido 1.5 (liberado), fabric.context_managers.shell_env hace lo que quiere.

with shell_env(FOO1='BAR1', FOO2='BAR2', FOO3='BAR3'): 
     local("echo FOO1 is $FOO1") 
+1

Parece que no funciona en Windows. Se ha agregado soporte, pero no está en la última versión (1.6). –

+0

¿Pero las variables persistirán después de que el tejido cierre la conexión? De la documentación entiendo que las variables de entorno se establecerán solo para los comandos envueltos. – glarrain

+0

@glarrain sí, ese es el punto de implementarlo como administrador de contexto – Anentropic

Cuestiones relacionadas