web-dev-qa-db-fra.com

Le meilleur moyen d’ajouter une variable d’environnement dans un tissu?

J'aimerais transmettre quelques valeurs de fabric à l'environnement distant, et je ne vois pas comment le faire. Le meilleur que j'ai trouvé jusqu'ici est:

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

Cela semble fonctionner, mais cela semble être un peu un bidouillage.

J'ai regardé dans le référentiel GIT et il semble que ceci soit numéro # 263 .

39
David Parmenter

À partir de Fabric 1.5 (publié), fabric.context_managers.Shell_env fait ce que vous voulez.

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

Je pense que votre solution basée sur prefix est parfaitement valide. Toutefois, si vous souhaitez utiliser un gestionnaire de contexte Shell_env identique à celui proposé dans numéro n ° 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 le gestionnaire de contexte prefix), de sorte que vous:

  • peut toujours utiliser prefix (voir l’exemple ci-dessous) sans les problèmes d’interaction mentionnés dans issue # 263 .
  • devez appliquer les modifications apportées à env['Shell'] avant d'utiliser Shell_env. Sinon, les modifications de Shell_env seront écrasées et les variables d'environnement ne seront pas disponibles pour vos commandes.

Lors de l'exécution du fichier fab ci-dessus, vous obtenez le résultat suivant:

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

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

Cependant, il n'exécutera pas votre fichier .bashrc car celui-ci provient d'un appel interactif de bash. Vous pouvez rechercher n'importe quel fichier dans le répertoire local: 

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

Essayez d'utiliser un 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
0
Aibek Prenov

Une autre méthode consiste à transmettre une valeur via la ligne de commande avec --set:

--set=domain=stackoverflow.com 

Ensuite, vous pouvez vous y adresser dans le script avec env.domain

voir http://docs.fabfile.org/fr/1.11.11/usage/fab.html#cmdoption--set

0
Vasili Pascal