Capistrano和环境variables

我已经切换到使用环境variables进行configuration ,并且工作得非常好 – 除非我必须使用capistrano部署或运行​​任务。

Capistrano 3似乎执行了前缀为/usr/bin/env每个命令,这会清除通过.bashrc设置的所有环境variables。

编辑 – 在做更多的研究,这可能不是问题,这个问题可能是因为capistrano作为非login,非交互式shell执行,不加载.bashrc.bash_profile 。 但是,仍然卡住了。

当capistrano执行任务时,确定环境variables的最佳方法是什么?

你可能最好看ENVIRONMENT VARIABLESSHELL VARIABLES之间的区别

当您启动SSH时,您的应用程序将加载您的.bashrc文件中定义的SHELLvariables。 这些只存在于壳的寿命,因此,我们不会像ENVvariables一样使用它们

你可能会更好地把ENVvariables:

 /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是:

  1. 在需要部署的所有服务器的/ etc / ssh / sshd_config中启用PermitUserEnvironment选项。
  2. 为每个用户的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:

  1. 使用“export KEY = VALUE”将我的env vars设置在用户的.bashrc中。 (所以他们存在,当我交互SSH。)
  2. 使用“KEY = VALUE”将我的环境variables设置在用户的.ssh / environment文件中。 (所以他们存在当Capistrano SSHs英寸
  3. 在/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