Posted at

Vagrant + chef-solo + berkshelfで分析環境を構築する

More than 5 years have passed since last update.

ぶっ壊れてもいい環境が欲しかったのでやってみた。


手順

初期構築の場合

1. chefのリポジトリを作る(knife solo init)

2. recipeを作る(knife cookbook create)

3. 公開recipeを登録する(berks install && berks vendor)

4. Vagrantの初期設定を行う(vagrant init)

5. Vagrantを起動する(vagrant up)


環境構築

# berkshelfのインストール

gem install berkshelf
# knife-soloのインストール
gem install knife-solo
# vagrant pluginのインストール(vagrant-omnibusとsahara)
vagrant plugin install vagrant-omnibus sahara

saharaは無くても問題ないが、VMのスナップショットを作れるのであったほうが便利。


chefのリポジトリを作成する

mkdir vagrant_work

cd vagrant_work


recipeを作る

knife cookbook create [レシピ名]

レシピは以下を設定すればだいたいおk。

- recipe/default.rb

- attributes/defaut.rb


公開recipeを登録する

まずはBerksfileを編集する

vim chef-repo/Berksfile

Berksfileには、recipeを探索先としてopscodeを記述。

cookbook 'レシピ名'と書くと、opscodeが公開しているレシピを引用することになるみたい。

path指定だと、ローカルにあるrecipeを登録できる。

opscode以外のgitも登録できるみたいで、cookbook 'レシピ名', git: 'git://リポジトリパス'と書けばいけるみたい(未確認)


Berksfile

site :opscode

cookbook 'yum-epel'
cookbook 'build-essential'

cookbook "python", path: "site-cookbooks/python"


berks installを実行すると、Berkshelf.lockに依存関係も含めてrecipeが登録される。

また、Berksfileで指定したrecipeは~/.berkshelf/cookbooks/に配置される。

他の記事を見るとberks install --path PATHになっているが、berks install --pathberks vendorに変わったようなのでこちらを使う。berks vendor--berksfile=PATHでパスも指定できる。パスを指定しない場合は、カレントのberks-cookbooksが作成されて出力される。なお、出力先は環境変数BERKSHELF_PATHでも変更できるらしい(未確認)。

berks install

berks vendor


Vagrantの初期設定を行う

まずはVagrantの初期設定を行う

cd ~/vagrant_work

vagrant init

vagrant initを実行すると、Vagrantfileが作成される。

VMを作成する時は、Vagrantfileの内容に添って実行されるので、これを編集する必要がある。

VM作成時に実行するrecipeもここで指定するので要注意。

vim Vagrantfile

いろいろ弄るんだが、以下のポイントをおさえればいい。


  • box名(config.vm.box)

  • vmの元となるboxのURL(config.vm.box_url)

  • vmのnetwork(config.vm.network)

  • vmの名前、CPU数、メモリ(config.vm.provider)

  • chefで実行するrecipe(config.vm.provision)

意外とVMのCPU数とメモリが重要で、デフォルトだとCPU数=1、メモリ400MBなのでscipyがインストール中にタイムアウトとかしたりする。多めの方がいい。


Vagrantfile

# -*- mode: ruby -*-

# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.box = "CentOS6.4_minimal"
config.vm.box_url = "http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20131103.box"

config.vm.network "private_network", ip: "192.168.33.10"

config.vm.provider "virtualbox" do |vb|
vb.name = "stats_vm"

vb.cpus = 2
vb.memory = 4096
end

config.vm.provision :chef_solo do |chef|
chef.run_list = [
"base",
"python"
]
end
end



Vagrantを起動する

vagrant upでVMの作成が始まる

cd ~/vagrant_work

vagrant up

VMが無事できたら、vagrant sshでVMにログインできる。抜ける時はexit

vagrant ssh

exit


saharaの使い方

vagrantのpluginでsaharaをインストールしておくと、簡単にスナップショットを取れるので結構便利。

スナップショットを取る時は、vagrant haltでVMをシャットダウンしている方が早く終わるみたい。

# スナップショットを作成する

vagrant sandbox on

# 現在の状態でスナップショットを更新する
vagrant sandbox commit

# 直前のスナップショットに戻す
vagrant sandbox rollback