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... но это только деталь;)

Другие вопросы по тегам