CapistranoでApacheの設定ファイル管理タスクを作る

(この記事は Ruby Advent Calendar jp: 2010 : ATND の9日目です。前日は niku さんでした。)

はじめに

Apacheの設定ファイルを各web/apサーバに反映させるCapistranoタスクを作成しましたので展開。
作成した経緯はApacheの設定を頻繁に更新する必要がある案件で手軽に反映できる方法が欲しかったため。
何十台ものサーバ設定をこなす場合にはPuppetなりChefなりを使用するべきと思うけど、1〜2台程度で構成されるシステムの場合には大げさなんで。

前提

ミドルウェア

以下の前提でタスクを組んでます。

  • OS:CentOS5
  • SCM:Subversion
  • Web:Apache2.2 (/etc/httpd/conf.d/*.confのファイルを自動読み込みする ※デフォルト設定)

なお、Capistranoについての説明、設定は割愛します。ググってください。

フォルダ構成

Capistrano実行フォルダは以下の構成とします。※Subversion上に全てのファイルを置いてある。

/home/hoge/sample (Railsホーム兼Capistrano実行フォルダ。Subversionからチェックアウトしている)
  |_/app
  |_/config
    |_deploy.rb (Capistrano設定ファイル)
    |_/httpdconf
      |_/conf.d (Apache設定ファイル差分置き場)
        |_ip_filter.conf (例:IPアドレスによるアクセス制限指定ファイル)
    ...

手順

以下をdeploy.rbに追加。

set :home_path, "/home/hoge/sample"
namespace :httpd do

  # svn更新
  before "httpd:update_conf" do
    `cd #{home_path}; svn up;`
  end

  # 設定ファイル差分上書き
  task :update_conf, :roles => :web do
    src_conf_path = "#{home_path}/config/httpdconf/conf.d/"
    dst_conf_path = "/etc/httpd/conf.d/"
    require "find"
    Find.find(src_conf_path) {|path|
      next if /\.svn/ =~ path
      next if /^#{src_conf_path}$/ =~ path
      upload(path, dst_conf_path, :via => :scp)
    }
  end
  
  # Apache再起動 (configtestに失敗したら再起動しない)
  after "httpd:update_conf", :roles => [:web] do
    run "/etc/rc.d/init.d/httpd configtest"
    sudo "/etc/rc.d/init.d/httpd graceful"
  end
end

※処理の流れ

  1. ローカルサーバにおいてSubversion更新実行
  2. Capistranoの「web」ロールで指定したサーバの「/etc/httpd/conf.d/」に、ローカルサーバの設定ファイルを配布
  3. 各サーバのApache再起動

タスク実行

これで以下「httpd:update_conf」コマンドを実行すると各サーバにApache設定が反映される。

$ cd /home/hoge/sample   # フォルダ移動
$ cap httpd:update_conf

おわりに

軽い気持ちで作ったタスクだけど、以下のようなケースで重宝。

  • リリース直前は頻繁にリダイレクトやアクセス制限の設定を変更することが多い
  • リリース後もIPアドレス制限などを手軽に書き換えることが可能

Capistranoは思った以上にいろいろなことを実現できるので、参考にしていただけると幸いです。