Vagrant + Chef soloで仮想環境構築

  • Vagrantを使いVirtualBoxで仮想マシンをサクッと建てられる様に
  • Chefを使い、環境構築をサクッとできるように

全体像

VagrantとChefの役割は以下の通り。

  • Vagrant:仮想マシンの構築(OSインストール・初期設定)に使用
  • Chef:構築したマシンの内部の設定(パッケージインストール・設定)に使用

Vagrantでマシンを建てて、それぞれのマシンの内部の設定をChefが行う感じ。

なぜVagrantを使うのか?

Chefスクリプトを作るためにはテスト環境が必要。
ChefではRollbackができないので、毎回マシンを建て直してテストする必要がある。
これは本当に面倒くさそう。。。

そこで、仮想マシンをサクッと建てられるVagrantを使用する。

Vagrantを使用すると、Vagrantfileというファイルを作成し、あとはvagrant upコマンド1発で新しい仮想マシンを構築することができる。
Chefでテストするために使うだけであれば、サードパーティー(Vagrantboxes)が用意している仮想マシンのイメージを使えば、これだけで作業が済む。

Vagrantで仮想マシンを構築

Vagrantboxesの以下のイメージを使って構築する。

vagrant box add base http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130731.box

mkdir /path/to/hello
cd /path/to/hello

vagrant init base
vagrant up

chef-solo, knife-soloの導入

作業マシンからの作業

gem install chef
# もしくはこちら
# curl -L http://www.opscode.com/chef/install.sh | sudo bash
gem install knife-solo

# サーバにChefを導入
knife solo prepare <host>

Chefレポジトリの作成・Cookbookの作成

knife solo init <name>
cd <name>
git init .
git add .
git commit -m 'initial commit'

knife cookbook create hello -o site-cookbooks

さくらのVPSでRails環境構築

さくらのVPS(CentOS 6.4 x86_64)でRailsの開発環境を整えたときの構築メモです。

初期設定

yum

rbenv(システムワイド)でRubyの導入

必要なyumパッケージ

  • gcc-c++ patch readline readline-devel zlib zlib-devel libffi-devel openssl-devel make bzip2 autoconf automake libtool bison gdbm-devel tcl-devel tk-devel libxslt-devel libxml2-devel libyaml-devel

rbenv, ruby-buildの導入

   
export RBENV_ROOT="/usr/local/rbenv"
export PATH="${RBENV_ROOT}/bin:${PATH}"
    
if [ -n $ZSH_VERSION ]; then
  eval "$(rbenv init - zsh)"
elif [ -n $BASH_VERSION]; then
  eval "$(rbenv init -)"
fi

Ruby on Railsのインストール

yumパッケージ

  • sqlite sqlite-devel
  • mysql-server mysql-devel
    • /etc/my.cnf mysqldセクション
      • character-set-server = utf8 追加
    • mysql_secure_installation
    • rootのパスワードはセットしない
  • ImageMagick ImageMagick-devel

インストール

  • gem install rails

MongoDBが起動しない

MongoDBをUbuntuでインストールして、起動したのですがどうも起動しない。。。
/var/log/mongodb/mongodb.logのログを確認してみたら、HDDの容量が足りないという様なエラーメッセージが。
3.5GBほどJournalファイルというファイルを予め生成するようで、このファイル分の容量がないとサービスが起動しません。

とりあえずまだ試験段階で使うので、Journalファイルの生成を無効にしました。
/etc/monodb.confに

nojournal = true

という行を追加して、サービスを再起動すればOKです。

UT-VPNのビルド方法(Ubuntu 12.04)

UT-VPNのビルド方法についてのメモ
Ubuntu12.04で確認しました.(Ubuntu 10.04あたりからも同じだと思います)

追記(10/28):
改訂しました.
https://gist.github.com/3967209#file_ut_vpn_install_guide_for_linux.md

UT-VPNのtar ballを取ってくる.

wget "http://utvpn.tsukuba.ac.jp/files/utvpn/v1.01-7101-public-2010.06.27/Source%20Code%20(Win32%20and%20Unix)/utvpn-src-unix-v101-7101-public-2010.06.27.tar.gz"
tar xzvf utvpn-src-unix-v101-7101-public-2010.06.27.tar.gz
cd utvpn-unix-v101-7101-public/

必要なパッケージをインストール.

sudo apt-get install libssl-dev libiconv-hook-dev libreadline-dev libncurses5-dev
./configure

を実行し,環境にあわせて選択.

ここで
http://wiki.livedoor.jp/taiki_kondo/d/UT-VPN/Debian#content_1_2_6
によると,OpenSSLのバージョン違いでビルドしても実行時にSEGV(Segmentation Fault)してしまうようです.

1.0系に対応させたほうが良いと思うので,

cd src/Mayaqua/openssl/
cp /usr/include/openssl/* ./
cd ../../../
make -j4

makeが終わったら

./output/utvpncmd/utvpncmd

を実行して,3の「VPN Tools」を選び

Check

して,合格がすべて揃えばきちんと動作すると思います.
ダメなときは何かライブラリが足りない可能性があるので,
http://utvpn.tsukuba.ac.jp/files/utvpn/v1.01-7101-public-2010.06.27/UT-VPN_Startup_Guide_for_UNIX.pdf
のマニュアルで確認しましょう.

最後に,システムにインストールするときは,

sudo make install

で完了です.

Rails3でメール受信(postfix + rvm + bundler + rails runner)

空メール登録機能を実装するために,Rails3でメール受信をやってみました.
rvmとbundlerを使ってるので,面倒になるだろうなーと思ってたらやっぱり面倒だった.

大雑把なRailsでのメール受信の流れは以下の通りです.

  1. postfixがメールを受信
  2. postfixがrails appに標準入力でメールの内容を食わせてやる
  3. rails appがmailオブジェクトに変換し,receiveメソッド内で任意の処理を行う
前提条件
  • postfixで普通にメールが受信できる
  • rvmとbundlerを使用してrails appを開発している
  • mailerとreceiveメソッドは実装済み(rails g mailer HogeMailer receive)
  • rails appの位置: /path/to/app
  • mailerのクラス名: HogehogeMailer
  • rvmの位置(トップ): /path/to/rvm
  • rvmのrubyバージョン: ruby-1.9.3-p0
  • rvmのgemset名: bundler
それでは,本題に入ります.

まずはじめに,postfixからrails appに渡す部分を作成します.

パスの読み込みなどが多いので,1つスクリプトを作りました.(作成にあたっては http://d.hatena.ne.jp/kusakari/20110525/1306315643 を参考にさせていただきました.)
これをRailsアプリのscriptディレクトリ下に置きます.
ここではmail_receiveというファイル名にします.
次に,postfixがrails appにメールの内容を転送するように設定します.
/etc/aliasesファイルを編集します.例えば受信するユーザ名がuser1だとしたら,以下の行を追加します.
user1: "| /path/to/app/script/mail_receive"

(Debian系では)新しいエイリアスを有効にするためにsudo newaliasesを実行します.

最後に,多くの場合postfixユーザがrailsを呼び出すため,logファイルへのアクセス権が無いとrailsにメールを渡すことができません.

chmod 666 /path/to/app/log/*.log

として,アクセス権を解放するのが楽かと思います.

これでおそらくRailsでメールが受信できるはずです.
うまくいかないときは,Railsのログとpostfixのログの両方を見たほうがいいです.
大抵はpostfix→railsの部分でうまくいっていないことが多いので,rails側のログは流れません.
あと,権限的な問題を見るときはsudo -u postfixで実行して調べてみるとか.

とりあえずこんな感じでできました.