2011-11-29 64 views
39

我想將結構中的一些值傳遞到遠程環境中,而我沒有看到一個很好的方法來實現它。目前爲止最好的我是:在面料中添加環境變量的最佳方法?

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

這似乎工作,但它似乎有點破解。

我查看了GIT存儲庫,看起來這是issue #263

+1

但是在結構關閉連接之後,變量是否會持續?從文檔('prefix'和'shell_env')我知道環境變量只會被設置爲包裝命令。 – glarrain

回答

11

我認爲您的prefix爲基礎的解決方案是完全有效的。不過,如果你想有一個shell_env上下文管理作爲issue#263提出的一個,你可以使用下面的另一種實現在你的工廠文件:

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提到的相互作用問題。
  • 必須在使用shell_env之前對env['shell']進行任何更改。否則,shell_env更改將被覆蓋,並且環境變量將無法用於您的命令。

當執行上面的晶圓廠文件,你會得到以下輸出:

$ 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. 
+1

我一直在使用這種技術,但我注意到在織物的更高版本中它不再起作用。相反,你應該/必須使用可以工作的fabric.context_managers.shell_env實現。 –

2

面料1.5.0(目前在GIT)採用外殼爲本地()命名的參數。 如果您傳遞'/ bin/bash',它將它傳遞給Popen的可執行參數。

它不會執行你的.bashrc,因爲.bashrc來源於bash的交互式調用。可以輸出你想要內部本地任意文件:

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

面料1.5(釋放),fabric.context_managers.shell_env你想要做什麼。

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

在Windows上似乎不起作用。已添加支持,但它不在最新版本(1.6)中。 –

+0

但是,在結構關閉連接之後變量會持續嗎?從文檔我明白,環境變量將被設置爲包裝命令只。 – glarrain

+0

@glarrain是的,這就是他們實現它作爲上下文管理器的一點 – Anentropic