目的と想定読者
このガイドは、Rex(Rexfile)を使ってサーバーのセットアップ自動化タスクを作成する手順を示します。対象はシステム管理者、DevOps エンジニア、リリース担当者です。
重要用語(1行定義)
- Rexfile:Rex のタスクを定義するファイル。Perl の構文でタスクを記述します。
- svn:externals:Subversion の外部参照機能。別リポジトリをサブフォルダとして結合します。
データベース用タスクの作成
まずデータベースリポジトリへ移動します。
wks01 Service# cd ../database
wks01 database# touch Rexfile
共通モジュールを外部リポジトリとして設定します。
wks01 database# svn propedit svn:externals .
エディタに以下を追加し、保存して閉じます。
lib/Common http://svn01/svn/common
lib/Service http://svn01/svn/service
externals を設定したら、更新とコミットをします。
wks01 database# svn up
wks01 database# svn ci -m "added external repositories"
svn up は外部リポジトリもチェックするため、共通リポジトリに新しいサービスが追加されると次回の svn up で取得できます。
次に Rexfile を作成してデータベースサーバーをセットアップするタスクを定義します。
set user => "root";
set password => "f00b4r";
include qw/
Common::NTP
Service::MySQL
/;
set group => srvdb => "db01";
task "prepare", group => "srvdb", sub {
# run the common ntp task "prepare"
Common::NTP::prepare();
# install mysql
Service::MySQL::prepare();
# configure mysql
Service::MySQL::configure({
key_buffer => "32M",
max_allowed_packet => "32M",
});
# restart mysql
service mysql => "restart";
};
ポイント解説:
- 1〜2 行目でターゲットホスト db01 に対する認証情報を設定しています。公開鍵認証も使えます。詳細は Rex のドキュメントを参照してください。
- include で Common::NTP と Service::MySQL を読み込むと、それらのタスクは Perl 関数としても利用できます。
- set group でサーバーグループ srvdb を定義し、db01 を割り当てます。複数ホストも可能です。
複数ホストの例:
set group => srvdb => "db01", "db02", "db03";
set group => srvdb => "db[01..03]";
12 行目では “prepare” タスクを定義しています。このタスクは srvdb グループの全サーバーで実行されます。タスク内では NTP の初期化、MySQL のインストール、設定、サービス再起動を行っています。
Rexfile をリポジトリにコミットします。
wks01 database# svn add Rexfile
wks01 database# svn ci -m "inital commit of Rexfile"
データベースをセットアップするには次のコマンドを実行します。
wks01 database# rex prepare
実行可能なタスク一覧を表示するには次のコマンドを使います。
wks01 database# rex -T
ウェブサイト用タスクの作成
ウェブプロジェクトのディレクトリへ移動します。
wks01 database# cd ../website
wks01 website# touch Rexfile
ここでも externals を定義します。
wks01 website# svn propedit svn:externals .
エディタに以下を追加し、保存して閉じます。
lib/Common http://svn01/svn/common
lib/Service http://svn01/svn/service
設定後、更新とコミットを行います。
wks01 database# svn up
wks01 database# svn ci -m "added external repositories"
これで共通リポジトリの更新を取得できます。次に Rexfile を作ってウェブサーバーをセットアップします。
# Rexfile
set user => "root";
set password => "test";
include qw/
Common::NTP
Service::Apache
/;
set group => srvweb => "web01";
task "prepare", group => "srvweb", sub {
# run the common ntp task "prepare"
Common::NTP::prepare();
# install apache
Service::Apache::prepare();
# configure apache
Service::Apache::configure({
timeout => 60,
});
# restart apache
service apache2 => "restart";
};
保存してリポジトリへ追加します。
wks01 website# svn add Rexfile
wks01 website# svn ci -m "initial Rexfile"
ウェブサーバーをセットアップします。
wks01 website# rex prepare
アプリケーションデプロイの例
デプロイ用のタスクを追加すると、アプリケーションアーカイブから自動で配置できます。
task "deploy", group => "srvweb", sub {
upload "your-web-application.tar.gz", "/tmp";
extract "/tmp/your-web-application.tar.gz",
owner => "www-data",
group => "www-data",
to => "/var/www";
rm "/tmp/your-web-application.tar.gz";
};
この例は単純なアップロード/展開フローです。実運用ではバージョニング、検証、ロールバックを考慮してください。
受け入れ基準
- Rexfile の prepare タスクが対象サーバーでエラーなく完了すること。
- サービス(mysql / apache2)が起動していること。
- 設定ファイルが期待どおりに反映されていること(key_buffer や timeout 等)。
- デプロイタスク実行後、Web コンテンツが /var/www に正しい権限で配置されアクセス可能であること。
役割別チェックリスト
運用管理者(Admin):
- SVN externals を正しく設定してコミットできること。
- Rex の実行権限(SSH 認証)を確認すること。
- 本番環境への変更を適切に記録すること。
DevOps / リリース担当:
- Rexfile に冪等性(同じコマンドを何度実行しても結果が安定する)を担保する。
- デプロイ前にステージングで rex prepare を実行して確認する。
- ロールバック手順を作成しておく。
開発者:
- 配布アーカイブ(tar.gz)に必要なファイルが含まれていることを確認する。
- 起動検証用の簡易ヘルスチェックを実装する。
トラブルシュート(よくある問題と対処法)
問題: svn up が externals を取得しない
- 対処: svn propget svn:externals . で設定を確認する。URL が正しいか、アクセス権があるかをチェック。
問題: rex 実行で認証エラーが出る
- 対処: user/password を見直す。公開鍵認証を使う場合は ~/.ssh/authorized_keys を確認する。
問題: サービスが再起動しても反映されない
- 対処: 設定ファイルのパスやテンプレートが正しいか確認。Rex の configure タスクの引数を再確認する。
問題: デプロイ後にファイル権限で 403 が出る
- 対処: extract の owner/group を確認し、www-data 等の正しいユーザーで配置されているか検証する。
ミニ・メソドロジー(作業手順の簡易フロー)
- リポジトリで svn:externals を設定してコミット
- Rexfile を作成(認証、include、グループ、タスク定義)
- ステージングで rex prepare を実行して検証
- 本番で rex prepare を実行
- 必要に応じて deploy タスクを実行してアプリ配置
まとめ
- Rexfile と SVN externals を使えば、共通モジュールを再利用してサーバー構築を自動化できます。
- prepare タスクで NTP、MySQL、Apache のセットアップをまとめて実行可能です。
- デプロイタスクを追加することでアプリケーション配置も自動化できます。
重要: 本ガイドのコマンドや設定は例です。運用環境に適用する際はテスト環境で十分に検証してください。