在结构中添加环境variables的最佳方法是什么?

我想从结构中传递一些值到远程环境中,而我看不到一个很好的方法来做到这一点。 到目前为止我所得到的最好的是:

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

这似乎工作,但它似乎有点黑客。

我查看了GIT仓库,看起来这是问题#263 。

从fabric 1.5(发布)开始, fabric.context_managers.shell_env就是你想要的。

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

我认为你的基于prefix的解决scheme是完全有效的。 但是,如果您希望在问题#263中提供shell_env上下文pipe理器,则可以在您的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') 

请注意,这个上下文pipe理器修改env['shell']而不是env['command_prefixes'] (因为prefix上下文pipe理器),所以你:

  • 仍然可以使用prefix (请参阅下面的示例输出),而没有问题#263中提到的交互问题。
  • 必须在使用shell_env之前对env['shell']进行任何更改。 否则, shell_env更改将被覆盖,环境variables将不可用于您的命令。

执行上面的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. 

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

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

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

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

 --set=domain=stackoverflow.com 

然后,您可以使用env.domain在脚本中处理它

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