繁体   English   中英

在Capistrano部署期间如何访问环境变量?

[英]How to access environment variables during Capistrano deploy?

我的Rails(4.2)应用程序通过Ubuntu(14.02)系统上的Passenger(5.0.28)+ Apache(2.4.7)运行,使用rbenv管理的ruby(2.3.0)。 我使用Capistrano(3.4.0)进行部署。

我所有的环境变量都在一个非常简单的profile.d脚本中设置。

#!/bin/sh
export VAR1=VAL1
export VAR2=VAL2

这就像一个魅力。 我的应用程序ENV具有所有正确的变量, Secrets.yml已正确填充...除了通过ssh与Capistrano进行部署外,其他所有功能都适用。

在我的deploy.rb ,我认为相关内容如下:

set :ssh_options, {
forward_agent: true,
paranoid: true,
keys: "~/.ssh/id_rsa.pub"
}

Capistrano文档非常有限,并且ssh \\ server配置不是我的强项,我似乎无法弄清楚为什么Capistrano看不到我的ENV变量。 如果在部署流程中运行puts ENV.inspect得到诸如"TERM_PROGRAM"=>"Apple_Terminal"信息以及本地计算机用户信息等信息。 Capistrano为什么不使用远程环境? 如何在服务器端或在部署脚本中修改配置以解决此问题?

谢谢您的帮助。

首先,我认为需要澄清术语和Capistrano的执行模型。

Capistrano是在本地计算机上运行的程序。 因此,Capistrano中的ENV可以看到您的本地环境,而不是服务器的环境。 Capistrano无法用普通的Ruby代码“查看”远程ENV ,因为组成Capistrano的Ruby代码不在此处执行。

Capistrano的什么做的是使用SSH命令发送到被那里执行服务器。 mkdirbundle install等命令。

要查看图示,请将Capistrano任务添加到执行此操作的部署流程中:

task :puts_remote_env do
  on roles(:all) do
    remote_env = capture("env")
    puts remote_env
  end
end

这将在远程服务器上运行env命令,捕获结果并将其打印到控制台。

我希望这可以使Capistrano的工作方式更加清晰。


因此,从puts_remote_env输出中可以看到,在profile.d脚本中定义的变量不存在。 为什么?

这是因为Capistrano使用的是非登录,非交互式SSH会话 在该SSH会话中,不会评估您的profile.d脚本。 在Capistrano常见问题解答中对此进行了详细说明: http : //capistranorb.com/documentation/faq/why-does-something-work-in-my-ssh-session-but-not-not-in-capistrano/

您需要找到另一种设置这些变量的方法,而不是profile.d脚本。

您可以在Capistrano配置本身(例如production.rb )中指定它们,如下所示:

set :default_env, { var1: "val1", var2: "val2" }

Capistrano然后将在执行SSH命令时显式设置该环境。

或者,您可以使用dotenv之类的工具,该工具使Rails可以从特殊文件中读取变量变量,而不必依赖执行环境。

或者,您可以尝试使用不同的点文件位置,以查看即使在非登录,非交互会话中是否仍在评估某些点文件。 在Ubuntu上,我成功地在~/.bashrc的最顶部导出了变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM