Xav*_*olt 34 capistrano environment-variables
我有一个安装了标准Ruby和Ruby Enterprise的登台服务器.由于标准Ruby拒绝安装一个关键的gem,我需要设置$ PATH以便ruby/gem/rake/etc.总是参考REE版本.由于我使用Capistrano部署到我们的机器上,我需要在Capistrano中进行.
如何设置一次环境变量,并让它在整个Capistrano会话中保持不变?
1)在bashrc文件中很容易,但Capistrano不读取bashrc文件.
2)我会使用Capistrano的
default_environment['PATH'] = 'Whatever'
Run Code Online (Sandbox Code Playgroud)
但是Capistrano使用这些环境变量
env PATH=Whatever command arg ...
Run Code Online (Sandbox Code Playgroud)
每当另一个shell在传递给env的可执行文件中旋转时,它们就会丢失.就像你使用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
Run Code Online (Sandbox Code Playgroud)
3)我不能使用bash export命令,因为它们也丢失了--Capistrano似乎为每个命令(或类似的东西)启动了一个新shell,而且它也丢失了:
cap> export MYVAR=12
[establishing connection(s) to xxx.xxx.xxx.xxx]
cap> echo $MYVAR
** [out :: xxx.xxx.xxx.xxx]
cap>
Run Code Online (Sandbox Code Playgroud)
4)我已经尝试过使用Capistrano的:shell和:pty选项(并结合其他方法),但也没有运气.
那么 - 这样做的正确方法是什么? 这似乎是一个基本的任务,应该有一个非常简单的方法来完成它,但我没有想法.任何人?
提前致谢!
Pet*_*Lee 51
我有完全相同的问题,但我认为这个解决方案更好:
set :default_environment, {
'env_var1' => 'value1',
'env_var2' => 'value2'
}
Run Code Online (Sandbox Code Playgroud)
这对我来说就像一个魅力.
bjn*_*ord 10
如果需要在除PATH之外的远程主机上设置变量,则应该知道sshd 默认情况下仅允许某些/etc/profile或~/.bashrc环境变量,出于安全原因.正如Lou所说,你既可以cap shell使用cap> printenv命令,也可以使用命令,也可以cap COMMAND=printenv invoke在一个命令中执行.
如果你正常ssh到远程shell时看到变量,但是你没有在cap printenv命令中看到它,这里有一个解决方案:
PermitUserEnvironment yes在远程服务器上的/etc/ssh/sshd_config文件,并重新启动ssh~/.ssh/environment您正在进行ssh的远程用户的文件,并将您的变量放在那里VARIABLE=value现在,那些应该出现在你做的时候 cap COMMAND=printenv invoke
我想你实际上有2个问题:
1)您想要更改远程主机上的PATH.
更改/设置远程主机上.bashrc中的路径并运行cap> printenv,如果路径正确,请转到#2,否则尝试添加export BASH_ENV=~/.bashrc到您的/etc/profile(请注意,〜/ .bashrc将针对所有非运行 - 所有用户的交互式shell)
2)你想让sudo保持你的PATH
visudo在远程主机上运行并添加:
Defaults exempt_group = "<your_user>"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
28328 次 |
| 最近记录: |