Выполнение задачи 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