Выполнение задачи rake на удаленном сервере

физическая архитектура производственной среды включает в себя несколько машин, выполняющих разные задания (задачи rake), все из них в одной базе данных.

одна из работ будет делать большой UPDATE над таблицей, которая обычно возвращает взаимоблокировку postgres, если выполняются другие задания.

у меня уже есть задача рейка, чтобы изящно остановить другие задания, но я могу выполнить ее только с локальных машин.

чего я хочу добиться есть:

task :big_update => :environment do
  stop_tasks_on_another_servers

  # do the SQL UPDATE
  ...
end

где stop_tasks_on_another_servers должен выполнить rake task на других серверах.

мой лучший попробовать использовать https://github.com/capistrano/sshkit камень. То же самое, что Капистрано использует его, но я все еще пропускаю шаг здесь. Я пробую следующее на консоли rails в производственной машине:

require 'sshkit/dsl'
hosts = ['machine1', 'machine2']

on hosts do
  within "/home/me/project/current" do
    with rails_env: :production do
      rake "stop_tasks"
    end
  end
end

но он возвращает:

INFO [70a0610a] Running /usr/bin/env rake stop_tasks on machine1
SSHKit::Command::Failed: rake stdout: Nothing written

что мне не хватает или есть более простой способ выполнить удаленный задачи?

2 ответов


проверить Грабли Удаленная Задача. Вот фрагмент, чтобы показать вам, как это работает:

require 'rake/remote_task'

set :domain, 'abc.example.com'

remote_task :foo do
  run "ls"
end

У меня был успех, используя этот подход:

http://gistflow.com/posts/372-execute-rake-task-on-remote-server-with-capistrano