kikukawa's diary

都内で活動するシステムエンジニアが書いてます。 興味を持った技術やハマったポイント、自分用メモをつけてます。 最近はweb中心

vagrant + berkshelf + chef(knife solo)を用いたLAMP環境作り

vagrant-berkshelfは非推奨になるそうなので使わない方針です。
berkshelfのバージョン3系でvagrant-berkshelfを使用したらうまく行きませんでした。

vagrantプラグインは、各VMごとにインストールされるのではなく、
そのHost全体で共有されるようです。

作業ディレクトリ作成して、vagrantの初期設定。

GuestOSにはcentos7を使用します。addで追加して、listで追加されてことを確認します。

//追加
vagrant box add centos7_64 https://dl.dropboxusercontent.com/s/w3lbekm7eunrskm/centos-7.0-x86_64.box

//追加されたことを確認
vagrant box list

//作業ディレクトリ作成
mkdir my-centos
cd my-centos

//初期化
vagrant init centos7_64

//インストール指定なければプラグインインストール(chef用)
vagrant plugin install vagrant-omnibus

chef、knife solo、berkshelfのインストール

Bundlerを使ってインストールします。

bundle init 
vi Gemfile

Gemfileの中身です。knife-soloの0.2系だとバグがあるそうなので、0.3以降を指定しています。

source "https://rubygems.org"

gem "chef"
gem "knife-solo", "~> 0.3.0"
gem "berkshelf"
//インストール。この時ridleyのインストールで時間かかりますが、辛抱強く待ちます
bundle --path vendor/bundle --binstubs vendor/bin

cookbooksのひな形作成と、Berksfileの設定、cookbookのダウンロード

knifeの設定をします。基本的にすべてEnterでOK
bundle exec knife conifigure

//ひな形chef-repoの作成
bundle exec knife solo init chef-repo
cd chef-repo
vi Berksfile

Berksfileの中身

source "https://supermarket.getchef.com"
cookbook "yum"
cookbook "git"
cookbook "vim"
cookbook "apache2"
cookbook "php"
cookbook "mysql"


cookbooks外部のcookbookをダウンロード

bundle exec berks vendor cookbooks

こんなエラーがでました。

destination already exists /path/to/my-centos/chef-repo/cookbooks. Delete it and try again or use a different filepath.

対象のパスにすでにディレクトリがあるダメなようです。
削除して再実行しました。

rm -r cookbooks
bundle exec berks vendor cookbooks

Vaigrant起動用のファイルを修正して、VM起動

vi Vagrantfile

Vagrantfileの中身です。追記したところだけ抜粋です。

    #config.vm.provisionのブロック
    chef.cookbooks_path = "./chef-repo/cookbooks"
    chef.roles_path = "./chef-repo/roles"
    chef.data_bags_path = "./chef-repo/data_bags"
    chef.run_list = [
      "recipe[yum]",
      "recipe[yum-epel]",
      "recipe[apache2]",
      "recipe[apache2::mod_php5]",
      "recipe[apache2::mod_rewrite]",
      "recipe[php]",
      "recipe[mysql::server]",
      "recipe[mysql::client]",
      "recipe[vim]",
      "recipe[git]"
    ]
    chef.json = {
        :mysql => {
            :server_root_password => "foo-bar-buz"
        }

  #vagrant-omnibusで使うchefの設定。Vagrantfileの最後のendのすぐ上に追記しておく。
  config.omnibus.chef_version = :latest

起動。時間がかかりますが、無事に起動するはず。

vagrant up

注意点

berkshelf、knife-soloのインストール

bundlerを使わずにgemで直接インストールするほうが、何も考える必要ないので楽です。
bundlerを使いたいときは、berkshelfをvagrant経由で起動するのは諦めたほうが良さそうです。
vagrantのプロビジョニング時に、berksコマンドが見つからないといって怒られます。

config.berkshelf.enabled

berkshelf init を使ってできるVagrantfileには、この記述があります。berkshelf3系を使っていると相性悪いそうなので、
falseにして、vagrant up/provisonの時にberkshelfが走らないようにします。
そうしないとエラーで止まります。

config.berkshelf.enabled = true <= falseに変更

Updating Vagrant's berkshelf: '/home/foo/.berkshelf/default/vagrant/berkshelf-20140918-6867-uqf5k4-default'
RuntimeError: Couldn't determine Berks version: #<Buff::ShellOut::Response:0x00000002c989a0 @exitstatus=1, @stdout="", @stderr="/home/foo/.rbenv/versions/2.1.2/lib/ruby/2.1.0/rubygems/dependency.rb:298:in `to_specs': Could not find 'berkshelf' (>= 0) among 59 total gem(s) (Gem::LoadError)\n\tfrom /home/foo/.rbenv/versions/2.1.2/lib/ruby/2.1.0/rubygems/dependency.rb:309:in `to_spec'\n\tfrom /home/foo/.rbenv/versions/2.1.2/lib/ruby/2.1.0/rubygems/core_ext/kernel_gem.rb:53:in `gem'\n\tfrom /home/foo/.rbenv/versions/2.1.2/bin/berks:22:in `<main>'\n">


falseに設定して、でも、Berksfileが存在すると下記のようなメッセージがでますが、無視します。

Berkshelf plugin is disabled but a Berksfile was found at your configured path: /path/to/my-centos/Berksfile
Enable the Berkshelf plugin by setting 'config.berkshelf.enabled = true' in your vagrant config

参考
vagrant-berkshelf を使わずに Berkshelf + knife-solo で環境作ってみた話 - scramble cadenza
Vagrant+Chef+BerkShelfでLAMPの環境を作る
Berkshelfベースにvagrant, chef(knife-solo)環境を簡単に構築する方法 - Qiita
OSX - Macでchef-soloとBerkshelfの環境構築手順 - Qiita
Cookbookの管理を楽にするBerkshelfの使い方( ー`дー´)キリッ とか。 - 256bitの殺人メニュー
vagrant-berkshelfは非推奨になるとのこと - Qiita