MacOS上にVagrant+chef(knife)+Berkshelfで開発環境を作る手順
Vagrant+chef(knife)が流行っていたのは知っていたのですが、
個人的に開発作業がなかったのでスルーしてました。
遅ればせながら試してみたので、手順を書き残しておきます。
ちなみに、Vagrantとは、ざっくり言うと、
VirtualBoxをコントロールして便利に開発用の環境を構築するためのツールです。
# バージョン1.1以降はVirtualBox以外(VMwareとか)も使えるようになっています。
以前はChef Soloのみを使って構築していたのですが、
気づけば、世の中便利になっていたので、今回はKnife SoloとBerkshelfも使ってみました。
それぞれのツールの役割を理解しやすいように、以下の図に整理しました。
Berkshelf:
公開されているCookbookの取得
Knife Solo:
①各ノードへのChef Soloセットアップ
②各ノードへのCookbookの転送
③Chef Soloの起動
Chef Solo:
レシピの実行(セットアップ実行)
<a href="http://www.flickr.com/photos/62769571@N03/9714120829" title="View 'vagrantchef_2' on Flickr.com"><img height="375" title="vagrantchef_2" alt="vagrantchef_2" border="0" src="http://farm8.staticflickr.com/7405/9714120829_a81f255569.jpg" width="500"/></a>
Berkshelf:本番環境と同じ
Vagrant:
①各ノードの起動
②各ノードへのChef Soloセットアップ
③各ノードへのCookbookの転送
④Chef Soloの起動
VirtualBox:
開発用仮想環境
Chef Solo:本番環境と同じ
環境構築は次の流れで行います。
- VirualBoxのインストール
- Vagrantとプラグインのインストール
- Knife Soloのインストール
- 仮想マシンの起動
※構築環境はMacOS10.8.4、rubyはセットアップ済みの前提です。
VirtualBoxのインストール
以下のサイトからVirtualBoxをダウンロードします。
VirtualBox
https://www.virtualbox.org
→Downloads → VirtualBox 4.2.16 for OS X hosts
ファイル名:VirtualBox-4.2.16-86992-OSX.dmg
ダウンロードしたファイルを開き「VirtualBox.pkg」をダブルクリック、
インストーラの指示に従ってインストールを実行します。
Vagrantとプラグインのインストール
以下のサイトからVagrantをダウンロードします。
Vagrant
http://www.vagrantup.com
→Download → v1.2.7
ファイル名:Vagrant-1.2.7.dmg
ダウンロードしたファイルを開き「Vagrant.pkg」をダブルクリック、
インストーラの指示に従ってインストールを実行します。
以下のコマンドで、バージョン確認できればセットアップは成功です。
$ vagrant -v
Vagrant version 1.2.7
Knife Soloのインストール
以下のコマンドで、Knife Soloの作業用ディレクトリを作成します。
$ mkdir ~/chef-repo
作業用ディレクトリに以下ファイルを作成します。
Gemfile
source 'https://rubygems.org'
gem 'chef'
gem 'knife-solo'
gem 'berkshelf'
Berksfile
site :opscode
cookbook 'nginx'
以下のコマンドで、KnifeSoloとBerkshelfをインストールします。
$ bundle install --path=vendor/bundle
以下のコマンドで、knifeのディレクトリ構成を作成します。
$ bundle exec knife solo init .
ここまでで、以下のような構成になります。
- Berksfile
- Gemfile
- Gemfile.lock
- cookbooks
- data_bags
- nodes
- roles
- site-cookbooks
- vendor
ひとまず、このディレクトリ構成をgitにcommitしておきます。
# .gitignoreに「/vendor/」を追加しておいた方がよいです。
$ git init
$ git add .
$ git commit -a -m "initial commit"
以下のコマンドで、opscodeのリポジトリからnginxと依存するcookbookを取得します。
$ bundle exec berks --path=cookbooks
Vagrantで仮想マシンを起動
以下のコマンドで、VagrantのbaseとなるBoxを取得します。
ここではCentOS6.4 64bitをベースとして使用しています。
# 利用可能なBoxのリストが、以下のサイトに掲載されています。
# Vagrantbox.es
# http://www.vagrantbox.es
$ vagrant box add CentOS64_x64 http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130427.box
以下のコマンドで、Vagrantfileを作成します。
$ vagrant init CentOS64_x64
Vagrantfileに、次の内容(config.vm.provision以下)を追記します。
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.box = "base"
config.vm.provision :chef_solo do |chef|
chef.add_recipe "nginx"
end
end
以下のコマンドで、仮想マシンの起動及びChefレシピの適用を行います。
# 仮想マシンの起動やChefレシピ適用のログが出力されます。
$ vagrant up
以下のコマンドで、仮想マシンにsshで接続します。
$ vagrant ssh
仮想マシンで以下のコマンドを実行するとnginxがセットアップされている事が確認できます。
[vagrant@localhost ~]$ ps -ef | grep nginx
開発環境が不要になったら以下のコマンドで、仮想マシンを停止・削除します。
$ vagrant destroy
以上のような手順で、
(本番環境をchefのrecipeで構築しているのであればですが、)
本番同様の開発環境を、簡単に構築することができます。
開発メンバの出入りが多いとか、
単体・機能テストフェーズにたくさん環境が必要な時とか、特に便利かなと感じました。