VagrantのプロビジョニングをChef-Soloで実行する方法(Berkshelf + knife-solo使用)

スポンサーリンク

Vagrantのプロビジョニングを Chef-Solo で実行する方法です。結構情報が散らばってて分かりにくかったので自分なりにまとめました。

Berkshelfとknife-soloについて

 Berkshelf は Chef の cookbook 管理ツールで、Gem 管理ツールの Bundler のようなものです。サードパーティ製の Cookbook を Bundler と同じように扱う事ができて、任意のGitHubからダウンロード出来たり、バージョン指定したりすることが出来るようになります。

 knife-solo は Chef リポジトリを操作するためのツールで Cookbook の作成やダウンロード、実行までを行えます。

 Chef Supermarket は Chef のコミュニティで、サードパーティ製の Cookbook が公開されています。

Berkshelfとknife-soloのGemインストール

Gem は Bundler でインストールします。Bundler が無い場合はgem install bundlerで先にインストールしてください。ridley のインストールで多少時間がかかります。

$ bundle init
$ vi Gemfile
source "https://rubygems.org"

gem "berkshelf"
gem "knife-solo"

$ bundle install --path vendor/bundle

リポジトリ作成

knife-soloのコマンドでリポジトリの雛形を作成します。Bundler を使用してますので、knife solo init .のように、カレントディレクトリを指定することが重要です。Berkshelf でも同じような初期設定のberks initというコマンドがありますが、こちらは使用しません。

$ bundle exec knife solo init .
WARNING: No knife configuration file found
Creating kitchen...
Creating knife.rb in kitchen...
Creating cupboards...
Setting up Berkshelf...

リポジトリを作成すると以下のようなディレクトリ構成になります。cookbooks ディレクトリにはサードパーティ製の cookbook を置き、site-cookbooks ディレクトリには自分が作成した cookbooks を置くようにします。作成された .gitignore で cookbooks ディレクトリを管理対象外にしているように、Gem の Bundler と同じ使い方がいいと思います。その他の data_bags、environments、nodes、roles についてはこの記事では触れません。

$ tree -a -L 2
.
├── .bundle
│   └── config
├── .chef
│   └── knife.rb
├── .gitignore
├── Berksfile
├── Gemfile
├── Gemfile.lock
├── cookbooks
│   └── .gitkeep
├── data_bags
│   └── .gitkeep
├── environments
│   └── .gitkeep
├── nodes
│   └── .gitkeep
├── roles
│   └── .gitkeep
├── site-cookbooks
│   └── .gitkeep
└── vendor
    └── bundle

10 directories, 12 files

サードパーティ製のCookbookをインストール

サードパーティ製の Cookbook をインストールするのは Berkshelf を使用します。knife コマンドでもダウンロードすることが出来ますが、設定が面倒なので Berkshelf の方が使いやすいです。

Cookbook は  Chef Supermarket に様々なサードパーティ製の Cookbook が公開されています。

今回は apache2 をインストールしたいと思います。Berksfile を開くとsite :opscodeと書かれていると思いますが、この書き方はバージョン2.xまでなので、source "https://api.berkshelf.com"に変更します。ちなみにsource "https://supermarket.chef.io"でも可能です。

$ vi Berksfile
source "https://api.berkshelf.com"

cookbook "apache2"

 2.x to 3.0 Upgrade Guide · berkshelf/berkshelf Wiki · GitHub

それでは Cookbook をインストールします。berks vendorコマンドで、インストール先を cookbooks に指定してしてください。

$ bundle exec berks vendor cookbooks/
Resolving cookbook dependencies...
Fetching cookbook index from https://supermarket.chef.io...
Using apache2 (3.1.0)
Vendoring apache2 (3.1.0) to cookbooks/apache2

apache2 のcookbooks がインストールされました。こちらはもう変更しません。

$ tree cookbooks/ -a -L 2
cookbooks/
└── apache2
    ├── CHANGELOG.md
    ├── README.md
    ├── attributes
    ├── definitions
    ├── files
    ├── metadata.json
    ├── recipes
    └── templates

6 directories, 3 files

サードパーティ製の Cookbook を変更した使いたい場合は、Fork したリポジトリを修正して Berksfile には以下のように記述します。

cookbook "apache2",  git: "git://github.com/tasukujp/apache2.git"

自作の Cookbook を作成する

knife cookbook createコマンドで Cookbook の雛形が作成できます。hello-chef という名前で作成しました。

$ bundle exec knife cookbook create hello-chef -o site-cookbooks/
** Creating cookbook hello-chef in /Users/tasukujp/Documents/dev/chef_solo/site-cookbooks
** Creating README for cookbook: hello-chef
** Creating CHANGELOG for cookbook: hello-chef
** Creating metadata for cookbook: hello-chef

ディレクトリ構成は以下のような形式です。

$ tree site-cookbooks/ -a -L 2
site-cookbooks/
├── .gitkeep
└── hello-chef
    ├── CHANGELOG.md
    ├── README.md
    ├── attributes
    ├── definitions
    ├── files
    ├── libraries
    ├── metadata.rb
    ├── providers
    ├── recipes
    ├── resources
    └── templates

9 directories, 4 files

recipes にある default.rb を修正します。こちらでは Git をインストールしましょう。

$ vi site-cookbooks/hello-chef/recipes/default.rb
package "git" do
  action :install
end

仮想マシンを起動してChef-Soloを実行する

準備が整いましたのでまずはvagrant init <Box>で Vagrantfile を作成します。Vagrantでの仮想マシン作成方法については  Vagrantで仮想マシンを作成 を参照してください。Boxは何でもよければvagrant init chef/centos-6.5が簡単です。

Vagrantfile のプロビジョニングは以下のように記述します。

$ vi Vagrantfile
...
config.vm.provision "chef_solo" do |chef|
  chef.cookbooks_path = ["./cookbooks", "./site-cookbooks"]
  chef.add_recipe "apache2"
  chef.add_recipe "hello-chef"
end

それでは仮想マシンを起動しましょう。レシピをコピーして Chef も自動でインストールされてますね。

$ vagrant up
...
==> default: Mounting shared folders...
    default: /vagrant => /Users/tasukujp/Documents/dev/chef_solo
    default: /tmp/vagrant-chef/9d88a6e1f79fa9dcc4b09db9727d0a5b/cookbooks => /Users/tasukujp/Documents/dev/chef_solo/cookbooks
    default: /tmp/vagrant-chef/6508c7693190cb705092a60073f826ff/cookbooks => /Users/tasukujp/Documents/dev/chef_solo/site-cookbooks
==> default: Running provisioner: chef_solo...
    default: Installing Chef (latest)...
Generating chef JSON and uploading...
==> default: Running chef-solo...
...

無事 Apache と Git がインストールされました。

$ vagrant ssh
$ httpd -v
Server version: Apache/2.2.15 (Unix)
Server built:   Oct 16 2014 14:48:21
$ git --version
git version 1.7.1

以上で完了です。Vagrant で Chef-Solo を使用する場合は、個人的にはこの方法が現時点でベストです。Chef はまだまだ勉強中ですが、Recipe の書き方や、Knife、BerkShelf についての詳細もまた別記事でまとめたいと思います。

ちなみに、これ系の記事でよく書かれている Vagrant プラグインのvagrant-omnibusvagrant-berkshelfは必要ないので使用していません。

関連記事

 MacでのVagrantの使い方とコマンドについて(VirtualBoxに仮想マシンを作成) - TASK NOTES

 Vagrantプラグインの使い方(vbguest, hostmanager, sahara, snapshot) - TASK NOTES

 VagrantのBoxを新しく作成する方法(VirtualBox / CentOS 6.6 x86_64) - TASK NOTES

 Packerを使用してVirtualBoxの仮想マシンからVagrantのBoxを作成する - TASK NOTES