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があるディレクトリで、以下のコマンドを実行して
レシピの置き場所を作成します。
↑のコマンドを実行すると、
chef-repo以下にいい感じでディレクトリツリーが出来上がります。
3rdパーティーのレシピはchef-repo/cookbooksに置き、
自作レシピはchef-repo/site-cookbooksに置くそうです。
nvmをインストールするためにgitとcurlコマンドが必要なので、
git, curlコマンドをインストールします。
まずは先ほど作成したchef-repoディレクトリに移動して、Cookbookの雛型を作成します。
↑のコマンドを実行すると、
site-cookbooks以下にbaseディレクトリ(Cookbook)が作成されます。
次に、git, curlコマンドをインストールするレシピを書いてみます。
たったこれだけで、
Ubuntu (Debian系)ならapt-getコマンドが呼ばれ、
CentOS (Redhat系)ならyumコマンドが呼ばれてインストールが始まります。
レシピの置き場所を作成します。
$ 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内に作成するとします。
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 件のコメント:
コメントを投稿