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-omnibus
とvagrant-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