在结构中添加环境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