【问题标题】:How to deploy to a single specific server using Capistrano如何使用 Capistrano 部署到单个特定服务器
【发布时间】:2010-09-30 14:21:09
【问题描述】:

我有一个生产中的系统,它有多个角色的多个服务器。我想通过部署到该特定服务器来测试新的应用程序服务器,而不必重新部署到生产中的每台服务器。有没有办法让 Capistrano 部署到特定的服务器?理想情况下,我希望能够运行类似

cap SERVER=app2.example.com ROLE=app production deploy

如果我只是想部署到 app2.example.com。

谢谢!

[更新] 我通过执行尝试了wulong建议的解决方案:

cap HOSTS=app2.server.hostname ROLE=app qa deploy 

但 capistrano 似乎试图在该服务器上执行除应用程序任务之外的其他角色的任务。也许我需要更新我的 cap 版本(我正在运行 v2.2.0)?

【问题讨论】:

    标签: deployment capistrano release-management


    【解决方案1】:

    你应该可以在 deploy.rb 中做这样的事情:

    task :production do
      if ENV['SERVER'] && ENV['ROLE']
        role ENV['ROLE'], ENV['SERVER']
      else
        # your full config
      end
    end
    

    【讨论】:

      【解决方案2】:

      以下内容应该是开箱即用的:

      cap HOSTS=app2.example.com ROLE=app deploy
      

      如果你想部署到>1台具有相同角色的服务器:

      cap HOSTS=app2.example.com,app3.example.com,app4.example.com ROLE=app deploy
      

      【讨论】:

      • 我通过执行 cap HOSTS=app2.server.hostname ROLE=app qa deploy 尝试了第一种情况(部署到单个应用服务器),但 capistrano 似乎正在尝试为该服务器上的其他角色执行任务除了应用程序任务。也许我需要更新我的 cap 版本(我正在运行 2.2.0)。
      • HOSTFILTER 是答案,这不是你想要的。
      【解决方案3】:

      我最终在 capistrano 用户列表 here 上发布了一个问题,并得到了 Jamis 的以下回复(为清楚起见,我在此处稍作编辑):


      试试 HOSTS 环境变量:

      cap HOSTS=app2.example.com production deploy
      

      请注意,这样做会将 app2 视为每个角色,而不仅仅是 无论它碰巧在哪个角色中声明。

      如果您想要进行常规部署,但只对 app2 采取行动,并且 仅当 app2 在您的配方文件中声明时,您才能使用 HOSTFILTER 改为变量:

      cap HOSTFILTER=app2.example.com production deploy 
      

      [...]

      考虑这个具体的例子。假设你的 脚本定义了三个服务器 A、B 和 C。它定义了一个任务“foo”, (默认情况下)想要在 A 和 B 上运行,而不是在 C 上运行。像这样:

      role :app, "A", "B"
      role :web, "C"
      
      task :foo, :roles => :app do
        run "echo hello"
      end
      

      现在,如果您执行cap foo,它将在 A 和 B 上运行 echo 命令。

      如果你执行cap HOSTS=C foo,它将在 C 上运行 echo 命令, 无论任务的 :roles 参数如何。

      如果你做cap HOSTFILTER=C foo,它不会运行echo命令 全部,因为 (A B) 和 (C) 的交集是空集。 (那里 foo 的主机列表中没有与 C 匹配的主机。)

      如果你使用cap HOSTFILTER=A foo,它将只运行 echo 命令 A,因为(A B)与(A)相交是(A)。

      最后,如果你执行cap HOSTFILTER=A,B,C foo,它将运行回显 对 A 和 B(但不是 C)的命令,因为 (A B) 与 (A B C) 相交 是(A B)。

      总结一下:HOSTS 完全覆盖了主机或角色声明 任务,并强制所有内容针对指定的主机运行。 另一方面,HOSTFILTER 只是过滤现有主机 针对给定的列表,只选择那些已经在 任务服务器列表。

      【讨论】:

      【解决方案4】:

      我有类似的问题并尝试了以下方法。它有效:

      cap production ROLES=web HOSTS=machine1 stats
      

      【讨论】:

        【解决方案5】:

        您也可以通过这种方式指定任务级主机参数:

        task :ship_artifacts, :hosts => ENV['DEST_HOST']  do
        
        end 
        

        【讨论】:

          猜你喜欢
          • 2012-07-20
          • 2011-01-07
          • 1970-01-01
          • 2011-08-31
          • 2011-08-26
          • 1970-01-01
          • 1970-01-01
          • 2014-05-26
          • 1970-01-01
          相关资源
          最近更新 更多