Sudo не имеет доступа к командам оболочки при развертывании с Capistrano - PullRequest
3 голосов
/ 15 февраля 2011

Я развертываю свое приложение на Rails 3, используя capistrano.

У меня есть пользователь (deploy), который был добавлен в sudoers. Это пользователь, с которым я разворачиваюсь.

Когда я вхожу в систему на сервере, я имею доступ ко всем нужным командам gem .ie: bundle, всякий раз, когда и т. Д.

Кажется, что Capistrano работает как sudo, и когда я пытаюсь:

sudo whenever

Я получаю

sudo: whenever: command not found

Это означает, что каждый раз, когда я пытаюсь выполнить развертывание, происходит сбой и происходит откат.

Я пытался установить: use_sudo в false в моем файле deploy.rb, но все равно не повезло

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"

1 Ответ

4 голосов
/ 15 февраля 2011

на сервере, работающем which whenever или whereis whenever, вы должны получить полный путь к команде и поместить ее в скрипт:

set :whenever_command, "path_to-whenever"

Это не чистое решение, но может работать.


Другим решением может быть реконфигурация sudo, перейдите на /etc/sudoers и посмотрите на env_keep, добавив PATH, возможно, было бы важно, чтобы сохранить все вещи, важные для приложения, вы можете использовать интеграцию rvm, capistrano-rvm и поместитьвсе отображаемые переменные от rvm info до env_keep, теоретически это должно работать, только будьте осторожны, чтобы ничего не испортить

...