web-dev-qa-db-ja.com

ファブリックに環境変数を追加する最良の方法は?

ファブリックからリモート環境にいくつかの値を渡したいのですが、それを行うための素晴らしい方法が見当たりません。これまでに思いついた最高のものは:

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

これは機能しているように見えますが、ちょっとしたハッキン​​グのようです。

GITリポジトリを調べたところ、これは issue#26 のように見えます。

39
David Parmenter

Fabric 1.5(リリース済み)以降、 fabric.context_managers.Shell_env はあなたが望むことをします。

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

prefixベースのソリューションは完全に有効だと思います。ただし、 issue#26 で提案されているShell_envコンテキストマネージャーが必要な場合は、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')

このコンテキストマネージャーはenv['Shell']の代わりにenv['command_prefixes']を変更することに注意してください(prefixコンテキストマネージャーが行うように)。

  • issue#26 で言及されている相互作用の問題がなくても、prefixを使用できます(以下の出力例を参照)。
  • env['Shell']を使用する前に、Shell_envに変更を適用する必要があります。そうしないと、Shell_envの変更が上書きされ、コマンドで環境変数を使用できなくなります。

上記のfabファイルを実行すると、次の出力が得られます。

$ 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(現在Gitにあります)は、シェルをlocal()名前付き引数として使用します。 '/ bin/bash'を渡すと、Popenの実行可能な引数に渡します。

ただし、.bashrcはbashのインタラクティブな呼び出しに基づいているため、.bashrcは実行されません。ローカル内で必要なファイルをソースできます。

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

デコレータを使用してみてください

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

別の方法は、コマンドラインで--setを使用して値を渡すことです。

--set=domain=stackoverflow.com 

次に、env.domainを使用してスクリプトでアドレス指定できます

http://docs.fabfile.org/en/1.11/usage/fab.html#cmdoption--set を参照してください

0
Vasili Pascal