【问题标题】:How to access environment variables during Capistrano deploy?Capistrano 部署期间如何访问环境变量?
【发布时间】:2016-07-19 17:30:14
【问题描述】:

我的 rails (4.2) 应用程序在 Ubuntu (14.02) 系统上通过 Passenger (5.0.28) + Apache (2.4.7) 运行,ruby (2.3.0) 由 rbenv 管理。我使用 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 不使用远程环境?如何修改服务器端或部署脚本中的配置来解决此问题?

感谢您的帮助。

【问题讨论】:

    标签: ruby-on-rails capistrano passenger rbenv


    【解决方案1】:

    首先,我认为需要对术语和 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-in-capistrano/

    您需要找到除profile.d 脚本之外的其他方法来设置这些变量。

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

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

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

    或者你可以使用像dotenv这样的工具,它允许Rails从一个特殊的文件中读取变量变量而不是依赖于执行环境。

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

    【讨论】:

    • 非常感谢您抽出宝贵的时间来写这篇文章。链接末尾的图表太棒了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    • 2013-05-29
    • 2014-07-03
    相关资源
    最近更新 更多