Capistrano
- 2007.02.06
- Ruby/Rails, åå¼·ä¼è³æ
â» ãã®è³æã«ã¤ãã¦
2006å¹´4æã®åå¼·ä¼è³æãCapistranoã®ãã¼ã¸ã§ã³ã¢ããï¼ç¾æç¹ã§ã¯1.3.1ã«ãªã£ã¦ã¾ããï¼ã«ãã仿§å¤æ´ãªã©ã«åããã¦ã¡ãã£ã¨ä¿®æ£ãããã®ã§ãã 質çå¿çã®é¨åã¯å½æã®ã¾ã¾ãªã®ã§æåã®è³ªåãåã ããã§ãã
Capistranoã£ã¦ä½ãªã®ã
ãããã¤ãã¼ã« ãããã¤=é å
åè : Capistrano: Automating Application Deployment
ä¸è¨ã§è¨ãã¨è¤æ°ã®ãµã¼ãä¸ã§åæã«ä¸¦è¡ãã¦ã³ãã³ããå®è¡ã§ãããã¼ã«ã è¤æ°ã®ãµã¼ãã§åãã¦ãããµã¼ãã¹ã®ãããã¤ã楽ã«è¡ããã¨ãã§ããã
Railsèµ·æºãªã®ã§Railsã«ç¹åããé¨åãããããã»ãã®ã¢ããªã±ã¼ã·ã§ã³ã§ã使ããã
æã¯SwitchTowerã¨å¼ã°ãã¦ãããã¯ã¦ãªã§ã使ããã¦ãã
ä½ãããã®ã
è¤æ°ãµã¼ãã¸ã®ä½æ¥ãå¹çåãèªååã§ãã
å®ç¾©æ¸ã¿ã®æ¨æºã¿ã¹ã¯ã«æ²¿ã£ãéç¨ãããã¨ãããã¤ã«å¿ è¦ãªè¦ä»¶ãèããæéãæ¸ã£ã¦æ¥½
ãã§ã«æ±ºã¾ã£ã¦ããéç¨ããã¼ãèªååãããªãæ¨æºã¿ã¹ã¯ãã¾ã£ããç¡è¦ãã¦ä¸æ¸ããã¡ãã£ã¦ããã
ä¾ãã°
$ cap httpd_config_update
$ cap restart
ããã ãã§ãã¹ã¦ã®ãµã¼ããæ°ããè¨å®ã§åèµ·åãããã æ°ããè¨å®ãã¡ã¤ã«ã¯subversionã¨ãããã¨ã£ã¦ããã¨ããã
Capitranoã使ãããã®è¦ä»¶
Capistranoãå®è¡ãããµã¼ã
- Capistranoãã¤ã³ã¹ãã¼ã«ããã¦ããï¼ã£ã¦ãã¨ã¯ãã¡ããRubyãï¼
ãªã¢ã¼ãã®ãµã¼ããã¡
- POSIXã·ã§ã«ã³ãã³ããå®è¡ã§ãã
- SSHæ¥ç¶ã§ãã
- ã¦ã¼ã¶åã¨ãã¹ã¯ã¼ãã¯æãã
- Rubyã¯ç¹ã«å ¥ã£ã¦ãªãã¦ããã
ãµã¼ããäºå°ä»¥ä¸ãªãã¨ããã¾ã楽ããããã¾ããã
ã¨ãããã使ã£ã¦ã¿ãã
ã¤ã³ã¹ãã¼ã«
Ruby
ã¾ãé©å½ã«ãã½ã¼ã¹ããã§ããã¤ããªããã§ãã好ãã«ã
gem
ã½ã¼ã¹è½ã¨ãã¦ãã¦ããã¤ããªã¯ãªãã¿ããã
Capistrano
$ sudo gem install capistrano -y
以ä¸ã®ã³ãã³ãã§ãã«ãã表示ãããã°ãªãã±ã¼
$ cap -h
ç·ã®ç°¡åã¬ã·ã
ã¤ã³ã¹ãã¼ã«ã§ãããCapistranoã®ã¬ã·ããæ¸ãã¦ä½¿ã£ã¦ã¿ãã
otoko.rb
set :application, "ff_tools"
set :user, "kan"
set :password, "pasuwa-do"
role :local, "localhost"
desc "say hello to all hosts"
task :hellowello do
run "echo Hello, $HOSTNAME for #{application}"
end
å®è¡
-f ã§ã¬ã·ããã¡ã¤ã«ãæå®ãã¾ããï¼æã¯ -r ã§ããï¼ -f ãæå®ããªãã¨ããã©ã«ãã§./config/deploy.rbãèªããã¨ãã¾ãã
$ cap -f otoko.rb hellowello
ãã¼ã«ã«ãã¹ãã§echoããã ãã®ã¤ã¾ããªãã¬ã·ãã ã¾ãã§ãåããªãã¨ãã£ã¨ã¤ã¾ããªãããããã¨ããããã¯ããã§åå¼ã
追å ã§ãããªã¢ã¼ããµã¼ããããã°ã¡ãã£ã¨é¢ç½ããªãã
role :local, "localhost", "192.168.1.101", "192.168.1.102"
ã¬ã·ããæ¸ãã
ã¬ã·ãã«å«ã¾ããã®ã¯åºæ¬çã«ä»¥ä¸ã®ä¸ã¤ã®è¦ç´ ã
- 夿°
- ãã¼ã«
- ã¿ã¹ã¯
ãã¨åºæ¬çã«Rubyã®ææ³ãå ¨é¨ä½¿ããã åæ¾ãã¤ããªããªããªãç¨åº¦ã«å¥½ãã«æ¸ãã¨ã
夿°
set :夿°å, å¤
- setãã¼ã¯ã¼ãã§å®ç¾©
- Rubyã®å¤æ°ã¨ãã¦åç §
set :application, "ff_tools"
set :hellocommand, "echo Hello, $HOSTNAME"
run "echo #{application}"
run hellocommand
ãã¼ã«
role :ãã¼ã«å, "host"[, "host2", ...]
- ãã¼ã«åã¯å¥½ãã«ï¼åºæ¬ã¯railsã«ã®ã£ã¨ã£ã¦app, web, dbï¼
- ãã¼ã«ï¼åãå¦çãå®è¡ãããµã¼ãã®ã°ã«ã¼ã
- ã²ã¨ã¤ã®ãã¼ã«ã«å«ã¾ãããµã¼ããä¸è¡ã§å ¨é¨å®ç¾©ãããã¨ãã§ããããè¤æ°è¡ã§å®ç¾©ãããã¨ãã§ãã
- ãã¼ã«ã®ä¸ã§ãprimaryã®ãããªãã©ã°ãä½ãã
role :app, "app01.feedforce.jp", "app02.feedforce.jp"
role :web, "web01.feedforce.jp"
role :web, "web02.feedforce.jp"
role :db, "db01.feedforce.jp", :primary => true
role :db, "db02.feedforce.jp"
role :spider, "spider01.feedforce.jp"
ã¿ã¹ã¯
task :ã¿ã¹ã¯å do ... end
task :ã¿ã¹ã¯å, :roles => :ãã¼ã«å do ... end
task :ã¿ã¹ã¯å, :roles => [:ãã¼ã«å1, :ãã¼ã«å2] do ... end
task :ã¿ã¹ã¯å, :roles => :ãã¼ã«å, :only => { :primary => true } do
- ã¿ã¹ã¯ã¯ã¡ã½ããã¨åãããã«ã»ãã®ã¿ã¹ã¯å ã§ä½¿ãã
- ã§ãã¡ã½ãããããªãããä»ã®ã¡ã½ããããã¯ä½¿ããªã
- ãã¼ã«ãæå®ããªãã¿ã¹ã¯ã¯ãã¹ã¦ã®ãµã¼ãã§å®è¡ããã
- taskã®ç´åã®è¡ã«descã§èª¬æãæ¸ãã
desc "say hello to all hosts"
task :hellowello do
run "echo Hello, $HOSTNAME"
end
è±ã®ç¥è : ã¿ã¹ã¯å ã§ã¿ã¹ã¯ãå¼ã³åºããã¨ãã®ãã¼ã«
ã¿ã¹ã¯ãã¡ã½ããæ°åã§ä½¿ããã¨ããã¨ãã¼ã«ã§è¥å¹²ã¯ã¾ããããããªãã®ã§æ³¨æã
ã¿ã¹ã¯ã¯ã©ãã§å¼ã³åºããããã¨é ãªã«èªåã®ä»äºç¯å²ï¼:rolesï¼ãå®ãã
ä¾ãã°ä»¥ä¸ã®ãããªã³ã¼ãããã£ãã¨ããã
roletest.rb
role :app, "app01.feedforce.jp", "app02.feedforce.jp"
role :web, "web01.feedforce.jp"
set :application, "hogehoge"
task :hellowello do
run "echo Hello, $HOSTNAME"
end
task :helloapps, :roles => :app do
hellowello
run "echo $HOSTNAME is apps?"
end
ãã®ã³ã¼ãã«ã¯helloappsãå®è¡ããã¨ãã«hellowelloãappã ãã«é©ç¨ããã¦æ¬²ããã¨ããé¡ããè¾¼ãã¦ã¿ãã
å®è¡
$ cap -f roletest.rb helloapps
æå¾ éãã®çµæã«ãªããã¨ã念ãã¤ã¤å®è¡ã
å®è¡çµæ
loading configuration /usr/local/lib/ruby/gems/1.8/gems/capistrano-1.1.0/lib/capistrano/recipes/standard.rb
loading configuration ./roletest.rb
* executing task helloapps
* executing task hellowello
* executing "echo Hello, $HOSTNAME"
servers: ["app01.feedforce.jp", "app02.feedforce.jp", "web01.feedforce.jp"]
[app01.feedforce.jp] executing command
[app02.feedforce.jp] executing command
[web01.feedforce.jp] executing command
** [out :: app01.feedforce.jp] Hello, app01.rsssuite.jp
** [out :: app02.feedforce.jp] Hello, app02.rsssuite.jp
** [out :: web01.feedforce.jp] Hello, web01.rsssuite.jp
command finished
* executing "echo $HOSTNAME is apps?"
servers: ["app01.feedforce.jp", "app02.feedforce.jp"]
[app01.feedforce.jp] executing command
[app02.feedforce.jp] executing command
** [out :: app01.feedforce.jp] app01.rsssuite.jp is apps?
** [out :: app02.feedforce.jp] app02.rsssuite.jp is apps?
command finished
æ®å¿µãªããé¡ããããªããhellowelloã¯ãã¹ã¦ã®ãã¼ã«ã§å®è¡ããã¦ãã¾ã£ãããã ã ãã®ä¸ã®runã¯appã ãã対象ã«å®è¡ãããã®ã«ã
ããããæã«ã¯ã¿ã¹ã¯ãããªãã¦ã¡ã½ããã使ããããªãã ã§ãã¡ã½ããå ã§ã¯ãªã¢ã¼ãã«ã³ãã³ããæãããã«ãã¼ã¿ã¹ã¯ã使ããªãã¦å°ãã
ããã§
Tips : ã¿ã¹ã¯ãã¡ã½ããå ã§å®ç¾©
ã¨ããæãã§ãããã¨æã£ã¦ãã£ã¦ã¿ããã§ãã¡ãã£ãã
以ä¸ã®ããã«ããã
def prepare_hellowello(target_roles)
task :hellowello, :roles => target_roles do
run "echo Hello, $HOSTNAME"
end
end
task :helloapps, :roles => :app do
prepare_hellowello :app
hellowello
end
å®è¡
$ cap -f roletest.rb helloapps
ãã¦ã©ããªããã
å®è¡çµæ
loading configuration /usr/local/lib/ruby/gems/1.8/gems/capistrano-1.1.0/lib/capistrano/recipes/standard.rb
loading configuration ./roletest.rb
* executing task helloapps
* executing task hellowello
* executing "echo Hello, $HOSTNAME"
servers: ["app01.feedforce.jp", "app02.feedforce.jp"]
[app01.feedforce.jp] executing command
[app02.feedforce.jp] executing command
** [out :: app01.feedforce.jp] Hello, app01.rsssuite.jp
** [out :: app02.feedforce.jp] Hello, app02.rsssuite.jp
command finished
æå¾ éãã
ãããªé¢¨ã«ããã¨åãã¿ã¹ã¯ã対象ãã¼ã«ãå¤ãã¤ã¤å®è¡ã§ããã ã¡ãªã¿ã«prepare_hellowelloãé£ç¶ãã¦å¯¾è±¡ãã¼ã«ãå¤ãã¦å¼ã³åºãã¦ãå¹³æ°ã
æ¡å¼µã¿ã¹ã¯ before_* - after_*
ã¿ã¹ã¯ã®åå¾ã«ä½ãå¦çãå®è¡ãããå ´åã¯before_*ã¨after_ã§æ¡å¼µã§ãã
task: before_setup do ... end
task: setup do ... end
task: after_setup do ... end
使ãã©ããã¯
å®ç¾©æ¸ã¿ã¿ã¹ã¯ãã¡ããã£ã¨æ¡å¼µãããã¨ã
åå¾ã®å¦çãå®è¡ããããµã¼ãã¨ããã§ãªããµã¼ããããã¨ã
æ¨æºã¿ã¹ã¯
Railsã®éç¨ã«ãããããã¿ã¹ã¯ãæ¨æºã¿ã¹ã¯ã¨ãã¦å®ç¾©ããã¦ããã
ãªã«ã¯ãªãã¨ãã¿ã¹ã¯ç¢ºèª show_tasks
descä»ãã®ã¿ã¹ã¯ãä¸è¦§è¡¨ç¤ºã
rake -T ã®ãããªåå¨ã
便å©ãªæ¨æºã¿ã¹ã¯ shell
æ¨æºã¿ã¹ã¯ã®ä¸ã§ãshellã ãã¯æ ¼å¥ä¾¿å©ã
roleã¨ãã¦å®ç¾©ãã¦ãããã¹ã¦ã®ãµã¼ãã«å¯¾ãã¦å¯¾è©±çã·ã§ã«ãå®è¡ã§ããã
$ cap -f otoko.rb shell
* executing task shell
====================================================================
Welcome to the interactive Capistrano shell! This is an experimental
feature, and is liable to change in future releases.
--------------------------------------------------------------------
cap> echo $HOSTNAME
[establishing connection(s) to localhost, 192.168.1.101, 192.168.1.102]
[localhost] executing command
[192.168.1.102] executing command
[192.168.1.101] executing command
[localhost] lb03.feedforce.jp
[192.168.1.101] web01.feedforce.jp
[192.168.1.102] web02.feedforce.jp
command finished
cap> pwd
[localhost] executing command
[192.168.1.102] executing command
[192.168.1.101] executing command
[192.168.1.102] /home/kan
[localhost] /home/kan
[192.168.1.101] /home/kan
command finished
cap>
cap> date > date.txt
[localhost] executing command
[192.168.1.102] executing command
[192.168.1.101] executing command
command finished
cap> cat date.txt
[192.168.1.102] executing command
[192.168.1.101] executing command
[localhost] executing command
[192.168.1.102] Wed Jan 31 12:48:41 JST 2007
[192.168.1.101] Wed Jan 31 12:48:44 JST 2007
[localhost] Wed Jan 31 12:48:42 JST 2007
command finished
cap> exit
exiting
ããã¾ãè¤éãªãã¨ããã¨ä½ããªãã ãããããªããªããã©ããµã¼ãã¹ã®åèµ·åã¿ãããªåç´ãªã³ãã³ãæå ¥ã¨ã確èªã«ä½¿ããã
ãã®ä»
- ã¢ãããã¼ãã¯deploy
- ã¢ãããã¼ãã§ãããããªã£ããrollback
- DBã®æ´æ°ãããã¨ãã¯migrate
- rollbackã¯DBã®å¤æ´ã¯ãã¼ã«ããã¯ã§ãã¾ãã
- ã¡ã³ãç»é¢è¡¨ç¤ºã¯disable_web
- ã¡ã³ãçµäºã¯enable_web
- çã ...
詳ããã¯ããã¥ã¡ã³ãå«ã
ã¿ã¹ã¯ãä½ãã
æ¨æºã¿ã¹ã¯ä»¥å¤ã«åæã«ä½ã£ã¦ããã
以ä¸ã¯ã¿ã¹ã¯å ã§ä½¿ãã便å©ãªãã«ãã¼ã¿ã¹ã¯ã
| ã¿ã¹ã¯å | 説æ |
|---|---|
| run | ä¸è¬ã¦ã¼ã¶ã§ã³ãã³ãå®è¡ |
| sudo | root権éã§ã³ãã³ãå®è¡ ãªã¢ã¼ãå´ã§sudoã®è¨å®ããã¦ãªãã¨ä½¿ããªãã |
| put | ãã¡ã¤ã«ä½æ |
| delete | ãã¡ã¤ã«åé¤ |
| render | Erbãã³ãã¬ã¼ããã¬ã³ããªã³ã°ãç°å¢ãã¨ã«ãã¡ã¤ã«å 容ãã«ã¹ã¿ãã¤ãºãããã¨ããªã©ã« |
| transaction | ä¸é£ã®ã³ãã³ãããã©ã³ã¶ã¯ã·ã§ã³ã¨ãã¦æãã |
| on_rollback | transactionããã¼ã«ããã¯ããããã«ä½¿ã |
ãã¨ã¯Rubyãé§ä½¿ãã¦ããããã§ãã¾ãã®ã§ã
æ¡å¼µ
ã¿ã¹ã¯ã©ã¤ãã©ãª
- æ±ç¨çã«ä½¿ããããªCapistranoã¿ã¹ã¯ã¯ã©ã¤ãã©ãªã¨ãã¦åãåºãã¨ä¾¿å©
- 夿°ããã¾ã使ã£ã¦ããããªç°å¢ã§ä½¿ããããã«ããã¨å
ãã¡ã¤ã«
cap_task_lib.rb
ä¸èº«ã¯ã¬ã·ãã¨åæ§ã«ã¿ã¹ã¯ãå®ç¾©ã
使ãã¨ã
require 'cap_task_lib'
ã¬ã·ãå ã§requireã
æ¡å¼µã©ã¤ãã©ãª
Capistranoèªä½ãRubyã¹ã¯ãªããã§æ¡å¼µ
以ä¸ç¥
㤠ã ããã¥ã¡ã³ãã
è³æã§è§¦ããããªãã£ã話é¡
- ã¬ã·ãå ã§ä½¿ãæ¨æºå¤æ°
- Capistranoã®ã³ãã³ãã©ã¤ã³ãªãã·ã§ã³
㤠ã ããã¥ã¡ã³ãã
質çå¿ç
ã:rolesãã¨ãã®ã:ãã使ãã®ã¯rubyã®è¨æ³ï¼
Rubyå士ã仿¥ã¯å¾¡è¶ãæ°´ã«è¡ã£ã¦ãã¾ã£ãã®ã§ãããã¾ãããï¼http://shibuyajs.org/ï¼
調ã¹ã¦ã¿ããã·ã³ãã«ã¨ãããã®ã ããã§ãã
- æååã®ä»£ããã«ããã·ã¥ã®ãã¼ã«ä½¿ã
- ç¹ã«å¤ã«æå³ã®ãªã宿°ã使ãããã¨ãã«ã·ã³ãã«ã使ã
ã¨ãããã¨ããããã§ãã
æ¨æºã¿ã¹ã¯ã¯ãã®ã¾ã¾ä½¿ããã®ï¼
夿°ã¨ãã¼ã«ã ãæå®ããã°ä½¿ãã¾ãã
éã«è¨ãã¨ç°å¢ã«åããã¦å¤æ°ã¨ãã¼ã«ãæå®ãããã¨ã ãã¯ããå¿ è¦ãããã¾ãã
ã»ãã¥ãªãã£ã®ããã«ç´æ¥SSHã§æ¥ç¶ã§ããªããã¹ãã«å¯¾ããå¦çã¯ï¼
ã§ãã¾ããã
ãã®ãã¹ãã«SSHã§æ¥ç¶ã§ãããã·ã³ãCapistranoå®è¡ãã·ã³ã«ããå¿ è¦ãããã¾ãã
ãªã¢ã¼ããµã¼ãã®å¦çã®å¤±æã¯ã©ãè¦ãï¼
ãªã¢ã¼ããµã¼ãå´ã§æ¨æºåºåã¸ã®åºåããã¡ãå´ã«è¿ã£ã¦ããã®ã§ããã§è¦ãã
ã¤ã¾ããµã¼ãä¸ã§ç´æ¥å®è¡ããã®ã¨ä¸ç·ã 失æãã¦ãã ãã¾ããªå¦çã®å ´åã¯æå失æãããã¾ããã
æ¨æºã¿ã¹ã¯ã®ãã¼ã«ããã¯ã¯ã©ãããä»çµã¿ã§ï¼
éå»ã®ãªãªã¼ã¹ããããã£ã¬ã¯ããªã«ä¿åãã¦ããã¦ãããã«ã·ã³ããªãã¯ãªã³ã¯å 夿´ã
Capistranoå°å ¥ããå ´åã¯ãã£ã¬ã¯ããªæ§æã¨ãå¤ããªãã¨ã ãï¼
æ¨æºã¿ã¹ã¯ã®æµãã«æ²¿ãå ´åã¯ãã®ã¨ããã
ç¾å¨ã®èªåãã¡ã®éç¨ã«ãããã¦ç¬èªã«ã¿ã¹ã¯ãããªããªä½ã£ã¦ãããªããã®éãã§ã¯ãªãã
ãã¤å°å ¥ï¼
Coming Soon...
æ¬æ°ã
ï¼ä»ã¯ã¨ã£ãã«å°å ¥æ¸ã¿)
