どーも。
ホスト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 アプリを動かします!