2011-09-29 87 views
32

我已經安裝了標準Ruby和Ruby Enterprise的登臺服務器。由於標準的Ruby拒絕安裝關鍵的寶石,我需要設置$ PATH以便ruby/gem/rake /等。請始終參考REE版本。因爲我使用Capistrano來部署到我們的機器上,所以我需要在Capistrano中完成。Capistrano:我可以爲整個上限會話設置一個環境變量嗎?

如何設置環境變量一次,並在整個Capistrano會話中保留它?

1)在bashrc文件中很容易做到,但Capistrano不讀取bashrc文件。

2)我會使用Capistrano酒店的

default_environment['PATH'] = 'Whatever' 

但Capistrano的使用像

env PATH=Whatever command arg ... 

這些環境變量,每當另一個shell傳遞給env中的可執行文件中紡達,他們迷路了。就像你使用sudo一樣。這是有點重要:

[[email protected] trunk]$ env VAR=hello ruby -e "puts ENV['VAR']" 
hello 
[[email protected] trunk]$ env VAR=hello sudo ruby -e "puts ENV['VAR']" 
nil 

3)我不能使用bash的export命令,因爲這些都是失去了太多 - Capistrano的似乎開始爲每個命令一個新的外殼(或類似的東西),和即失去了,太:

cap> export MYVAR=12 
[establishing connection(s) to xxx.xxx.xxx.xxx] 
cap> echo $MYVAR 
** [out :: xxx.xxx.xxx.xxx] 
cap> 

4)我試着用Capistrano酒店的搞亂:殼:PTY選項,以及(並與其他方法結合),但沒有運氣,無論是。

那麼 - 正確的方法是什麼?這似乎是這樣一個基本任務,應該有一個非常簡單的方法來完成它,但我沒有想法。任何人?

在此先感謝!

回答

5

我覺得你其實有2個問題:你想改變你的遠程主機(S)在PATH

1)。

變更/設置你的.bashrc路徑遠程主機(S)和運行cap> printenv上,如果你的道路是正確的,轉到#2,否則嘗試添加export BASH_ENV=~/.bashrc/etc/profile(注意,〜/。在.bashrc然後將所有非交互的shell爲所有用戶)

2)你想sudo來保持你的PATH

運行visudo您的遠程主機(S上運行),並添加:

Defaults  exempt_group = "<your_user>" 
+0

好的電話 - 我不知道sudo模糊了當地的環境。看起來只是添加-E選項修復了大多數情況,但$ PATH是特殊的([參考](http://stackoverflow.com/questions/257616/sudo-changes-path-why))。我會多花一點時間回到你身邊。乾杯! –

9

如果您需要在PATH以外的其他遠程主機上設置變量,那麼出於安全原因,您應該知道sshd默認情況下僅允許某些/etc/profile~/.bashrc環境變量。正如Lou所說,你可以執行cap shell並使用cap> printenv命令,也可以在一個命令中執行cap COMMAND=printenv invoke

如果你看到變量,當您ssh到遠程shell正常,但你沒有看到它的帽printenv命令,這裏有一個解決方案:

  1. PermitUserEnvironment yes在遠程服務器的/etc/ssh/sshd_config文件,並重新啓動sshd的
  2. 編輯~/.ssh/environment文件你作爲ssh'ing在遠程用戶,並把你的變量(S)那裏VARIABLE=value

現在那些應該出現當你做cap COMMAND=printenv invoke

+0

這可能會起作用,但它需要更改root權限設置。看到我的答案。 –

3

我需要設置一個特定任務的環境變量的工作。 「運行」命令,可以通過選項,其中包括:ENV:

run "cmd", :env => { 'name' => 'value' } 

在我的情況,我想環境變量添加到我沒有寫一個任務,所以我用它用來default_run_options通過所有的運行調用。我說這個我Capfile的頂部:

default_run_options[:env] = { 'name' => 'value' } 
+0

我在其他地方看到過這個解決方案,但是我無法讓它爲我工作 - 對於main:Object'錯誤,我得到一個'NameError:未定義的局部變量或方法'default_run_options'。在第一個'namespace:deploy do'塊之前,我把這個賦值語句放在我的'Capfile'的頂部。我能做些什麼不同? – sameers

+0

你是如何執行這項任務的?如果運行cap任務,它應該在加載過程中定義default_run_options,以便它在到達Capfile時可用。即使使用只說default_run_options [:x] = {'y'=>'z'}的單行Capfile,我也可以運行cap shell。 –

46

我有完全相同的問題,但我認爲這個解決方案是更好的:

set :default_environment, { 
    'env_var1' => 'value1', 
    'env_var2' => 'value2' 
} 

這個工作對我來說就像一個魅力。

+0

嗯,不爲我工作看到http://stackoverflow.com/questions/16889642/capistrano-environment-variable?lq=1 – juanpastas

+19

在Capistrano 3它是'set:default_env,{...}' – Confusion

+1

愚蠢的問題,但我正在嘗試同樣的事情,但它不起作用。無論如何去調試它? – codenoob

0

我試過使用brian-deterling的技術失敗了,這是其他人討論過的這個技術非常常用的......也許我做錯了什麼,但是同時我發現了dotenv-rails寶石,它的工作非常好用於在我的項目根目錄中加載.env文件中的值。

Github repo上的說明非常直截了當。我添加了Dotenv.load到我的config/application.rb

相關問題