【问题标题】:Can Capistrano Execute Tasks on Hosts Consecutively?Capistrano 可以在主机上连续执行任务吗?
【发布时间】:2010-11-05 22:22:22
【问题描述】:

我正在使用 Capistrano 管理在多个负载平衡服务器上运行的 Java Web 应用程序。某些任务(例如配置更改)需要重新启动服务器或重新部署应用程序,在此期间服务器变得无响应。

如果 Capistrano 可以在服务器上连续执行这些任务,而不是同时执行,那么场中一次只会出现一台机器停机,负载平衡器将确保不会丢失任何请求。但是,据我所知,Capistrano 仅在服务器上同时执行操作。

需要明确的是,我并没有尝试连续执行不同的任务。我正在尝试在不同的服务器上连续执行相同的任务。

我可以在我的配置中想出一些方法来破解它,但似乎应该有一个我可以在某处设置的标志。

有人知道怎么做吗?

【问题讨论】:

    标签: 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
    

    【讨论】:

    • 太棒了!顺便说一句,也许 cap 应该添加一个策略来按顺序执行任务。
    • 用 cmd 命令运行 ruby​​ 函数怎么样?我从 elb 注销实例然后重新启动独角兽,是否可以像这样顺序运行它
    【解决方案2】:

    您可以为任务设置:max_hosts 以限制其并行度:

    :max_hosts - 指定一次应选择的最大主机数。如果此值小于选择运行的主机数,则主机将按 max_hosts 组运行。默认为 nil,表示没有最大主机限制。请注意,这不限制可以打开的 SSH 通道的数量,只限制将调用它的主机数量。

    例子:

    desc "Say hello, one at a time"
    task :hello, :roles => :app, :max_hosts => 1 do
      run "echo serial hello ; sleep 0 ; echo serial hello DONE"
      # Note that task parameters do NOT get automatically passed on to
      # other tasks, i.e. a call to "deploy:restart" would be
      # unaffected by :max_hosts set here. Example:
      self.send(:normal_hello)
    end
    
    desc "Say hello, everybody"
    task :normal_hello, :roles => :app do
      run "echo 'normal (parallel) hello' ; sleep 10 ; echo normal hello DONE"
    end
    

    【讨论】:

      【解决方案3】:

      Capistrano 3 使用 SSHKit,它可以将命令顺序发送到多个服务器。 SSHKit 上有一个例子读给我看:

      https://github.com/capistrano/sshkit

      注意,Capistrano 3 与 Capistrano 2.x 相比有很大的变化。

      【讨论】:

        【解决方案4】:

        对于现在进入此页面的人:您可以使用in: :sequence,如http://capistranorb.com/2013/06/01/release-announcement.html 所述

        【讨论】:

          【解决方案5】:

          您好,在 capistrano 中不容易缝合,当然可以采取一些方法。

          1) 您可以为每个服务器指定不同的角色,并添加一个单独的任务来负责角色轮换并调用执行实际需要的任务的任务。

          2) 您可以编写单独的脚本进行上述轮换,但使用不同的主机名而不是角色

          3) 也可以使用环境变量在 capistrano 中过滤主机名/服务器,也许您可​​以在轮换算法中使用它。

          不幸的是,对于我来说,没有关于 capistrano 的好的文档,阅读 capistrano 的资料效果很好,但也需要很多时间。

          【讨论】:

          • 感谢您的信息。不是我希望的答案,但事实很伤人。我可能会尝试分叉并添加此功能。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-31
          • 1970-01-01
          • 1970-01-01
          • 2021-05-05
          相关资源
          最近更新 更多