Capistrano:我可以为整个cap会话设置一个环境变量吗?



我有一个同时安装了标准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命令中没有看到它,那么这里有一个解决方案:

  1. 在远程服务器的/etc/ssh/sshd_config文件中设置PermitUserEnvironment yes,并重启sshd
  2. 为您正在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

最新更新