menu
書いてる野郎
orebike@gmail.com
よく説明ではデプロイツールとか書かれてますけど、もっと単純に サーバをオートパイロットするためのコマンド送り込みツールと考えたほうがいろいろ使えていいかも
他のサイトの解説ではデプロイ先のサーバそのものに入れてリモートから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
というタスクを実行するのならば、実行順番は
のように実行される。命令の実行順番は同期的だけど各ロールに対しては並行に行われる。
実行したいタスクを名指しして実行するだけ
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ディレクトリ以下に転送される。