代码之家  ›  专栏  ›  技术社区  ›  Justin

具有属性的多个角色(?)在卡皮斯特拉诺

  •  2
  • Justin  · 技术社区  · 14 年前

    如何将属性传递给我在卡皮斯特拉诺的任务?

    我的目标是在一个负载平衡器中部署到多个服务器。我想把每个服务器都取出来,部署,然后按顺序添加,这样在任何时候都不会有多个服务器关闭。

    我想应该是…(在查询我的负载平衡器之后,将动态生成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 回复  |  直到 14 年前
        1
  •  4
  •   silvamerica    14 年前

    我用这个来重新启动我的服务器串联,而不是并行。

    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
  •  2
  •   Lee Hambley    14 年前

    贾斯汀,很抱歉这是不可能的,一旦流池打开(首先 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
  •  1
  •   Justin    14 年前

    没人知道?我在下面找到了一些关于序列块的东西,但那是我得到的…

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

    我发现很难相信没有人需要用cap做连续的任务。