【问题标题】:Multiple roles with attributes(?) in CapistranoCapistrano 中具有属性(?)的多个角色
【发布时间】:2010-04-14 22:18:03
【问题描述】:

如何将属性传递给 capistrano 中的任务?

我的目标是部署到负载平衡器中的多台服务器。我想依次取出每台服务器、部署并重新添加,这样任何时候都不会超过一台服务器停机。

我认为这将类似于...(并且主机数组将在查询我的负载平衡器后动态生成)...

role :app, 
       [["server_one", {:instanceId => "alice"}], 
        ["server_two", {:instanceId => "bob"}],
        ["server_three", {:instanceId => "charles"}]]

然后我的任务...

before :deploy, :deregister_instance_from_lb
after :deploy, :register_instance_with_lb

task deregister_instance_from_lb
  #TODO - Deregister #{instanceId} from load balancer
end

task register_instance_with_lb
  #TODO - Register #{instanceId} with load balancer
end

有什么想法吗?

【问题讨论】:

    标签: ruby attributes roles capistrano


    【解决方案1】:

    我用它来串行重启我的服务器,而不是并行。

    task :my_task, :roles => :web do
      find_servers_for_task(current_task).each do |server|
        run "[task command here]", :hosts => server.host
      end
    end
    

    【讨论】:

      【解决方案2】:

      贾斯汀,很抱歉,这是不可能的,一旦打开流池(首先是服务器集上的run),就无法访​​问服务器属性。 (因为run 代码不是在每个服务器上运行,而是针对池中的所有匹配)。有些人在做这样的事情上取得了一些成功,但实际上这表明您的脚本需要太多信息,而您应该能够从生产环境中提取这些信息。

      在这种情况下,您似乎正在做一些事情,例如使用主机名传递给脚本,使用 Unix 为您提供的内容:

      run "./my_script.rb `hostname`"
      

      这行得通吗?

      参考资料:

      http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_03_04.html(第 3.4.5 节)

      http://unixhelp.ed.ac.uk/CGI/man-cgi?hostname(或 $ man (1) 主机名)

      【讨论】:

      • 嗨,李,知道这很有用,但可能不适用于我的情况 - 我认为我过于简单化了。你能看看修改后的问题,让我知道你的想法吗?
      【解决方案3】:

      没有人知道吗?我在下面发现了一些关于顺序块的信息,但据我所知……

      find_servers.each do |server|
        #TODO - remove from load balancer
        #TODO - deploy
        #TODO - add back to load balancer
      end
      

      我很难相信没有人需要使用 cap 执行顺序任务。

      【讨论】:

        猜你喜欢
        • 2014-08-02
        • 1970-01-01
        • 2013-07-01
        • 2013-02-06
        • 1970-01-01
        • 2017-09-26
        • 1970-01-01
        • 1970-01-01
        • 2017-10-09
        相关资源
        最近更新 更多