在Fabric中添加环境变量的最佳方法是什么?

时间:2011-11-29 15:20:04

标签: python fabric

我想将一些值从布料传递到远程环境中,我没有看到很好的方法来实现它。我到目前为止所提出的最好的是:

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

这似乎有效,但似乎有点像黑客。

我查看了GIT存储库,看起来这是issue #263

5 个答案:

答案 0 :(得分:57)

从面料1.5(已发布)开始,fabric.context_managers.shell_env可以满足您的需求。

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

答案 1 :(得分:11)

我认为您基于prefix的解决方案完全有效。但是,如果您希望在issue#263中建议使用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上下文管理器所做的那样),因此您:

  • 仍然可以使用prefix(请参阅下面的示例输出),而不会出现issue#263中提到的互动问题。
  • 在使用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.

答案 2 :(得分:2)

Fabric 1.5.0(当前在Git中)将shell作为local()命名参数。 如果你传递'/ bin / bash',它会将它传递给Popen的可执行参数。

它不会执行你的.bashrc,因为.bashrc来源于bash的交互式调用。您可以在本地获取所需的任何文件:

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

答案 3 :(得分:0)

另一种方法是通过命令行传递一个值--set:

--set=domain=stackoverflow.com 

然后,您可以使用env.domain

在脚本中找到它

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

答案 4 :(得分:0)

尝试使用装饰器

if str(d) == "+":
    int(c) == "a + b"