2012-02-06 4 views
0

Я создал несколько задач capistrano, которые мне нужно запустить в пределах определенных :app ролей. Это то, что я до сих пор:Задачи Capistrano не выполняются в заданной области.

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.

Может ли кто-нибудь дать представление об этой проблеме? Или есть способ заставить Капистрано придерживаться флага :roles?

Заранее спасибо

// Эмиль

+0

Я изучил немного больше, и оказывается, что к тому моменту, когда он достигает этой задачи, массив 'servers' включает в себя * все * серверы из всех ролей (т. Е. Объединенных как' app', web' и 'db') - это ожидаемое поведение? –

+0

И далее. Кажется, что команда захвата запускается на всех серверах, а затем команда kill на всех серверах. Это приводит к тому, что команда kill пытается убить идентификатор последнего сервера на всех серверах. Есть ли наилучшая практика для этого случая, когда я хочу запустить серию команд на определенном сервере, перед повторением в массиве серверов? –

+0

как ваша среда-ролевая установка? – phoet

ответ

0

Использование Capture заставит задание должно выполняться только на первом сервере в списке.

Из документации:

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

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

К сожалению, я столкнулся с аналогичной проблемой, решение find_servers может работать, но это Hacky, и работает N х N раз, где N в количестве серверов у вас есть.

Смежные вопросы