[Vagrant & VirtualBox] Chef: インストールから Cookbook を作って動かすまで

配布物の内容を理解できるようにアウトラインを確認しておきます。
いわゆる chef-solo, knife solo & Vagrant の構成となります。

ruby 2.1.1p76 (2014-02-24 revision 45161) [x86_64-darwin13.0]
Vagrant 1.6.2
chef (11.16.0)
knife-solo (0.4.2)

Workstation を設定する

Mac 側の設定です。

インストール

chef をインストールします。

% gem install chef

knife-solo をインストールします。

% gem install knife-solo

ただし、バージョンコントロールしておいた方が良さそうです。

設定

knife の設定をします。全てリターンで進めます。

% knife configure
WARNING: No knife configuration file found
Where should I put the config file? [/Users/****/.chef/knife.rb]
Please enter the chef server URL: [https://mbp.local:443]
Please enter an existing username or clientname for the API: [****]
Please enter the validation clientname: [chef-validator]
Please enter the location of the validation key: [/etc/chef-server/chef-validator.pem]
Please enter the path to a chef repository (or leave blank):
*****
You must place your client key in:
  /Users/****/.chef/****.pem
Before running commands with Knife!
*****
You must place your validation key in:
  /etc/chef-server/chef-validator.pem
Before generating instance data with Knife!
*****
Configuration file written to /Users/****/.chef/knife.rb

pem 関連の記述があります。
このあたりは調べようと思いましたが、力尽きました。
いつかやるかも。

Node を設定する

Vagrant VM 側の設定です。

仮想マシンの作成

ディレクトリを作成し、ローカルにある vagrant box を確認します。

% mkdir vagrant
% cd vagrant
% vagrant box list
chef/centos-6.5      (virtualbox, 1.0.0)
chef/centos-6.5-i386 (virtualbox, 1.0.0)
precise64            (virtualbox, 0)
vccw_box             (virtualbox, 0)
wp_box               (virtualbox, 0)

chef/centos-6.5 を使うことにします。
なければ box add をします。

% vagrant init chef/centos-6.5

Vagrantfile を編集して接続設定を有効化しておきます。

VagrantFile
  config.vm.box = "chef/centos-6.5"
  config.vm.network "private_network", ip: "192.168.33.10"

仮想マシンを起動します。

% vagrant up

ssh の設定

ホストに名前を付けて ssh config 設定を追記しておきます。

% vagrant ssh-config --host zend >> ~/.ssh/config

ここでは zend というホスト名にしました。

knife-solo コマンドで chef を実行する

knife-solo コマンドを使って操作していきます。

chef リポジトリを作成する

リポジトリを作成します。

% cd ../
% knife solo init chef-repo

ファイル構成はこのようになりました。

.
├── chef-repo
│   ├── cookbooks
│   ├── data_bags
│   ├── environments
│   ├── nodes
│   ├── roles
│   └── site-cookbooks
└── vagrant
    └── Vagrantfile

site-cookbooks 以下にレシピを作成していきます。
なお、cookbooks には配布されているクックブックを入れる慣習とのことです。

仮想マシンに chef をインストールする

ホスト zend へ chef をインストールします。

% knife solo prepare zend

Cookbook を作成する

scaffold します。

% cd chef-repo
% knife cookbook create zend -o site-cookbooks
** Creating cookbook zend
** Creating README for cookbook: zend
** Creating CHANGELOG for cookbook: zend
** Creating metadata for cookbook: zend

このようなファイル構成になりました。

chef-repo
├── cookbooks
├── data_bags
├── environments
├── nodes
├── roles
└── site-cookbooks
    └── zend
        ├── CHANGELOG.md
        ├── README.md
        ├── attributes
        ├── definitions
        ├── files
        │   └── default
        ├── libraries
        ├── metadata.rb
        ├── providers
        ├── recipes
        │   └── default.rb
        ├── resources
        └── templates
            └── default

site-cookbooks/zend/recipes/default.rb を編集して、vim をインストールしてみます。

package "vim-enhanced" do
  action :install
end

nodes/zend.json を作成し、実行時のレシピを登録します。

{
  "run_list": [
    "recipe[zend]"
  ]
}

実行します。

% knife solo cook zend

このように package や service といった resource を使いながらレシピを書いていくようです。

ただ、このままでは新規に vagrant up した後、毎回手動でプロビジョニングする必要があります。

% vagrant up
% knife solo prepare zend
% knife solo cook zend

次回にこのあたりを解決したいと思います。

ファイル構成について

今回、プロジェクトディレクトリの構成については、ドットインストールのレッスンに対応する形で作ってみました。
ただ vagrant upknife solo コマンドの実行、設定ファイルのパスの記述などで不便なことが多かったので、同一ディレクトリにまとめた方が使い勝手が良さそうです。

.
├── Vagrantfile
├── cookbooks
├── data_bags
├── environments
├── nodes
│   └── zend.json
├── roles
└── site-cookbooks
    └── zend
        ├── CHANGELOG.md
        ├── README.md
        ├── attributes
        ├── definitions
        ├── files
        │   └── default
        ├── libraries
        ├── metadata.rb
        ├── providers
        ├── recipes
        │   └── default.rb
        ├── resources
        └── templates
            └── default
                └── httpd.conf.erb

例えば、次回からはこんな形でプロジェクトを開始しようと考えています。

% knife solo init foo
% cd foo
% vagrant init chef/centos-6.5
% vagrant up
% vagrant ssh-config --host foo >> ~/.ssh/config