Capistrano中具有属性(?)的多个角色

时间:2010-04-14 22:18:03

标签: ruby attributes roles capistrano

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

我的目标是在负载均衡器中部署到多个服务器。我想把每一个都拿出去,部署,然后按顺序添加回来,这样就不会有多个服务器随时关闭。

我认为这将是......(并且在查询我的负载均衡器后将动态生成hosts数组)......

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

有什么想法吗?

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分: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)主机名)

答案 2 :(得分:1)

没人知道?我在下面找到了关于顺序块的内容,但就我而言......

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

我发现很难相信没有人需要用限额执行顺序任务。