リア充爆発日記

You don't even know what ria-ju really is.

vagrant + berkshelf + chefで環境をつくってみたら鼻血が出た

vagrantのチュートリアルをやったログvagrantの便利さとおよその使い方は理解できた。

もともとChefのレシピを作る環境を用意しよう、というのが主題だったので今回はVagrantを活かしてChefのレシピを書いてみようとしたところ、最近じゃBerkshelfというツールがあってこれも活かすとイカスことになるってもっぱらの噂だったので試してみたメモ。

入門Chef Solo - Infrastructure as Code

入門Chef Solo - Infrastructure as Code

Berkshelfはcookbookを管理してくれるツール。bundler->gemのようにberkshelf->cookbookというイメージ。
具体的にどういうメリットがあるかというと、別プロジェクトのレシピを交えたrun_listが組める、ということ。つまり、chefリポジトリとプロジェクトの結合が解消でき、たとえば、これまでプロジェクトごとにchef-repoを構えていたケースなどでありがちだった、複数プロジェクトに渡って共通利用するcookbookの重複管理が解消できたり、そもそも自分でレシピを書かずにhttps://github.com/aws/opsworks-cookbooksのように公開されているものを組み合わせて利用できるなどのメリットがある。

今回の試みとして、rbenvをインストールしてRuby2.0をインストールしてglobalに設定する、というのをやってみる。

berkshelfのインストール

インストールはgemで一発。

$ gem install berkshelf

cookbook作成

メインのcookbookを作る。

$ berks cookbook test

するとここにCookbookセット+Vagrantfile + Berksfileが生成される。このCookbookがプロジェクト固有のレシピとなり、これ以外のCookbookは別で管理されているものを使うのが流儀。・・・なんだと思う。

外部のcookbookをインストールする

とりあえず、rbenvのCookbookを調達する。外部のCookbookの調達はBerksfileにちょろっと書くだけでイケる。

Berksfile

site :opscode

metadata
cookbook 'rbenv', ">= 1.4.1" , git: 'git://github.com/RiotGames/rbenv-cookbook.git'

こんな感じに定義する。

インストール

$ berks install

これでデフォルトだと~/.berkshelf/cookbooks/に指定したcookbookとその依存関係のあるcookbookがダウンロードされ、test cookbook内のレシピからincludeすることができる。

メインのレシピを書く

なんの変哲もないレシピ。こんな感じ。

test/recipes/default.rb

include_recipe 'rbenv::default'
include_recipe 'rbenv::ruby_build'

rbenv_ruby "2.0.0-p195" do
  ruby_version "2.0.0-p195"
  global true
end

Vagrantの設定

さっき書いたレシピをVM起動時に呼び出すよう設定する。
Vagrantfile

  ~snip~
  config.berkshelf.enabled = true
  ~snip~
  config.vm.provision :chef_solo do |chef|
    chef.run_list = [
        "recipe[test]"
    ]
  end

config.berkshelf.enabled = true

はberks cookbook testしたときに作られたVagrantfileに勝手に記載されている。
あと、自動で作られたVagrantfileはネットワーク設定がprivate_networkになってたりするので、その辺を適宜都合のよいように修正しておく。

berkshelfプラグインのインストール

このままvagrant upするとberkshelfなんて設定項目ねーよ、と言われるのでvagrantと連携できるようvagrantのberkshelfプラグインをインストールする。

$ vagrant plugin install vagrant-berkshelf

vagrant up

あとはvagrant upするだけ。もし、すでにupしてある場合で、再度レシピを実行したい場合は

$ vagrant provision

というコマンドがある。

rubyのインストールは時間がかかるけどあとは待つだけのはず・・・

確認

$ vagrant ssh

[vagrant@test-berkshelf ~]$ ruby -v
ruby 2.0.0p195 (2013-05-14 revision 40734) [x86_64-linux]

うわー、できてる、なにこれキモい。

鼻血たれるわー。

Vagrant: Up and Running

Vagrant: Up and Running