このコピペチェックツールですが、サーバが現在7台位になっています。全部Conohaで作っています。mod_proxy_balancerを使って、APIアクセスをそこそこ捌けるようにして処理速度を稼いでいます。
■サーバが多いと、デプロイがとてもめんどい
はじめのうちはサーバが少なかったので、手動でリリースしていたのですが、台数が増えてデプロイがとても大変になってきました。そこで、複数サーバに同時にデプロイできるcapistranoというのが便利!というので使って見ました。
■構想はこんな感じ
1台デプロイサーバを作って、そこでコマンド一つで全てのサーバに対して同じソースコードをデプロイすることができるようにしていきます。
前提条件として以下が必要です。
・gitまたはsvn等のソース管理を使っている ・デプロイサーバからデプロイ先にssh接続ができる ・デプロイ先にはssh鍵接続形式のパスワードなしで接続できる ・デプロイ先でgitが利用できる ・デプロイ先でgitにssh経由で接続・操作ができる ・デプロイサーバにruby1.9以降がインストールされている(インストールすることができる)
■Rubyをインストールする
デプロイサーバはCentos6.7で構築しました。デフォルトではrubyが入っていなかったのでインストールしました。バージョン1.9以上が必要ということで、以下のようなyumコマンドでインストールしました。SCLというプロジェクトで、簡単にyumでruby1.9.3がインストールできました。
yum install centos-release-SCL
yum install ruby193
このruby1.9.3を利用する前に以下のコマンドを実行する必要があります。毎回必要みたいですね。
scl enable ruby193 bash
これで、capistranoをインストールする準備ができました。
■capistranoをインストールする
以下のコマンドでインストールします。capistrano3.4がインストールされました。
gem install net-ssh -v 2.9.2
gem install capistrano
gem install capistrano_colors
gem install capistrano-ext
gem install railsless-deploy
で、いろいろなサイトだとこれだけでcapコマンドというcapistranoのコマンドが使えるらしいのですが、どうも使えません。調べてみると、パスが通っていないみたいでした。なので、以下のコマンドで/usr/sbinにシンボリックリンクを貼っておきました。
ln -s /opt/rh/ruby193/root/usr/local/share/gems/gems/capistrano-3.4.0/bin/cap /usr/bin/cap
これで、準備完了です。
■設定ファイルを作る
設定ファイル配置用のディレクトリを一個作って、そこで以下のコマンドを実行しました。
cap install
すると、コマンド実行したディレクトリ直下に以下の様なファイルたちが出来上がりました。次に設定ファイルを変更します。今回はconfig/deploy.rbとproduction.rbを変更しました。
Capfile
config
-deploy.rb
-deploy
--production.rb
--staging.rb
-lib
この下のファイルはいじらない
■deproy.rbの変更
deproy.rbは以下のように変更しています。まずは、アプリケーションの名前とgitのパスを設定しておきます。先頭2行目あたりからです。gitはSSHで接続できるようにしておきます。
これで、デプロイコマンドを実行するたびに/var/www/example/currentディレクトリに最新のソースコードが設置されるようになります。currentディレクトリはシンボリックリンクになっているので、実際のソースコード配置場所は別になります。
set :application, 'example'
set :repo_url, 'git@hogehoge.org:example_git/example_git.git'
また、deporoy.rbの一番後ろに以下のコードを追加しておきました。これでcakephpのキャッシュディレクトがデフォルトで収められているapp/tmpディレクトリが777の権限になります。
namespace :deploy do
desc 'Restart application'
task :restart do
on roles(:app), in: :sequence, wait: 5 do
execute "chmod -R 777 #{fetch :deploy_to}/current/cakephp-2.6.10/app/tmp"
end
end
after :publishing, :restart
after :restart, :clear_cache do
on roles(:web), in: :groups, limit: 3, wait: 10 do
# Here we can do anything such as:
# within release_path do
# execute :rake, 'cache:clear'
# end
end
end
end
■production.rbの変更
production.rbは以下のように変更しました。role-based syntax項目の部分に以下の行を追加しました。これで、対象のサーバ192.168.0.2〜192.168.0.8までのサーバにSSHでログインし、gitコマンドでソースコードを取得するようになります。
role :app, %w{user@192.168.0.2 user@192.168.0.3 user@192.168.0.4 user@192.168.0.5 user@192.168.0.6 user@192.168.0.7 user@192.168.0.8}
対象のサーバに対して、パスワードなしでログインできるようにしておく必要があります。パスワードなしでSSH接続する方法はこちらで紹介しています
■実行してみる
以下のコマンドでリリースすることができます。それぞれのサーバにSSH接続して、gitで最新のソースコードを取得しているログが見えます。
cap production deploy
ちょっといろいろ面倒臭いですが、一度設定してしまえばかなり楽にソースのデプロイをすることが可能になります。手動でやるよりも事故が起きにくくなります。
なるべくプロジェクトの最初の段階で対応したほうが良いかと思います。参考にしてみてください。