すたらブログ

文系Webプログラマの備忘録

Windows7でBerkshelfを使う

Vagrant + Chef-Solo + Berkshelf でCentOSApachePHPを入れるクックブックを作りました。


目次

  1. 前提
  2. コマンドプロンプト文字コードUTF-8にする
  3. Chef-DKのインストール
  4. vagrant-berkshelfのインストール
  5. 仮想マシンを新規作成する
  6. 取り寄せるクックブックを選ぶ
  7. Berkshelf関連の設定ファイルを編集する
  8. クックブックを取り寄せる
  9. クックブックを利用する
  10. Vagrantfileを編集する
  11. 仮想マシンを作成・起動する
  12. 問題点
  13. 感想

1. 前提

下記の環境がすでに用意されているものとします。

過去記事: Windows: XAMPPの代わりにVagrantとChef-soloを使う - すたらブログ


2. コマンドプロンプト文字コードUTF-8にする

コマンドプロンプト文字コードがShift-JISのままでBerkshelfのコマンドのberks installを実行すると、Encoding::InvalidByteSequenceErrorというエラーが発生します。
下記のコマンドを実行すればUTF-8になります。
しかし、日本語が文字化けしてしまいます。

chcp 65001

日本語を正常に表示させる方法は、下記の記事を参照してください。
ただし、この方法でも日本語の入力はできません。


3. Chef-DKのインストール

"Chef Development Kit"にBerkshelfが含まれています。
公式サイトから入手してください。
これでberksコマンドが使えるようになります。

入手先: https://downloads.chef.io/chef-dk/windows/

Berkshelfの導入にはいろんな方法があるようですが、現時点のBerkshelfの公式サイトではChef-DKでの導入が勧められています。

Berkshelf is now included as part of the Chef-DK. This is fastest, easiest, and the recommended installation method for getting up and running with Berkshelf.

引用: http://berkshelf.com/#getting-started


4. vagrant-berkshelfのインストール

Vagrantプラグインであるvagrant-berkshelfをインストールします。

# インストール
vagrant plugin install vagrant-berkshelf

# 確認
vagrant plugin list

参照: http://berkshelf.com/#vagrant-with-berkshelf


5. 仮想マシンを新規作成する

Vagrantfileも存在しないまっさらの状態から始めます。

berks cookbook vm1

これで、フォルダvm1の中にVagrantfileBerksfileなどが作成されました。


6. 取り寄せるクックブックを選ぶ

欲しいクックブックを下記で探します。
今回はhttpdphpを使うことにします。

https://supermarket.chef.io/

細かい使い方はクックブックによって異なりますが、クックブックを取り寄せて有効化する方法はどれもだいたい同じです。


7. Berkshelf関連の設定ファイルを編集する

vm1/Berksfile

それぞれのクックブックの手引に従ってBerksfileに追記します。

source "https://supermarket.chef.io"

metadata

cookbook 'httpd', '~> 0.2.0'
cookbook 'php', '~> 1.5.0'
vm1/metadata.rb

このファイルへの追記を指示しているクックブックはあまり見当たりませんが、必須の設定です。
depends '<クックブック名>'と記述します。

name             'vm1'
maintainer       'YOUR_NAME'
maintainer_email 'YOUR_EMAIL'
license          'All rights reserved'
description      'Installs/Configures vm1'
long_description 'Installs/Configures vm1'

version          '0.1.0'

depends 'httpd', '~> 0.2'
depends 'php'

8. クックブックを取り寄せる

Berksfileが存在する階層で下記を実行します。

berks install

取り寄せたクックブックはC:\Users\<ユーザ名>\.berkshelf\cookbooksに保存されるようです。


9. クックブックを利用する

取り寄せたクックブックを利用して、ApachePHPをインストールします。

vm1/recipes/default.rb
include_recipe 'php'

# (Berkshelf) httpdをインストール、起動
httpd_service 'default' do
  action [:create, :start]
end

PHPRubyなどはレシピをインクルードするだけでインストールしてくれますが、Apacheの場合は少々異なるようです。
とはいえ、手引に従って設定すれば問題ないと思います。


10. Vagrantfileを編集する

注意点
  • config.berkshelf.enabled = trueを記述する。
  • config.berkshelf.berksfile_pathchef.cookbooks_pathを適切に設定する。
  • 今回はVagrantfileがクックブックの中に存在しているので、run_listでレシピを指定する際に現在位置のフォルダ名をクックブック名として流用するようにしている。
    File.basename(Dir::pwd)でカレントディレクトリのパスからフォルダ名だけを取り出している。
Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = '2'

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = 'centos65-x86_64-20140116'
  config.vm.network 'private_network', ip: '192.168.33.10'
  config.omnibus.chef_version = :latest
  config.berkshelf.enabled = true
  config.berkshelf.berksfile_path = './Berksfile'
  config.vm.provision :chef_solo do |chef|
    chef.cookbooks_path = '../'
    chef.run_list = "recipe[#{File.basename(Dir::pwd)}::default]"
  end
end

11. 仮想マシンを作成・起動する

vagrant up

12. 問題点

Apacheを操作できない

なぜかApacheの起動にも終了にも失敗します。
そして下記のようなメッセージが。

(98)Address already in use: make_sock: could not bind to address [::]:80
(98)Address already in use: make_sock: could not bind to address 0.0.0.0:80

調べてみると、一旦80番ポートを使っているプロセスを終了させなくてはならないようです。

私の場合は下記のようにしました。

sudo yum install lsof
sudo lsof -i:80
sudo kill -9 <プロセスID> <プロセスID> <プロセスID>

13. 感想

初心者なので勘違いしている部分もあると思いますが、個人の開発環境には必要ないのでは…と感じました。

インストールされるアプリケーションのバージョンは、パッケージ管理システムで入手できるものしか指定できないようなのが残念でした。
細かく設定を記述してソースからインストールすることもできるようですが、それならばBerkshelfを使わずに素のレシピを書いたほうが早いような…。
プラットフォームの差を意識せずに必要な環境を定義できるのは良いと思いますが、私には必要なさそうです (-_-;)