Ruby on rails Sudo不';使用Capistrano部署时,您无法访问shell命令

Ruby on rails Sudo不';使用Capistrano部署时,您无法访问shell命令,ruby-on-rails,ubuntu,capistrano,whenever,Ruby On Rails,Ubuntu,Capistrano,Whenever,我正在使用capistrano部署Rails 3应用程序 我对添加到sudoers的用户(deploy)进行了测试。这就是与我一起部署的用户 当我作为deploy登录到服务器时,我可以访问我需要的所有gem命令 Capistrano似乎像sudo一样跑步,当我尝试时: sudo whenever 我明白了 sudo: whenever: command not found 这意味着每次尝试部署时,它都会失败并回滚 我尝试过设置:在deploy.rb文件中使用_sudo设置为false,但仍然

我正在使用capistrano部署Rails 3应用程序

我对添加到sudoers的用户(deploy)进行了测试。这就是与我一起部署的用户

当我作为deploy登录到服务器时,我可以访问我需要的所有gem命令

Capistrano似乎像sudo一样跑步,当我尝试时:

sudo whenever
我明白了

sudo: whenever: command not found
这意味着每次尝试部署时,它都会失败并回滚

我尝试过设置:在deploy.rb文件中使用_sudo设置为false,但仍然没有成功

set :user, "deploy"
set :runner, user
set :use_sudo, false
有什么建议吗

这是我的完整部署脚本,以防我遗漏了什么:

require 'config/boot'
require 'hoptoad_notifier/capistrano'
require 'capistrano/ext/multistage'
require "whenever/capistrano"
# 
set :whenever_command, "bundle exec whenever"

set :application, "MYAPP"
set :repository,  "git@github.com:myAccount/myRepos.git"

# only keep 3 previous releases after cleanup
set :keep_releases, 3

set :scm, "git"
set :scm_user, "me"
set :branch, lambda {rails_env}
set :deploy_to, lambda {"/var/www/#{application}/#{rails_env}"}


default_run_options[:pty] = true

role :web, "xxx.xxx.xxx.xxx"                          # Your HTTP server, Apache/etc
role :app, "xxx.xxx.xxx.xxx"                          # This may be the same as your `Web` server
role :db,  "xxx.xxx.xxx.xxx", :primary => true        # This is where Rails migrations will run

set :user, "deploy"
set :runner, user
set :use_sudo, false

ssh_options[:paranoid] = false 
ssh_options[:port] = 22 

namespace :deploy do
  task :start do ; end
  task :stop do ; end
  task :restart, :roles => :app do
    run " touch #{File.join(current_path,'tmp','restart.txt')}"
  end

end

namespace :bundle do

  desc "run bundle install"
  task :install do
    run "cd #{current_release} && bundle install"
  end

end

namespace :tail do

  desc "Tail the current environment's log file"
  task :log, :roles => :app do
    stream "tail -f #{shared_path}/log/#{rails_env}.log"  
  end

  desc "Tail the new relic log file"
  task :new_relic, :roles => :app do
    stream "tail -f #{shared_path}/log/new_relic.log"  
  end

end


before "deploy:restart", "bundle:install"
after "deploy:restart", "deploy:cleanup"
after "deploy:restart", "whenever:update_crontab"

在服务器上运行
where where
where where where
时,您应该获得命令的完整路径并将其放入脚本:

set :whenever_command, "path_to-whenever"
这不是干净的解决方案,但可能有效



另一个解决方案可能是sudo重新配置,转到
/etc/sudoers
并查看
env_keep
添加
路径
可能很重要,为了保留所有对应用程序重要的内容,您可以使用rvm、capistrano rvm集成,并将所有显示的变量从
rvm info
保存到env_keep,理论上它应该可以工作,只是小心不要弄乱任何东西

我应该补充一点,我使用的是Capistrano multistage,所以rails_env变量设置在/deploy/staging.rbGavin中,请添加您得到的错误和stacktrace?这是相关部分:*[out::xxx.xxx.xxx.xxx]sh:只要:not found命令完成***[deploy:update_code]回滚*执行“rm-rf/var/www/mysite/staging/releases/20110215174217;true”服务器:[“xxx.xxx.xxx.xxx”][xxx.xxx.xxx.xxx]执行命令失败:“sh-c'cd/var/www/mysite/staging/releases/20110215174217&&无论何时——清除crontab mysite”在xxx.xxx.xxx.xxx上,请记住,默认情况下,Capistrano不会启动会话并运行~/.bashrc等文件来设置env(例如,路径变量未根据需要设置)。另一个问题是/etc/sudoers文件配置不正确。你能将其粘贴到这里吗?这是where命令的一个快速解决方法,但它不能修复其他gem命令sudo cmd是否使用与cmd不同的路径?RVM是正确方向的一点…现在我也在我的服务器上安装了RVM,我正在为我的特定应用程序.ree使用gemset@myapp现在可以使用,因为我的部署用户现在可以使用gem可执行文件