红宝石-Capistrano和环境变量

我改用环境变量进行配置,并且效果很好-除非我必须使用capistrano部署或运行任务。

Capistrano 3似乎执行了每个带有.bashrc前缀的命令,该命令会删除我通过.bash_profile设置的任何环境变量。

编辑-在进行更多的重新搜索时,这可能不是问题,问题可能是因为capistrano作为非登录,非交互式外壳执行,并且不加载.bashrc.bash_profile。但是仍然卡住了。

Capistrano执行任务时,确保设置环境变量的最佳方法是什么?

5个解决方案
50 votes

您可能最好看一下ENVENV之间的区别

当您启动SSH时,您的应用将加载在ENV文件中定义的SHELL变量。 这些仅在外壳寿命内存在,因此,我们使用它们的次数不多于ENV vars

您最好将ENV变量放入:

/etc/environment

像这样:

export ENVIRONMENT_VAR=value

这将使变量在整个系统中可用,而不仅仅是在不同的Shell会话中可用


更新资料

你有没有尝试过

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

set :default_env, { 
  'env_var1' => 'value1',
  'env_var2' => 'value2'
}
Richard Peck answered 2020-08-11T04:42:01Z
48 votes

尽管已经回答了这个问题,但如果其他任何人处于与我相同的情况下,我将把它留在这里。

Capistrano确实加载了.bashrc。但是,如果您在文件顶部注意到,则是这样的:

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

解决方案只是将任何设置都放在此之上,Capistrano可以按我的要求工作。

该解决方案在GitHub问题上也有所提及。

Delameko answered 2020-08-11T04:42:34Z
16 votes

为了调试问题,使用一个简单的任务更新/etc/default/locale

namespace :debug do
  desc 'Print ENV variables'
  task :env do
    on roles(:app), in: :sequence, wait: 5 do
      execute :printenv
    end
  end
end

现在运行/etc/default/locale。您应该能够看到ENV变量的有效配置。

文件的顺序和名称取决于您的分布,例如 在Ubuntu上,采购顺序如下:

  1. /etc/default/locale
  2. /etc/default/locale
  3. ~/.bash*
  4. ~/.bash*

~/.bash*包含这样的第一行时,之后将不会获得任何代码:

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

要了解~/.bash*如何加载ENV变量,此图表(源)可能会有所帮助。

由于非交互式会话,很可能未加载~/.bash*文件。

capistrano env variables loading

Tombart answered 2020-08-11T04:43:16Z
1 votes

您需要在/etc/environment文件中设置环境变量,以使其对所有用户可用并在系统中进行处理。 .bashrc.bash_profile文件中的环境变量仅在Shell会话中可用,不适用于自动产生的进程和服务。

不久前,我制作了一个Capistrano库(/etc/environment),用于管理和同步群集中的环境变量,该库通过修改/etc/environment文件即可正常工作。 它易于使用,类似于使用Heroku工具栏设置环境变量的方式。 这里有些例子:

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
Itay Grudev answered 2020-08-11T04:43:42Z
0 votes

我确定的解决方案是:

  1. 在需要部署到的所有服务器的/ etc / ssh / sshd_config中启用PermitUserEnvironment选项。
  2. 为我使用env vars部署到的每个用户的主目录添加〜/ .ssh / environment文件,格式为KEY = VALUE对(我通过自己的用户将每个应用程序和服务部署到该用户的主目录)。

参考:[http://en.wikibooks.org/wiki/OpenSSH/Client_Configuration_Files#.7E.2F.ssh.2环境]

实际上比这更糟。 我使用Upstart来管理Puma / Rails,并且也需要在其中设置env vars。 因此,经过几天的试验,我得出了以下完整但可怕的解决方案:

  1. 使用“ export KEY = VALUE”在用户的.bashrc中设置我的环境变量。 (所以当我以交互方式进行SSH时,它们存在。)
  2. 使用“ KEY = VALUE”在用户的.ssh / environment文件中设置我的环境变量。 (因此,当Capistrano SSH插入时,它们就存在。)
  3. 在/etc/init/puma.conf的“脚本”部分中设置我的环境变量。 (因此,它们在Puma / Rails启动时存在。)

屁股在多个文件/模板和多种格式(带导出,不带导出...)中保持相同的环境变量列表是很痛苦的。 幸运的是,在使用Capistrano部署到节点之前,使用Puppet来管理节点的配置使其变得更加简单/可靠。

我真的很讨厌linux shell,初始化和dotfiles的整个领域。 是时候完全重新启动了。

odigity answered 2020-08-11T04:44:42Z
translate from https://stackoverflow.com:/questions/23672631/capistrano-and-environment-variables