Bluepill - установлен в пользовательском RVM - gemset конкретного проекта - как запустить с sudo без пароля?
У меня есть настройка Bluepill для мониторинга моих процессов delayed_job.
На моем производственном сервере я использую RVM, установленный в домашней папке пользователя (имя пользователя deploy
). Драгоценные камни моего приложения устанавливаются в свой собственный гемсет для конкретного проекта. Итак, самоцвет bluepill и соответствующий ему двоичный файл установлены внутри ~/.rvm/....
папка.
Когда я развертываю свое приложение, используя capistrano, я хочу, чтобы bluepill был остановлен и запущен, чтобы мои диджеи были перезапущены. Я смотрю на инструкции к рецепту капистрано здесь.
Я думаю, что мои RVM-совместимые задачи bluepill должны быть такими:
# Bluepill related tasks
after 'deploy:start', 'bluepill:start'
after 'deploy:stop', 'bluepill:quit'
after 'deploy:restart', 'bluepill:quit', 'bluepill:start'
namespace :bluepill do
desc 'Stop processes that bluepill is monitoring and quit bluepill'
task :quit, :roles => [:app] do
run "cd #{current_path}; sudo bluepill #{application}_#{rails_env} stop"
run "cd #{current_path}; sudo bluepill #{application}_#{rails_env} quit"
sleep 5
end
desc 'Load bluepill configuration and start it'
task :start, :roles => [:app] do
run "cd #{current_path}; sudo bluepill load #{current_path}/config/server/#{rails_env}/delayed_job.bluepill"
end
desc 'Prints bluepills monitored processes statuses'
task :status, :roles => [:app] do
run "cd #{current_path}; sudo bluepill #{application}_#{rails_env} status"
end
end
Я еще не проверял выше.
Что мне интересно, так это то, что я должен sudoers
файл, чтобы позволить deploy
пользователь запускает только эти связанные с bluepill команды как root без пароля? На этой странице они упомянули это:
deploy ALL=(ALL) NOPASSWD: /usr/local/bin/bluepill
Но путь к двоичному файлу bluepill в моем случае будет другим. И это было бы по-разному для разных проектов, из-за конкретных наборов gemsets. Должен ли я упомянуть каждый из двоичных путей или есть лучший способ справиться с этим?
1 ответ
Используйте обертки и псевдонимы:
namespace :bluepill do
task :setup do
run "rvm alias create #{application} #{rvm_ruby_name_evaluated}"
run "rvm wrappers #{application} --no-links bluepill"
end
end
так что после этой задачи bluepill
доступно через #{rvm_path}/wrappers/#{application}/bluepill
которая всегда будет одинаковой, даже если вы измените версию ruby, поэтому ее можно добавить в sudoers для сохранения пути:
deploy ALL=(ALL) NOPASSWD: /home/my_user/.rvm/wrappers/my_app/bluepill
и тогда задачи можно использовать:
sudo #{rvm_path}/wrappers/#{application}/bluepill ...
здесь важно отметить, что оболочка заботится о загрузке среды rvm, потому что она была потеряна при вызове sudo
... но это только деталь;)