Capistrano:如果其中任何主机未通过检查,我如何在所有主机上触发任务?

Capistrano: How can I trigger a task on ALL hosts if ANY of them is failing a check?

我正在使用 capistrano 部署 rails 应用程序。

我面临的挑战是 运行 对所有主机进行检查,然后确定是否应在所有主机上触发任务(如果其中任何主机未通过检查)。支票可以例如正在寻找文件:

desc "Make sure file is on all servers"
  task :do_something do
    on roles(:app) do
      unless test("[ -f /some_dir/the_file.txt ]")
        # Run something on ALL servers if missing on just one of them...
      end
    end
  end
end

我也考虑过是否可以通过首先 运行 在所有服务器上执行一个任务并合并这些任务的结果然后在第二个任务中 运行 如果输出第一个文件在任何服务器上丢失。

我想出来了:

task :check_something do
  has_file = []
  on roles(:app) do
    has_file << test("[ -f /some_dir/the_file.txt ]")
  end
  set(:should_run_something, has_file.any?{|file| file == false})
end

task :run_something do
  on roles(:app) do
    if fetch(:should_run_something)
      # Run my command
    end
  end
end
after :check_something, :run_something