デプロイに rsync を使う
目がかい~~~の。こんにちは nakamura です。暖かくなってきたので、ぼちぼち自転車通勤始めようと思ってます。
デプロイって面倒な作業ですよね。本番環境へのデプロイは特に神経を使う上に FTP クライアント等を使っての手動アップだといつか絶対に漏れが出そう。サーバが複数台あったりするともう最悪!今日はその辺りのストレスを軽減する方法として rsync コマンドをご紹介します。
オプション色々
rsync はオプションがむちゃんこあります。代表的なものをいくつがご紹介しますが、もっと知りたい方はコマンドラインで man rsync と実行すれば公式のマニュアルが読めますよ。
-a オプション
--archive オプションの略で更には -rlptgoD オプションをひとつにまとめたものです。細かい点はマニュアルを参照してもらえれば分かりますが、一言で言うと『ローカルとリモートを全く同じ状態にする』為のオプションです。シンボリックリンクも同期されますし、パーミッションやタイムスタンプが異なるだけのファイルも同期対象となります、
-v オプション
詳細表示する為のオプションです。これを指定すると転送されるファイルの一覧や転送スピード等を見る事が出来ます。
--delete オプション
リモートに存在するファイルがローカルにない場合、そのファイルを削除します。
--exclude, --exclude-from オプション
同期から除外したいファイル、ディレクトリをパターンマッチングな文字列で指定します。除外対象がたくさんある場合は --exclude-from オプションで除外対象のリストファイルを指定するのが良いでしょう。
-e オプション
rsync はデフォルトで 873 番ポートを使用して rsyncd と通信しますが、rsyncd が立ち上がっていなくても他にリモートログインする方法があれば利用可能です。-e オプションはその方法を指定する為のオプションでデフォルトでは SSH を使います。なので、普通に SSH で接続するだけならわざわざ指定する必要はないのですが秘密鍵を明示的に指定したり、SSH のポート番号を指定したりする場合には -e オプションが必要になります。
シェルでデプロイスクリプトを書いてみる
簡単なシェルスクリプト化しておくと、日々のデプロイ作業が更に楽になります。めちゃくちゃシンプルですが例えばこんな感じ。
#!/bin/bash
# deploy.sh
# Usage: deploy.sh [check|exec]
# デプロイ先のサーバ。シェルの場合スペース区切りで配列になります。
HOSTS="web1 web2 web3"
# 引数に応じてオプション切り替え
if [ $1 == "check" ]; then
# -n オプションは実行結果を表示するだけで実際に転送はしない。
OPTION="-avn --delete --omit-dir-times -e 'ssh -i deploy.ssh2.key' --exclude=.svn";
elif [ $1 == "exec" ]; then
# ↑から n を取っただけ。
OPTION="-av --delete --omit-dir-times -e 'ssh -i deploy.ssh2.key' --exclude=.svn";
else
echo "Invalid argument";
echo "Usage: deploy.sh [check|exec]";
exit;
fi
# デプロイ先のサーバ分ループ
for HOST in $HOSTS; do
# ここで rsync 実行
rsync $OPTION /var/www/htdocs/ deploy_user@$HOST:/var/www/htdocs/;
done;
引数に check を与えるとデプロイ対象のファイルが表示され、exec を与えると実際にデプロイされます。
終わりに
共有のレンタルサーバ等では厳しいですが、SSH 接続が出来るサーバであれば使えるはずなのでぜひ一度試してみてください。デプロイ作業の負荷が一気に軽減されますよ!