Berkshelf + Vagrant で Node.js + MongoDB の仮想環境構築

今更ながら、他のBerkshelfの記事がわかりづらかったので書いていこうと思う。

環境

chef-dkのインストール

Chef Development Kit | Chef Downloads | Chef
から環境にあったものをダウンロード&インストール。

できたら確認する。

$ berks -v
3.2.1

$ knife -v
Chef: 12.0.3

$ chef -v
Chef Development Kit Version: 0.3.5

Berkshelfでcookbookを用意する

まず自分用のchefリポジトリを用意します。

$ berks cookbook chef-repo
$ ls
chef-repo

そしたらまずはリポジトリの中に入ってbundle install

$ cd chef-repo
$ bundle install

リポジトリ生成時に生成されたBerksfileを以下のように編集する。

source "https://supermarket.getchef.com"

metadata

cookbook 'nodejs'
cookbook 'mongodb'
cookbook 'npm'

ここで

$ berks install

を実行すると Berksfile に書かれた cookbook を ~/.berkshelf にインストールします。
これらの cookbook を指定した場所に持ってくるには

$ berks vendor ./recipes
$ ls ./recipes
7-zip           ark             chef_handler    mongodb         python          yum
apt             build-essential cookbook        nodejs          windows         yum-epel

を実行します。
berks vendor PATH で指定した PATH に持ってこれます。

Vagrantfileの設定

最後にVagrantfileの設定をしたいと思います。
今回はこんな感じにしました。

# -*- mode: ruby -*-
# vi: set ft=ruby :

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = '2'

Vagrant.require_version '>= 1.5.0'

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

  config.vm.hostname = 'cookbook-berkshelf'

  # ubuntu 14.04 LST
  config.vm.box = "ubuntu-server-trusty"
  config.vm.box_url = "https://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box"

  # DHCP使用のゲストの port 3000とホストの port 3000 をマッピング
  config.vm.network :forwarded_port, guest: 3000, host: 3000
  config.vm.network :private_network, type: 'dhcp'

  # 共有フォルダの設定
  config.vm.synced_folder "./develop", "/vagrant"
  
  # provider 設定
  config.vm.provider :virtualbox do |vb|
    vb.customize ["modifyvm", :id, "--memory", "512"]
  end

  # berkshelfのプラグインを使わない。これ重要
  config.berkshelf.enabled = false

  config.vm.provision :chef_solo do |chef|
    chef.cookbooks_path = "./chef-repo/recipes"
    chef.run_list = [
      "recipe[nodejs]",
      "recipe[mongodb]"
    ]
    #vagrant-omnibusで使うchefの設定。Vagrantfileの最後のendのすぐ上に追記しておく。
    config.omnibus.chef_version = :latest
  end
end

Vagrant の Berkshelt のプラグインはいまいち調子が悪いのでここでは使わないようにします。
編集が終わったら起動しましょう。

$ vagrant up

無事エラーなく起動したら

$ vagrant ssh
vagrant@cookbook-berkshelf:~$
vagrant@cookbook-berkshelf:~$ node -v
v0.10.34
vagrant@cookbook-berkshelf:~$ npm -v
1.4.28
vagrant@cookbook-berkshelf:~$ mongo
MongoDB shell version: 2.4.9
connecting to: tes

以上です〜♪