Sudo не имеет доступа к командам оболочки при развертывании с помощью Capistrano

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

У меня есть пользователь (развертывание), который был добавлен в 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,  "[email protected]: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"

person bodacious    schedule 15.02.2011    source источник
comment
Я должен добавить, что я использую многоступенчатый Capistrano, поэтому переменная rails_env установлена ​​в /deploy/staging.rb   -  person bodacious    schedule 15.02.2011
comment
Гэвин, добавьте полученную ошибку и трассировку стека?   -  person Augusto    schedule 15.02.2011
comment
Это соответствующая часть: ** [out :: xxx.xxx.xxx.xxx] sh: when: not found команда завершена *** [deploy: update_code] откат назад * выполнение rm -rf / var / www / mysite / постановка / релизы / 20110215174217; истинные серверы: [xxx.xxx.xxx.xxx] [xxx.xxx.xxx.xxx] выполнение команды command завершено неудачно: sh -c 'cd / var / www / mysite / staging / Release / 20110215174217 && when --clear- crontab mysite 'на xxx.xxx.xxx.xxx   -  person bodacious    schedule 15.02.2011
comment
Помните, что Capistrano по умолчанию не запускает сеанс и не запускает файлы ~ / .bashrc и т. Д., Которые устанавливают env (поэтому, например, переменная PATH не установлена ​​должным образом). Другая проблема - плохо настроенный файл / etc / sudoers. Вы можете вставить это сюда?   -  person Szymon Jeż    schedule 16.02.2011


Ответы (1)


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

set :whenever_command, "path_to-whenever"

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


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

person mpapis    schedule 15.02.2011
comment
Это быстрый обходной путь для команды when, но он не исправляет другие команды gem. Использует ли sudo cmd путь, отличный от cmd? - person bodacious; 15.02.2011
comment
RVM был точкой в ​​правильном направлении ... Теперь я установил RVM и на свой сервер, и я использую gemset для своего конкретного приложения. ree @ myapp Работает теперь приятно, так как исполняемые файлы gem теперь доступны моему пользователю развертывания - person bodacious; 17.02.2011