我有一个同时安装了标准Ruby和Ruby Enterprise的登台服务器。由于标准Ruby拒绝安装关键的gem,我需要设置$PATH,以便Ruby/gem/rake/etc。总是参考REE版本。因为我使用Capistrano来部署到我们的机器上,所以我需要在Capistrano中执行。
如何设置一次环境变量,并使其在整个Capistrano会话中持续存在?
1)在bashrc文件中很容易做到,但是Capistrano不读取bashrc文件。
2)我会使用Capistrano的default_environment['PATH'] = 'Whatever'
但是Capistrano使用这些环境变量,比如
env PATH=Whatever command arg ...
,当在传递给env的可执行文件中启动另一个shell时,它们就会丢失。比如你用sudo的时候。这一点很重要:
[holt@Michaela trunk]$ env VAR=hello ruby -e "puts ENV['VAR']"
hello
[holt@Michaela trunk]$ env VAR=hello sudo ruby -e "puts ENV['VAR']"
nil
3)我不能使用bash导出命令,因为这些也丢失了- Capistrano似乎为每个命令启动一个新shell(或类似的东西),这也丢失了:
cap> export MYVAR=12
[establishing connection(s) to xxx.xxx.xxx.xxx]
cap> echo $MYVAR
** [out :: xxx.xxx.xxx.xxx]
cap>
4)我也试过使用Capistrano的:shell和:pty选项(以及与其他方法结合使用),但也没有运气。
那么,正确的方法是什么呢?这似乎是一个基本的任务,应该有一个非常简单的方法来完成它,但是我没有想法。有人知道吗?
提前感谢!
我有完全相同的问题,但我认为这个解决方案更好:
set :default_environment, {
'env_var1' => 'value1',
'env_var2' => 'value2'
}
如果您需要在远程主机上设置PATH以外的变量,您应该知道出于安全原因,sshd默认情况下只允许某些/etc/profile
或~/.bashrc
环境变量。正如Lou所说,您可以使用cap> printenv
命令来处理cap shell
,也可以在一个命令中处理cap COMMAND=printenv invoke
。
如果您在正常情况下ssh到远程shell时看到了这个变量,但是在cap printenv
命令中没有看到它,那么这里有一个解决方案:
- 在远程服务器的
/etc/ssh/sshd_config
文件中设置PermitUserEnvironment yes
,并重启sshd - 为您正在ssh登录的远程用户编辑
~/.ssh/environment
文件,并将变量设置为VARIABLE=value
当你输入cap COMMAND=printenv invoke
我认为你实际上有两个问题:
1) 您想要更改远程主机的PATH。
在远程主机的.bashrc中更改/设置路径并运行cap> printenv
,如果路径正确,请转到#2,否则尝试将export BASH_ENV=~/.bashrc
添加到/etc/profile
(小心,~/)。Bashrc将在所有非交互式shell(所有用户)上运行
2) 您希望sudo保留您的PATH
在远程主机上运行visudo
并添加:
Defaults exempt_group = "<your_user>"
我需要为一个特定的任务设置一个环境变量。"run"命令允许你传递选项,包括:env:
run "cmd", :env => { 'name' => 'value' }
在我的例子中,我想将环境变量添加到一个不是我编写的任务中,所以我使用了default_run_options,它被所有的run调用使用。我把这个添加到我的Capfile的顶部:
default_run_options[:env] = { 'name' => 'value' }
我尝试使用@brian-deterling的技术,但没有成功,这是其他讨论过这个问题的人经常使用的方法…也许我做错了什么,但同时我发现了dotenv-rails
gem,它非常好地加载了.env
文件在我的项目根的值。
他们的Github repo上的说明非常直接。我把Dotenv.load
添加到我的config/application.rb