読者です 読者をやめる 読者になる 読者になる

ボクココ

サービス開発を成功させるまでの歩み

アプリエンジニアがインフラに挑戦その4

Rails Ruby MongoDB

どーも。

ホストOS側のChef環境がそろったので、いよいよゲストOS(Virtual Machine) に Rails 環境をインストールしていきます。今回は一つのゲストOS にRailsとMongoDB, Nginx 全て入れていきます。

今回のChef Recipes は Github においてますので適宜参照してください。

まずは Berkshelf で入れたCookbook を環境構築に含めます。 nodes 以下に vagrant.json を作り、ここでchef で実行するレシピを指定します。 また、Berkshelf で入れたレシピのそれぞれのドキュメントはOpsCodeから検索して閲覧できます。

nodes/vagrant.json:

{
  "run_list":[
    "simple_iptables",
    "nginx::source",
    "mongodb::10gen_repo",
    "mongodb"
  ]
}

執筆時にはMongodb は build-essential の部分でうまくいかなかったので、いくつかハックします。またiptables などで一部追加が必要なので自分用レシピをちょっと作成します。

bundle exec knife cookbook create myrecipe -o site-cookbooks

これでsite-cookbooks に myrecipe が追加されました。(myrecipe は曖昧なので目的に応じて変えたほうがいいと思うのですが、今回は手っ取り早い方法で。。)

ここで追加するのを一気に記載します。 site-cookbooks/myrecipe/recipes/ にそれぞれ配置します。

### app_env.rb
# this is required for capistrano
directory "/var" do
  owner "root"
  group "root"
  mode "0777"
  action :create
end

### build-essential.rb
#see http://qiita.com/soundTricker/items/f1dca9573323048f3446
file '/etc/yum.conf' do
  _file = Chef::Util::FileEdit.new(path)
  _file.search_file_replace_line('exclude=kernel', "#exclude=kernel\n")
  content _file.send(:contents).join
  action :create
end.run_action(:create)
simple_iptables_policy "INPUT" do
  policy "DROP"
end

### iptables.rb
# Allow all traffic on the loopback device
simple_iptables_rule "system" do
  rule "--in-interface lo"
  jump "ACCEPT"
end

# Allow any established connections to continue, even
# if they would be in violation of other rules.
simple_iptables_rule "system" do
  rule "-m conntrack --ctstate ESTABLISHED,RELATED"
  jump "ACCEPT"
end

# Allow SSH
simple_iptables_rule "system" do
  rule "--proto tcp --dport 22"
  jump "ACCEPT"
end

# Allow HTTP, HTTPS
simple_iptables_rule "http" do
  rule [ "--proto tcp --dport 80",
         "--proto tcp --dport 443" ]
  jump "ACCEPT"
end

simple_iptables_rule "mongodb" do
  rule "--proto tcp --dport 27017"
  jump "ACCEPT"
end

### rbenv.rb
include_recipe "rbenv::default"
include_recipe "rbenv::ruby_build"

rbenv_ruby "2.1.0-rc1"

rbenv_gem "bundler" do
  ruby_version "2.1.0-rc1"
end

そしてnodes/vagrant.json に追加したレシピを適用します。

{
  "run_list":[
    "myrecipe::build-essential",
    "simple_iptables",
    "myrecipe::iptables",
    "nginx::source",
    "myrecipe::rbenv",
    "mongodb::10gen_repo",
    "mongodb",
    "myrecipe::app_env"
  ]
}

これでbundle exec knife solo cook vagrantで環境が構築されていくはずです。 実際に vagrant ssh ではいると Nginx や Mongodb のプロセスが起動されていて、 rbenv コマンドが入っていることが確認できるはずです。

Chef で問題が起きたときに、それらの原因を調査するためにChef の書き方は知っておくべきです。基本的なことさえわかっていれば十分環境は作れるので、定番の入門Chef-solo を読めば十分だと思います。

補足

nginx.conf は Capistrano で更新する

Rails アプリに関わる nginx.conf のため、Chef 側でnginx.conf は修正しないようにしています。次回のRailsデプロイ時に Rails.root/config にあるnginx.conf にシムリンクを張るようになります。

/var は 777 にする

Capistrano デプロイ時にここに /var/www/ というディレクトリを作り、その上でRails アプリを配置していきます。その際デフォルトの権限だと怒られるので o+w な権限にしておく必要があります。

次は

いよいよラスト、 Rails アプリをこのゲスト OS にCapistranoでデプロイしてRails アプリを動かします!