Bluepill - 安装在用户RVM中 - 项目特定的gemset - 如何在没有密码的情况下运行sudo?

时间:2013-07-10 16:26:50

标签: ruby-on-rails rvm capistrano bluepill

我有Bluepill设置来监控我的delayed_job进程。

在我的生产服务器上,我使用安装在用户主文件夹中的RVM(用户名为deploy)。我的应用程序的宝石安装在自己的项目特定gemset中。因此,bluepill gem及其相应的二进制文件安装在~/.rvm/....文件夹中。

当我使用capistrano部署我的应用程序时,我希望停止并启动bluepill,以便我的DJ重新启动。我正在查看capistrano食谱here的说明。

我认为我符合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用户在没有密码的情况下以root身份运行这些与bluepill相关的命令?在this page,他们提到了这一点:

deploy ALL=(ALL) NOPASSWD: /usr/local/bin/bluepill

但是在我的情况下,bluepill二进制文件的路径会有所不同。对于不同的项目,它会有所不同,因为项目特定的宝石集。我应该提到每个二进制路径还是有更好的方法来处理它?<​​/ p>

1 个答案:

答案 0 :(得分:2)

使用包装器和别名:

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的调用丢失了......但这只是一个细节;)