【问题标题】:How do I separate roles in Capistrano?如何在 Capistrano 中分离角色?
【发布时间】:2011-11-03 16:35:10
【问题描述】:

我正在尝试使用 Capistrano 部署我的 RoR 应用程序。一切都很好,直到我在 Capistrano 配置中引入了另一个角色,即 :web 角色,这应该是我的 HTTP/反向代理服务器。

我的理解是 :app 角色应该是指应用程序服务器(瘦、杂种等),而 :web 角色应该是指前端服务器(nginx、apache),所以我对这个选择感到很困惑在所有角色上运行所有任务,即使 capistrano 默认将它们分开。

现在我的问题是我无法使 deploy:update_code 仅在具有 :app 角色的服务器上运行,例如,capistrano 错误,因为它试图在我的 Web 服务器上运行 update_code,我什至没有安装 git(我不需要它......)。有没有人成功做到这一点?有人可以分享代码吗?

TIA,NGW

【问题讨论】:

  • 我很困惑......关于 :web 角色的文档说“这被认为是你的网络服务器(阅读:Apache / nginx / etc.)”并且关于应用程序角色说“这些假设是您的应用程序服务器,在 Ruby 环境中,这意味着类似于 Mongrel 或 Mongrel 集群;它也可以是您的乘客服务器。”。为什么默认运行 update_code、symlink 以及基本上所有部署都以完全相同的方式在 :web 和 :app 上运行?我正在尝试覆盖所有默认任务以仅在 :app 上运行,但它是 PITA :) 我做错了什么?

标签: ruby-on-rails ruby-on-rails-3 deployment capistrano


【解决方案1】:

出现此问题是因为内置任务不遵守调用它们的自定义任务的角色限制,即,

task my_task, :roles => :web do
    run "some command"  # will only be executed on servers with the :web role
    update              # will be executed for all roles
end

正如您的直觉,您将不得不覆盖所有内置任务。或者你可以试试 Rodney Koch 的 patch 到 Capistrano。

【讨论】:

    【解决方案2】:

    您是否在任务名称中明确指定角色?

    task :task_A, :roles => :web do
      #do stuff here
    end
    
    task :task_B, :roles => :app do
      #do stuff here
    end
    

    【讨论】:

      猜你喜欢
      • 2016-12-04
      • 1970-01-01
      • 2014-05-02
      • 2020-03-26
      • 1970-01-01
      • 1970-01-01
      • 2021-07-09
      • 2017-12-18
      • 2016-11-08
      相关资源
      最近更新 更多