Время ожидания Capistrano при развертывании с использованием Amazon RDS
Похоже, я не могу заставить Капистрано хорошо играть с амазонками. Я искал повсюду любую информацию о правильной настройке этого устройства, но ничего не нашел. Прямо сейчас, когда я cap deploy
, Время ожидания процесса истекает.
Это мое развертывание.РБ:
set :deploy_to, "/opt/bitnami/apps/annarbortshirtcompany.com/cms/"
set :scm, :git
set :repository, "ssh://user@ec2-repository.compute-1.amazonaws.com/~/repo/cms.git"
set :deploy_via, :remote_cache
set :user, "user"
ssh_options[:keys] = [File.join(ENV["HOME"], "EC2", "admin.pem")]
ssh_options[:forward_agent] = true
set :branch, "master"
set :use_sudo, true
set :location, "ec2-webserver.compute-1.amazonaws.com"
role :web, location
role :app, location
role :db, "cmsinstance.c7r8frl6npxn.us-east-1.rds.amazonaws.com", :primary => true
# If you are using Passenger mod_rails uncomment this:
namespace :deploy do
task :start do ; end
task :stop do ; end
task :restart, :roles => :app, :except => { :no_release => true } do
run "#{try_sudo} touch #{File.join(current_path,'tmp','restart.txt')}"
end
end
Имя пользователя для экземпляра базы данных RDS отличается от имени пользователя SSH, заданного здесь, но определяется в моей базе данных.в формате YML. Я думаю, что это, вероятно, не читает Капистрано, но понятия не имею, как это сделать случаться.
Когда я "cap deploy":
ubuntu@ubuntu-VirtualBox:~/RailsApps/cms$ cap deploy
* executing `deploy'
* executing `deploy:update'
** transaction: start
* executing `deploy:update_code'
updating the cached checkout on all servers
executing locally: "git ls-remote ssh://user@ec2-repository.compute-1.amazonaws.com/~/repo/cms.git master"
command finished in 1590ms
* executing "if [ -d /app-directory/shared/cached-copy ]; then cd /app-directory/shared/cached-copy && git fetch -q origin && git fetch --tags -q origin && git reset -q --hard ffc4ec7762566f801c4a9140aa3980dc71e3d06f && git clean -q -d -x -f; else git clone -q ssh://user@ec2-repository.amazonaws.com/~/repo/cms.git /app-directory/shared/cached-copy && cd /app-directory/shared/cached-copy && git checkout -q -b deploy ffc4ec7762566f801c4a9140aa3980dc71e3d06f; fi"
servers: ["ec2-webserver.compute-1.amazonaws.com", "dbinstance.us-east1.rds.amazonaws.com"]
*** [deploy:update_code] rolling back
* executing "rm -rf /app-directory/releases/20110607161612; true"
servers: ["ec2-webserver.compute-1.amazonaws.com", "dbinstance.us-east1.rds.amazonaws.com"]
** [deploy:update_code] exception while rolling back: Capistrano::ConnectionError, connection failed for: dbinstance.us-east1.rds.amazonaws.com (Errno::ETIMEDOUT: Connection timed out - connect(2))
connection failed for: dbinstance.us-east1.rds.amazonaws.com (Errno::ETIMEDOUT: Connection timed out - connect(2))
Зачем ему понадобилось "обновлять кэшированную проверку на всех серверах"? Сервер БД даже не должен быть нужен в этот момент. Я не знаю, как это исправить. Надеюсь, кто-нибудь укажет мне верное направление!
1 ответ:
У меня была именно эта проблема, и я боролся с ней в течение, как мне стыдно сказать, хороших 5 или 6 часов. В конце концов, когда я понял, в чем проблема, мне захотелось ударить себя, потому что я знал это когда-то, но забыл. Вот суть проблемы, начиная с этой части развертывания.РБ:
set :location, "ec2-webserver.compute-1.amazonaws.com" role :web, location role :app, location role :db, "cmsinstance.c7r8frl6npxn.us-east-1.rds.amazonaws.com", :primary => true
Когда вы определяете роли машин для Capistrano, вы на самом деле не определяете, какие машины будут играть определенную роль...скорее, вы идентифицируете , на котором машины код Capistrano будет выполняться при применении рецепта развертывания для роли. Поэтому, когда вы определяете роль: db, вы хотите указать на ваш экземпляр EC2, Не экземпляр RDS. Вы не можете подключиться по ssh к машине RDS, поэтому для Capistrano невозможно запустить рецепт там. Вместо этого укажите :db на ту же машину, на которую вы указываете :web и: app, т. е.
set :location, "ec2-webserver.compute-1.amazonaws.com" role :web, location role :app, location role :db, location, :primary => true
Как же тогда машина RDS имеет какое-либо участие? Ну, это база данных.yml файл, который диктует, что машина фактически выполняет СУБД, где SQL должен быть выполнен. Вам просто нужно убедиться, что вы устанавливаете значение host: для целевой базы данных, например:
production: adapter: mysql2 encoding: utf8 reconnect: false database: <your_db>_production pool: 5 username: <username> password: <password> host: cmsinstance.c7r8frl6npxn.us-east-1.rds.amazonaws.com
Есть смысл?
Я надеюсь, что это спасет кого-то другого от разочарования, которое я испытал.
- Дэвид