Capistrano和环境variables
我已经切换到使用环境variables进行configuration ,并且工作得非常好 – 除非我必须使用capistrano部署或运行任务。
Capistrano 3似乎执行了前缀为/usr/bin/env
每个命令,这会清除通过.bashrc
设置的所有环境variables。
编辑 – 在做更多的研究,这可能不是问题,这个问题可能是因为capistrano作为非login,非交互式shell执行,不加载.bashrc
或.bash_profile
。 但是,仍然卡住了。
当capistrano执行任务时,确定环境variables的最佳方法是什么?
你可能最好看ENVIRONMENT VARIABLES
和SHELL VARIABLES
之间的区别
当您启动SSH时,您的应用程序将加载您的.bashrc
文件中定义的SHELLvariables。 这些只存在于壳的寿命,因此,我们不会像ENV
variables一样使用它们
你可能会更好地把ENV
variables:
/etc/environment
喜欢这个:
export ENVIRONMENT_VAR=value
这将使variables在整个系统中可用,而不仅仅是在不同的shell会话中
更新
你有没有尝试过
Capistrano:我可以为整个上限会话设置一个环境variables吗?
set :default_env, { 'env_var1' => 'value1', 'env_var2' => 'value2' }
虽然已经得到了答复,但我会在这里留下来,以防其他人处于与我相同的情况。
Capistrano 确实加载.bashrc
。 但是如果你会注意到在文件的顶部有这样的:
# If not running interactively, don't do anything [ -z "$PS1" ] && return
解决的办法是简单地把任何设置上面这个和Capistrano工程如何我想要的。
这个解决scheme在这个GitHub问题上也被注意到了。
我解决的解决scheme是:
- 在需要部署的所有服务器的/ etc / ssh / sshd_config中启用PermitUserEnvironment选项。
- 为每个用户的home目录添加一个〜/ .ssh / environment文件,以KEY = VALUE对的forms与env vars进行部署(我通过它自己的用户将每个应用程序和服务部署到该用户的主目录)。
参考: http : //en.wikibooks.org/wiki/OpenSSH/Client_Configuration_Files#.7E.2F.ssh.2Fenvironment
这实际上比这更糟糕。 我使用Upstart来pipe理Puma / Rails,并且需要设置env vars。 所以,经过几天的实验,我终于完成了以下完整而可怕的解决scheme:
- 使用“export KEY = VALUE”将我的env vars设置在用户的.bashrc中。 (所以他们存在,当我交互SSH。)
- 使用“KEY = VALUE”将我的环境variables设置在用户的.ssh / environment文件中。 (所以他们存在当Capistrano SSHs英寸
- 在/etc/init/puma.conf的“脚本”部分设置我的env vars。 (所以它们在Puma / Rails启动时存在。)
这是一个痛苦的屁股在多个文件/模板和多种格式(导出,没有出口…)保持相同的envvariables列表。 幸运的是,使用Puppet来pipe理节点的configuration之前,使用Capistrano进行部署,它变得更容易/更可靠。
我真的讨厌linux shell,初始化和dotfiles的整个领域。 是完全重新启动的时候了。
您需要在/etc/environment
文件中设置环境variables,以使其可供所有用户在系统中进行处理。 .bashrc
或.bash_profile
文件中的环境variables仅在shell会话中可用,而不适用于自动生成的进程和服务。
我capistrano-env_config
做了一个Capistrano库( capistrano-env_config
)来pipe理和同步集群中的环境variables,该集群正好通过修改/etc/environment
文件来工作。 使用起来很简单,与使用Heroku工具栏设置环境variables类似。 这里有些例子:
cap env:list cap env:get[VARIABLE_NAME, VARIABLE_NAME, ...] cap env:unset[VARIABLE_NAME, VARIABLE_NAME, ...] cap env:set[VARIABLE_NAME=VALUE, VARIABLE_NAME=VALUE, ...] cap env:sync