41 votes

Meilleure façon d'ajouter une variable d'environnement dans fabric ?

J'aimerais transmettre quelques valeurs de fabric à l'environnement distant, et je ne vois pas de moyen efficace de le faire. La meilleure solution que j'ai trouvée jusqu'à présent est la suivante :

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

Cela semble fonctionner, mais c'est un peu une pirouette.

J'ai regardé dans le dépôt GIT et il semble que ce soit numéro 263 .

60voto

Shanmu Points 397

À partir de la version 1.5 (publiée), fabric.context_managers.shell_env fait ce que vous voulez.

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

11voto

jcollado Points 18325

Je pense que votre prefix -est parfaitement valable. Toutefois, si vous souhaitez avoir une shell_env gestionnaire de contexte comme celui proposé dans problème#263 vous pouvez utiliser l'implémentation alternative suivante dans vos fichiers 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')

Notez que ce gestionnaire de contexte modifie env['shell'] au lieu de env['command_prefixes'] (comme prefix gestionnaire de contexte le fait), donc vous :

  • peut toujours utiliser prefix (voir exemple de sortie ci-dessous) sans les problèmes d'interaction mentionnés dans problème#263 .
  • doivent appliquer les changements à env['shell'] avant d'utiliser shell_env . Autrement, shell_env les changements seront écrasés et les variables d'environnement ne seront pas disponibles pour vos commandes.

En exécutant le fichier fab ci-dessus, vous obtenez la sortie suivante :

$ 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.

2voto

peroksid Points 337

Fabric 1.5.0 (actuellement dans Git) prend le shell comme argument nommé local(). Si vous passez '/bin/bash', il le passe à l'argument exécutable de Popen.

Il n'exécutera pas votre .bashrc cependant parce que .bashrc est source sur l'invocation interactive de bash. Vous pouvez sourcer n'importe quel fichier que vous voulez dans local :

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

0voto

Vasili Pascal Points 9

Une autre façon est de passer une valeur par la ligne de commande avec --set :

--set=domain=stackoverflow.com 

Ensuite, vous pouvez vous adresser à lui dans script avec env.domain

voir http://docs.fabfile.org/en/1.11/usage/fab.html#cmdoption--set

0voto

Aibek Prenov Points 73

Essayez d'utiliser le décorateur

from fabric.context_managers import shell_env
from functools import wraps

def set_env():
    def decorator(func):
        @wraps(func)
        def inner(*args, **kwargs):
            with shell_env(DJANGO_CONFIGURATION=env.config):
                run("echo $DJANGO_CONFIGURATION")
                return func(*args, **kwargs)
        return inner
    return decorator

@task
@set_env()
def testme():
    pass

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X