[英]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命令发送到被那里执行服务器。 像mkdir
, bundle 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.