2013年7月14日日曜日

VagrantとChef SoloでNode.jsの開発環境を作る

Nodeの開発環境ってどうやって準備してますか?
nvmいれてnodeを入れてnpmでパッケージインストールするだけ!
といえばそうなんですけど・・・例えば、別のマシンで環境を作りなおすとなると
少しめんどうですよね。

例えば、VirtualBoxをインストールして、Vagrantをインストールして、
コマンド一発で環境を作り直せるとしたら便利ですよね・・・

node入れるだけならそれほど便利さは実感できないと思いますが、
例えば、そこにApacheやらNginxをいれて、Rails入れたりとかしなきゃいかんとなると、
ゾッとしますね。
それにコマンド一発だとインストール漏れもないという利点も・・・

ということで、VirtualBox + Vagrant + Chef Soloで
Mac上に作ったVirtual Machineにnodeをインストールして、
さらにgruntをインストールするというレシピを作ってみます。

ChefやレシピやChef Soloについては↓でとてもわかりやすく説明されております。

* 明日から始めるChef入門
  http://www.slideshare.net/TakeshiKomiya/chef-20014957
* Chef Soloの正しい始め方
  http://tsuchikazu.net/chef_solo_start/


レシピを作る

Vagrantfileがあるディレクトリで、以下のコマンドを実行して
レシピの置き場所を作成します。
  $ knife solo init chef-repo

↑のコマンドを実行すると、
chef-repo以下にいい感じでディレクトリツリーが出来上がります。

3rdパーティーのレシピはchef-repo/cookbooksに置き、
自作レシピはchef-repo/site-cookbooksに置くそうです。


git, curlコマンドをインストールするレシピを作ってみる


nvmをインストールするためにgitとcurlコマンドが必要なので、
git, curlコマンドをインストールします。
まずは先ほど作成したchef-repoディレクトリに移動して、Cookbookの雛型を作成します。
 $ knife cookbook create base -o site-cookbooks/

↑のコマンドを実行すると、
site-cookbooks以下にbaseディレクトリ(Cookbook)が作成されます。

次に、git, curlコマンドをインストールするレシピを書いてみます。
  $ cd site-cookbooks/base/
  $ vi recipes/default.rb
    package "git"
    package "curl"

たったこれだけで、
Ubuntu (Debian系)ならapt-getコマンドが呼ばれ、
CentOS (Redhat系)ならyumコマンドが呼ばれてインストールが始まります。

nvmをインストールするレシピを作ってみる


まずは先ほどと同じく、nvmレシピの雛型を作成します。
  $ knife cookbook create nvm -o site-cookbooks/

ではではnvm & Node.js v0.10.1をインストールするレシピを書いてみます。

  $ cd site-cookbooks/nvm/
  $ vi recipes/default.rb
    git "/usr/local/nvm" do                                            # githubからnvmを/usr/local/nvmへインストール
      repository "git://github.com/creationix/nvm.git"
      notifies :run, "bash[nvm.sh]"                                 # インストールが終わったらnvm.shという名前のbashを実行
    end

    bash "nvm.sh" do                                                     # nvm.shという名前のbash。
      code <<-EOH
        . /usr/local/nvm/nvm.sh                                      # nvmコマンドの読み込み
        nvm install v0.10.1                                               # Node.js v0.10.1をインストール
      EOH
      action :nothing                                                        # git cloneが終わるまで実行したくないのでnothingを指定。
    end

    template "/etc/profile.d/nvm.sh" do                        # nvm.sh.erb (後述)を/etc/profile.d/nvm.shにコピー
      source "nvm.sh.erb"
      mode 00644
    end

最後のブロック(template)なのですが、これはなんというか・・・
基本的には、(chef-repo/site-cookbooks/nvm/)template/default/nvm.sh.erbを
指定した場所にコピーするのですが、
単にコピーするだけではなく、
nvm.sh.erb内でRubyの変数が使われている場合、
変数に適切な値を代入しつつコピーしてくれるといったものです。

ちなみに、nvm.sh.erbの中身はこんな感じです。(特にrubyの変数は使ってないです)
  $ cat template/default/nvm.sh.erb
    #!/bin/sh
    . /usr/local/nvm/nvm.sh
    nvm use v0.10.1


Gruntをインストールするレシピを作ってみる


では最後に、Gruntをインストールするレシピを作成します。
Gruntのレシピはnvm Cookbook内に作成するとします。
  $ vi recipes/grunt.rb
    bash "grunt" do
      code <<-EOH
        . /usr/local/nvm/nvm.sh
        nvm use v0.10.1
        npm install -g grunt-cli
      EOH
      action :nothing                                                                    # nvm.shの実行終了したら走らせるためnothingを指定
      subscribes :run, "bash[nvm.sh]", :delayed                          # nvm.shの実行を監視してます。
    end

VagrantとChef Soloを連携させる

VagrantfileにChef Soloとの連携部分を追記する。

  $ vi Vagrantfile
    ・・・中略 ・・・
    config.vm.provision :chef_solo do |chef|
      chef.cookbooks_path = "chef-repo/site-cookbooks"
      chef.add_recipe "base"
      chef.add_recipe "nvm"
      chef.add_recipe "nvm::grunt"
    end

VMにレシピを適用する!

  $ vagrant halt && vagrant up

でvagrant upするときにChefのレシピも実行されますが、
以下のコマンドを実行するとChefの部分のみ実行することができます。

  $ vagrant provision

0 件のコメント:

コメントを投稿