chef というか berkshelf での cookbook の利用が難しい


# やりたいこと

recipe を書かなくても vagrant chef.run_list や chef.json のみで CentOS6.6 + PHP5.5 + MySQL5.6 + Apache2.2 環境を作りたい。

# 最初に考えていたイメージ

以下のような各ファイル内容をイメージしていたけど、、、
全然ダメでした。

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

cookbook 'yum-epel'
cookbook 'yum-remi'
cookbook 'iptables'
cookbook 'apache2'
cookbook 'mysql'
cookbook "php"
```

```ruby:Vagrantfile
  config.vm.provision :chef_solo do |chef|
    chef.log_level = "debug"
    chef.cookbooks_path = "./cookbooks"

    # 開発環境用に設定を上書きする。
    chef.json = {
      php: {
        version: "5.5"
      },
      mysql: {
        version: "5.6",
        server_root_password: ""
      }
    }

    chef.run_list = %w[
      recipe[yum-epel]
      recipe[yum-remi]
      recipe[iptables::disabled]
      recipe[apache]
      recipe[apache::mod_ssl]
      recipe[apache::mod_rewrite]
      recipe[mysql::client]
      recipe[mysql::server]
      recipe[php]
    ]
  end
```

# イメージと異なった点

https://supermarket.chef.io/ ここにある cookbook が CentOS に向いてないとか、自分の理解が浅い、もしくは、勘違いが影響している。

確認した cookbook のバージョン

| cookbook url | version | 
|:---|:---:|
| https://supermarket.chef.io/cookbooks/php | 1.5.0 |
| https://supermarket.chef.io/cookbooks/mysql | 6.0.13 |
| https://supermarket.chef.io/cookbooks/apache2 | 3.0.1 |
| https://supermarket.chef.io/cookbooks/httpd | 0.2.6 |

## cookbook 「php」

PHP 5.3 のみの提供みたい。
PHP 5.5 にする場合、自分で recipe を書いた方が良さそう。

※ http://wiki.centos.org/AdditionalResources/Repositories を見ると、remi より ius の方が良いみたい。外部リポジトリってググってパッとって感じでやってしまってるので、少し調べるクセをつけるようにしないとー。

```ruby:recipes/default.rb
# php インストール
%w[php php-devel php-common php-cli php-pear php-pdo php-mysqlnd php-xml php-process php-mbstring php-mcrypt php-pecl-xdebug].each do |p|
  package p do
    action :install
    options "--enablerepo=remi --enablerepo=remi-php55"
  end
end

# php 設定
template "php.ini" do
  path "/etc/php.ini"
  source "php.ini.erb"
  mode 0644
end
```

## cookbook 「mysql」

これ、version 6系から大きく内容が変わってる。
version 5系にすれば、chef.run_list で使えるんだけど、version 6系からは、LWRP(lightweight resource and provider) としての提供のみになったみたい。

なので、recipe を書く必要はありそう。

以下のような recipe を書くのは良いのだけど、
この default の部分が困る。

```ruby:recipes/default.rb
mysql_service 'default' do
  version '5.6'
  initial_root_password 'password'
  action [:create, :start]
end
```

既存の /etc/mysql/my.cnf とかはそのままに新たに /etc/mysql-default/my.cnf を作っちゃう。

単純に

```
$ mysql -u root
```

としても繋がらなくて、

```
$ sudo mysql --defaults-file=/etc/mysql-default/my.cnf -u root
```

とする必要があった。あと mysql 各ディレクトリを見るときにちょっと困っちゃう。

何個もインスタンスをたちあげれるようにっということなんだろうけど、普通は１つのインスタンスがあれば、事足りることが多いんじゃないかなー。

## cookbook 「apache2」

これは、CentOS の apache 2.2 を入れても apache 2.4 のディレクトリ構成になってる気する。
もっと良い cookbook がないかなっと探して、見つけたのが次の cookbook。

## cookbook 「httpd」

これも mysql version 6系のように LWRP(lightweight resource and provider) のみの提供。

```recipes/default.rb
httpd_service 'default' do
  mpm 'prefork'
  action [:create, :start]
end
```

のような感じで簡単に使えるんだけど、やっぱり何個もインスタンスをたちあげることを意識しているので、いろいろなファイルやディレクトリに -default がついてる。
例えば、apache を再起動したい場合は

```
$ sudo /etc/init.d/httpd-default restart
```

みたいな感じで。

これも、version 0.1.5 までは、既存の設定を上書きできるようにする方法があったけど version 0.2.0 からなくなったところをみると、あえてこようなインスタンスごとに設定するということにしてるんだと思う。

考え方なんだろうなー。

# 結論

chef / cookbook / berkshelf について、知識不足すぎ。
もっといろんなサイトを見て、ベストな方法を学ぶ必要がある。

まずは、cookbook は、yum-epel とか程度に限定して、各サーバーの設定とかは、自分で recipe を書いた方がはやそう。
知識を得たら、もっと cookbook を活用させていく！！

mysql / httpd の cookbook libraries をみるとクロスプラットフォーム対応の大変さがわかった。
バージョンやプラットフォームで、いろいろと分岐してる。
これ維持するのが大変そう。流行ってるうちは維持されるんだろうけど、いつまで維持されるんだろう。。。

LWRP を自力で作ってメンテするのは無理。
でも、この LWRP をきちんと利用できれば、自分でもクロスプラットフォームの recipe を書ける。

LWRP を作って維持してれてる人たちはエライ！！