
はじめに
本ブログでは、仮想インフラの自動化ツールとしてPacker/Vagrant/Veeweeを紹介していますが、これらの紹介記事「Veeweeを使ってVagrant用仮想マシンイメージを作成する」および、「開発者必見!仮想環境の構築を自動化する方法とは」では、仮想マシンの新規作成にフォーカスした解説を行っています。ここでは、Vagrantを使った仮想マシンのプロビジョニング方法について解説します。
Chef Soloとは
Chef(シェフ)は、米国のOPSCODE社が開発するサーバー構成管理ソフトウエアです。Chefは、サーバーの構成情報を管理するChefサーバーと複数台のChefクライアントで構成されており、Chefサーバーから、Chefクライアントであるサーバーの構成を変更することができます。Facebookでは、管理するサーバーを複数台のChefサーバーで管理していると言われており、エンタープライズからスモールビジネスまで、管理するクライアント(サーバー)数に応じて適切なChefサーバーを利用することができます。Chef Solo(シェフソロ)は、Chefクライアントのサブセット機能として提供されており、Chefサーバーの機能を持つChefクライアントと言えます。ただし、Chef Soloは自分自身の構成管理のみが行えるため、従来のChefサーバーが持つリモートクライアントの構成管理を行うことはできません。そのため、Vagrantなどの仮想インフラ自動化ツールでは、Chef Soloを予めインストールした仮想マシンイメージを作成することが必要となります。
Chef Soloがプロビジョニングのために利用する主なデータは、下記のとおりです。
| データ | 概要 |
|---|---|
| cookbook | recipes(レシピ)やtemplates(テンプレート)をひとまとめにしたフォルダです。Chefがプロビジョニングのために使用する全てのデータが含まれています。 |
| recipes | Chefが行うべきプロビジョニング方法を定義するデータです。 |
| templates | プロビジョニング際にインストールするプログラムの設定ファイルを生成するためのテンプレートを定義するデータです。 |
Chef Soloのインストール
Chef Soloをインストールするに当たって、下記のソフトウエアをインストールします。
以前のエントリ「Veeweeを使ってVagrant用仮想マシンイメージを作成する」の中でインストールしたソフトウエアには、*(アスタリスク)を付けています。
| 種別 | ソフトウエア |
|---|---|
| ホストOS | Windows 7 Ultimate |
| UNIX環境 | Cygwin 1.7.25 |
| *仮想化ソフトウエア | VirtualBox 4.2.18 r88780 |
| *自動化ソフトウエア | Vagrant 1.2.7 |
| *Ruby | ruby 1.9.3p448 (2013-06-27) [i386-mingw32] |
| *Git(ギット) | git version 1.8.4.msysgit.0 |
| *OpenSSH | OpenSSH_4.6p1, OpenSSL 0.9.8e 23 Feb 2007 |
| Chef Solo | Chef: 11.8.0 |
| Berkshelf | Berkshelf (2.0.10) |
| vagrant-berkshelf | vagrant-berkshelf (1.3.4) |
| vagrant-omnibus | vagrant-omnibus (1.1.2) |
下記の手順で、Chef Soloをインストールします。なお、インストールでは、Git Bashを利用しますので、インストールしていない場合、記事を参考にインストールしておいて下さい。
①chefのインストール
Git Bashを起動し、以下のコマンドを実行してインストールします。
$ gem i chef --no-ri --no-rdoc


インストールが終了したら、chef-soloコマンドおよび、knifeコマンドが実行できるか確認します。
$ chef-solo -v $ knife -v

②Berkshelfのインストール
Berkshelfは、サードパーティが公開しているcookbookを簡単にインストールできるため、Berkshelfも合わせてインストールします。

Git Bashを起動し、以下のコマンドを実行してインストールします。
gem i berkshelf --no-ri --no-rdoc
インストールが終了したら、berksコマンドが実行できるか確認します。
$ berks -v

③vagrant-berkshelfプラグインのインストール
vagrant-berkshelfプラグインは、VagrantからBoxのプロビジョニングを行うために必要なプラグインです。
vagrant provisionコマンドを実行するだけで、vagrantで起動したBoxのプロビジョニングを実行することができます。
Git Bashを起動し、以下のコマンドを実行してインストールします。
$ vagrant plugin install vagrant-berkshelf

④vagrant-omnibusプラグインのインストール
vagrant-omnibusは、Chef SoloがインストールされていないBoxに対して自動的にChef Soloをインストールするためのプラグインです。
Git Bashを起動し、以下のコマンドを実行してインストールします。
$ vagrant plugin install vagrant-omnibus

⑤knifeの初期設定
knifeは、Chef Soloの実行時に起動されるプログラムです。Chefは、自分自身が管理するrecipesやtemplatesのデータをknifeコマンドに渡し、実際の処理は全てknifeコマンドで実行していますので、knifeの初期化は必ず行う必要があります。
Git Bashを起動し、以下のコマンドを実行して初期化します。
初めて実行すると、knife構成ファイルの場所やChefサーバのURLを聞いて来ますが、全てデフォルトで指定します。
デフォルトでは、$HOME/.chefフォルダにknife.rbが生成されます。
$ knife configure

⑥OPSCODE Communityのユーザー登録
Berkshelfを使って、公開されているcookbookを利用するためには、OPSCODE Communityへのユーザー登録が必要です。なお、cookbookを自分で作成し、公開されているcookbookを利用しない場合、ユーザー登録は必要ありません。
以下の手順で登録します。
- Community SignUpに移動し、必要な情報を入力します。

- “Welcome to the Opscode Community”が表示され、cookbookのダウンロードに必要なRSA秘密鍵がPEM(Privacy Enhanced Mail)形式で表示されますので、画面のメッセージに従ってusername.pemとして保存します。

usernameは、登録時に指定したUsernameに読み替えて下さい。保存するフォルダは、手順③のknife初期化の際に生成されるknife構成ファイルの保存場所と同じです。デフォルトでは、$HOME/.chefです。


PEMファイルには、アクセス用のPIN(Private Identification Number)が設定されていない(秘密鍵へのアクセスパスワードが未設定)ため、ファイルのOwnerのみ読み書きできるようにファイルのパーミッションを600に変更します。
$ chmod 600 username.pem

また、opensslコマンドを利用して、秘密鍵にアクセスできるか確認します。
$ openssl rsa username.pem

knife.rb中のclient_keyの値に、先程保存した秘密鍵のファイル名をフルパスで指定します。デフォルトでは、$HOME/.chef/LOGINNAME.pemとなっていますので、LOGINNAMEとusernameが異なる場合、必ず正しい秘密鍵ファイル名をフルパスで指定して下さい。
$ vi knife.rb (変更前) client_key 'd:/HOME/punio/.chef/punio.pem' (変更後) client_key 'd:/HOME/punio/.chef/username.pem'


以上の手順で、Chef Soloのインストールおよび、環境設定が終了します。
サードパーティCookbookの利用
OPSCODEでは、サードパーティのCookbookを公開していますので、Chef Solo環境にインストールします。

①Cookbookを保存するフォルダを作成します。
Chefの作法では、外部Cookbookをsite-cookbooksに保存し、カスタムCookbookをcookbooksに保存するように推奨しています。
$ mkdir -p $HOME/my-cookbooks/site-cookbooks

②Berkshelfの初期化
my-cookbooksフォルダに移動し、以下のコマンドを実行して初期化します。
$ berks init

③Berkshelfの編集
生成されたBerksfileに公開されているApache2のcookbookを追加します。
(変更前) site :opscode (変更後) site :opscode cookbook 'apache2'

④Cookbookをインストールします。
以下のコマンドを実行してCookbookをインストールします。
$ berks install --path=site-cookbooks

インストールが終了したら、指定したCookbookがインストールされているか確認します。
$ berks list

インストール後のCookbookの構成は、以下のとおりです。
$ ls site-cookbooks/apache2/

⑤Belkshelf設定ファイルを移動します。
手順④で、Cookbookをインストールすると、$HOME/my-cookbooks/site-cookbooks配下にCookbook名のフォルダが作成され、Cookbookがインストールされます。
しかし、手順②で生成されたBelkshelf設定ファイルがうまくインストールされません。このため、手順②~④で生成された下記の設定ファイルを$HOME/my-cookbooks/site-cookbooks配下に移動します。
Berksfile Berksfile.lock Thorfile .gitignore Gemfile Vagrantfile
移動後のCookbookの構成は、以下のとおりです。
$ ls site-cookbooks/apache2/
以上の手順で、サードパーティのCookbookがインストールされます。
仮想マシンへのRecipeの適用
これまでの設定で、サードパーティのCookbookがインストールできましたので、インストールしたCookbookを既存のVagrant Boxに適用します。
ここでは、Veeweeを使ってVagrant用仮想マシンイメージを作成するで作成したBoxに対して、レシピを適用します。
以下の手順で、レシピの適用を行います。
①Vagrantファイルの編集
Berkshelfの初期化で生成されたVagrantfileを、下記のとおり編集します。
編集箇所が複数に渡るため、オリジナルとの差分を記します。
$ diff Vagrantfile.orig Vagrantfile
9c9,10
< config.vm.hostname = "my-cookbooks-berkshelf"
---
> config.omnibus.chef_version = :latest
> config.vm.hostname = "berkshelf-veewee-centos64-minimal"
12c13
< config.vm.box = "Berkshelf-CentOS-6.3-x86_64-minimal"
---
> config.vm.box = "veewee-centos64-minimal"
16c17
< config.vm.box_url = "https://dl.dropbox.com/u/31081437/Berkshelf-CentOS-6.3-x86_64-minimal.box"
---
> #config.vm.box_url = "https://dl.dropbox.com/u/31081437/Berkshelf-CentOS-6.3-x86_64-minimal.box"
22c23
< config.vm.network :private_network, ip: "33.33.33.10"
---
> #config.vm.network :private_network, ip: "33.33.33.10"
28c29
< # config.vm.network :public_network
---
> config.vm.network :public_network
74,80c75,81
< chef.json = {
< :mysql => {
< :server_root_password => 'rootpass',
< :server_debian_password => 'debpass',
< :server_repl_password => 'replpass'
< }
< }
---
> # chef.json = {
> # :mysql => {
> # :server_root_password => 'rootpass',
> # :server_debian_password => 'debpass',
> # :server_repl_password => 'replpass'
> # }
> # }
83c84
< "recipe[my-cookbooks::default]"
---
> "recipe[apache2]"
修正のポイントは、下記のとおりです。
| エントリ | 概要 |
|---|---|
| config.omnibus.chef_version = :latest | 最新のvagrant-omnibusプラグインを使用する。 |
| config.vm.box = “veewee-centos64-minimal” | 既存のVagrant Box名を指定する。 |
| “recipe[apache2]” | 使用するCookbookをrun_listに指定します。 |
②既存のBoxの除去
既存のBoxがVirtualBoxに登録されている状態では、新しいBoxを起動できませんので、以下のコマンドを実行して、既存のBoxを除去します。
$ vagrant destroy

③Boxの起動
既存のBoxが除去できたら、以下のコマンドを実行して、新しいBoxを作成します。
$ vagrant up

以上の手順で、BoxにChef Soloがインストールされて、Box内でレシピが実行されます。
まとめ
ここまで、Vagrantを使った仮想マシンのプロビジョニング方法について解説しました。Vagrant + Chef Solo + Berkshelfを使用したプロビジョニングは、Vagrantプラグインのvagrant-omnibusおよび、vagrant-berkshelfを活用することで、vagrantコマンドだけでプロビジョニングを実行できます。今回は解説しませんでしたが、自作のCookbookの作り方についてはまたの機会に解説できればと思います。