Capistrano

Capistrano

Capistranoとは

よく説明ではデプロイツールとか書かれてますけど、もっと単純に サーバをオートパイロットするためのコマンド送り込みツールと考えたほうがいろいろ使えていいかも

使ってみる

他のサイトの解説ではデプロイ先のサーバそのものに入れてリモートからCapistranoを叩くという構成をとることが多いが それだとデプロイのソース元を公開サーバが知る必要があるわけで、そうなるとソース元も公開しないといけないわけで、 いろいろ面倒なことになって導入障壁がとたんにあがってしまう。

なので今回は開発機にCapistranoをインストールして駆動し公開サーバにデプロイするという構成にしてみる。 これだとソース元は開発機(開発機が取得できるソース元ならなんでもいい)だし、ソース元を公開しなくていい。

それに公開サーバもそれを知っている必要がないし、まぁデプロイスクリプトが開発ごとに分散してしまうというのがあるのだが だれもかれもが公開サーバにデプロイする権限があるとも思えないので現実的に導入しやすいよねということで。

開発機Windows、公開サーバLinuxというよくある想定。

インストール

CapistranoはRubyで動いているのでRubyをインストールする。

簡単に済ませるために一発インストール。RubyInstaller for Windows

gemも同時にインストールされるのでそれを使ってCapistranoをインストール

gem install capistrano

終了。インストールされるとcapというコマンドが使えるようになっているのでこいつを使ってごにょごにょする。

タスクを作る

実行の単位をタスクにして管理。そのタスクをRubyコードで書く。今回は

D:/captasks/sample/hoge01.rb

というファイルをつくって中に↓のように書く。 設定ファイルっぽく書いているが、括弧が省略されているだけで全部メソッドに対する引数という形でパラメータを設定しているに過ぎない

set :user, "root"        #sshでログインするID
set :password, "hoge"    #↑のパスワード
 
#接続先にaaaという名前をつけて設定
role :aaa, "192.168.1.11"
 
#具体的なタスク
#タスク名(aaatask)に続き対象を示して、そのブロックにやってもらう内容を書いている。
#実行中に接続先での標準出力は実行側のモニタにエコーバックされる。
task :aaatask, :roles => [:aaa] do
  run "echo HelloWorld"
end

taskメソッドに渡すroleは引数の形式からわかるように配列で複数渡すことができる。Capistranoはこの複数のroleに対して並行かつ同期的に命令を1行ずつ実行してくれる。つまり

task :hoge, :roles => [:aaa,:bbb] do
  run "echo HelloWorld1"
  run "echo HelloWorld2"
end

というタスクを実行するのならば、実行順番は

  • 1,role aaa → echo HelloWorld1
  • 1,role bbb → echo HelloWorld1
  • 2.role aaa → echo HelloWorld2
  • 2.role bbb → echo HelloWorld2

のように実行される。命令の実行順番は同期的だけど各ロールに対しては並行に行われる。

実行

実行したいタスクを名指しして実行するだけ

cap -f hoge01.rb aaatask

結果こうなって実行されたことがわかる。

  * executing `aaatask'
  * executing "echo HelloWorld"
    servers: ["192.168.1.11"]
    [192.168.1.11] executing command
 ** [out :: 192.168.1.11] HelloWorld
    command finished in 125ms

後はここにやりたいスクリプトをじゃんじゃん書けばいいだけ

オリジナルの引数を取る

全自動じゃなくオリジナルの引数をコマンドラインから取りたい場合もあるだろう。そういうときはsオプションを使ってkey=valueのような形で書く

cap -f hoge01.rb aaatask -s hogearg=piyopiyo

そうすると内部のrubyこーどではkeyを変数名としてvalueを文字列として格納してくれるのでそれを使うだけ。

ファイルをアップロードする

ファイルをアップロードするにはブロック中で、「元、先、何で」の順で書くとあっぷされる

ファイルを指定のディレクトリへ

下の記述ならばローカルのindex.htmlをリモートの/var/www/html/ディレクトリにindex.htmlという名前で転送ということになる。

upload("/hoge/piyo/index.html", "/var/www/html/", :via => :scp)

ディレクトリの中身を指定のディレクトリへ丸々

ディレクトリを再帰的に転送したい場合はrecursiveのオプションをオンにする。

upload("/hoge/piyo/", "/var/www/html/", :via => :scp, :recursive => true)

こうするとpiyoディレクトリの中身が全部htmlディレクトリ以下に転送される。

関連ページ

タグ

ruby/capistrano.txt · 最終更新: 2019-12-25 10:26 by ore