首页 文章

如何使用Capistrano部署到单个特定服务器

提问于
浏览
55

我有一个 生产环境 系统,有几个角色的服务器 . 我想通过部署到该特定服务器来测试新的应用服务器,而无需重新部署到 生产环境 中的每个服务器 . 有没有办法让Capistrano部署到特定的服务器?理想情况下,我希望能够运行类似的东西

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

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

谢谢!

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

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

但是除了app任务之外,capistrano似乎还在尝试为该服务器上的其他角色执行任务 . 也许我需要更新我的帽子版本(我正在运行v2.2.0)?

5 回答

  • 0

    我最后在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 ,它将仅在A上运行echo命令,因为(A B)与(A)相交的是(A) .

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

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

  • 124

    以下应该开箱即用:

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

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

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

    我有类似的问题,并尝试了以下 . 有用:

    cap production ROLES=web HOSTS=machine1 stats
    
  • 1

    您应该可以在deploy.rb中执行以下操作:

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

    您还可以通过以下方式指定任务级主机参数:

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

相关问题