Capistrano Rails и развертывание Ruby приложений

Capistrano чаще всего используется с Ruby-on-rails, предназначение данного пакета в удаленном развертывании приложений — которое сводится к выполнению заданных команд по SSH на удаленных серверах. Рассмотрим как на базовом уровне работать с Capistrano Rails.

 

При установке Ruby в домашнем каталоге пользователя создается Gemfile. Чтобы ставить нужные гемы затем достаточно его редактировать и перечитывать. Установим Capistrano (все действия от имени непривилегированного пользователя)

 

mcedit Gemfile

gem 'Capistrano'

 

bundle

capify .

Команда добавляет нужные файлы, вывод следующий

[add] writing `./Capfile'
[add] writing `./config/deploy.rb'
[done] capified!

 

 

Инструкции Capistrano Rails и их исполнение

Инструкции и настройки пакета находятся в созданном файле config/deploy.rb, редактируем его добавляя первую инструкцию

 

mcedit config/deploy.rb

task :hello do
puts «hello world»
end

 

Чтобы выполнить нужно ввести в консоли имя задачи после команды cap

cap hello

 

Или то же самое через bundle

bundle exec cap hello

 

Одну инструкцию Capistrano можно вызывать внутри другой

mcedit config/deploy.rb

task :hello do
puts «hello world»
goodbye
end

task :goodbye do
puts «goodbye world»
end

 

Сейчас выполнив кап-файл увидим и приветствие и прощание

bundle exec cap hello

 

Можно сделать то же иначе

mcedit config/deploy.rb

task :hello do
puts «hello world»
#goodbye
end

task :goodbye do
puts «goodbye world»
end
after :hello, :goodbye

 

Вновь обращаемся к файлу и видим hello world и goodbye world

bundle exec cap hello

 

 

Можно задать переменную и подставлять ее в команды (в примере — recipient)

mcedit config/deploy.rb

set :recipient, «Ruby»

task :hello do
puts «hello #{recipient}»
#goodbye
end

task :goodbye do
puts «goodbye #{recipient}»
end
after :hello, :goodbye

 

 

bundle exec cap hello

hello Ruby

 

Так на базовом уровне задаются инструкции на локальной машине, чтобы выполнять их на удаленном сервере нужно дополнить файл deploy.rb

 

mcedit config/deploy.rb

server «123.123.123.123», web
set :user, «programmer»

#web здесь это — роль

set :recipient, «Ruby»

task :hello do
puts «hello #{fetch(:recipient, «World»)}»
run «echo 'Hello World' > ~/hello»
#goodbye
end

task :goodbye do
puts «goodbye #{recipient}»
end
after :hello, :goodbye

 

 

При выполнении cap hello команда отправится на сервер с указанным адресом и выполнится от имени пользователя deployed

cap hello

 

Можно проверить все ли прошло так, как задумывалось авторизовавшиьс на сервере и просмотрев содержимое файла /home/programmer/hello (hello в домашнем каталоге пользователя)

 

 

mcedit config/deploy.rb

server «123.123.123.123», web
set :user, «programmer»

set :recipient, «Ruby»

default_run_options[:pty] = true

#if it requests for a password it will pass it to the shell

task :hello do
puts «hello #{fetch(:recipient, «World»)}»
run «#{sudo} cp ~/hello /hello»
#goodbye
end

task :goodbye do
puts «goodbye #{recipient}»
end
after :hello, :goodbye

 

Роли в CAPISTRANO и работа с несколькими серверами

Можно работать с несколькими серверами .при этом их обычно разделяют по выполняемым ролям на web-сервер, app — сервер приложений, db — сервер баз данных. Роли могут разделяться между машинами или выполняться одной из них.

 

mcedit config/deploy.rb

server «123.123.123.123», :web, :app, :db, primary: true
set :user, «programmer»

#or like this:

#server :web, «123.123.123.124»
#server :app, «123.123.123.124»
#server :db, «123.123.123.124», primary: true
#set :user, «programmer»

set :recipient, «Ruby»

default_run_options[:pty] = true

#if it requests for a password it will pass it to the shell

task :hello, roles: :db do
puts «hello #{fetch(:recipient, «World»)}»
run «#{sudo} cp ~/hello /hello»
#goodbye
end

task :goodbye do
puts «goodbye #{recipient}»
end
after :hello, :goodbye

 

Проект развивается и скачать его можно с github

 

В cap файл можно внести и более содержательные инструкции — например, указания на необходимость установки пакетов

require 'capistrano/deploy'

Затем, как всегда, нужно выполнить команду cap с именем инструкции.

 

Capistrano может использоваться не только с приложениями на Ruby, но и с PHP.

Также читайте про запуск Unicorn в связке с Nginx и Apache

Запись опубликована автором в рубрике Ruby.