【问题标题】:Capistrano tasks not performing within the given scope.Capistrano 任务未在给定范围内执行。
【发布时间】:2012-02-06 10:27:09
【问题描述】:

我已经构建了一些 capistrano 任务,我需要在定义的 :app 角色中运行这些任务。这是我到目前为止所拥有的:

desc "Stop unicorn"
task :stop, :roles => :app do
  logger.info "Stopping unicorn server(s).."
  run "touch #{unicorn_pid}"
  pid = capture("cat #{unicorn_pid}").to_i
  run "kill -s QUIT #{pid}" if pid > 0
end

据我所知,这应该在:app 角色中给定的服务器上运行给定的命令,对吧?但事实是它在:db 角色的服务器上运行命令。

任何人都可以对这个问题有所了解吗?或者有没有办法强制 Capistrano 遵守 :roles 标志?

提前致谢

// 埃米尔

【问题讨论】:

  • 我进行了更多调查,结果发现,当它完成这项任务时,servers 数组已经包含了来自所有角色(即合并appwebdb)这是预期的行为吗?
  • 还有更多。似乎捕获命令在所有服务器上运行,然后在所有服务器上运行 kill 命令。这导致 kill 命令试图杀死所有服务器上最后一个服务器的 id。对于这种情况是否有最佳实践,我想在特定服务器上运行一系列命令,然后在服务器阵列中进行迭代?
  • 您的环境角色设置如何?
  • 我发现我可以通过 Capistrano 它自己提供的 find_servers 数组迭代解决我的问题。所以它自己解决了,但我仍然认为这不是最好的解决方案。

标签: ruby-on-rails ruby capistrano


【解决方案1】:

使用 Capture 将导致任务仅在列出的第一台服务器上运行。

来自文档:

捕获助手将在第一个匹配的服务器上执行给定的命令,并将命令的输出作为字符串返回。

https://github.com/capistrano/capistrano/wiki/2.x-DSL-Action-Inspection-Capture

不幸的是,我遇到了类似的问题,find_servers 解决方案可能有效,但它很笨拙,并且运行 N x N 次,其中 N 是您拥有的服务器数量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 2016-05-31
    相关资源
    最近更新 更多