Vagrant + ChefでCentOS7 + PHP7の環境を構築する


# Vagrant + ChefでCentOS7 + PHP7の環境を構築する
Vagrantの設定は下記を参照。
[Vagrantのインストール、設定手順](http://qiita.com/Esfahan/items/41c4469f28f6011ab33b)


## Version
- CentOS7.1
- PHP7
- ruby 2.3.1
- Chef: 12.11.18

## CentOS7のbox追加

```
$ vagrant box add centos71 https://github.com/holms/vagrant-centos7-box/releases/download/7.1.1503.001/CentOS-7.1.1503-x86_64-netboot.box
```

## Rubyのインストール
Chefを動かすにはRubyが必要です。
インストールは下記の`rbenv, rubyのインストール`の項を参照。
[Ruby on Rails環境構築メモ](http://qiita.com/Esfahan/items/1a497fe75405561ef433)

## rbenv-sudoのインストール
bundleコマンドをsudoで実行可能にする。

下記参照
[sudo bundle execを実行可能にする](http://qiita.com/Esfahan/items/974db874c42b87b120d8)

## Chefのインストール
Chefをインストールするディレクトリを作成

```
$ mkdir chef-repo
$ cd chef-repo/
```

Gemfileを作成して

```lang:Gemfile
source "https://rubygems.org"

gem 'chef'
gem 'knife-solo'

```

bundle installする。

```
$ bundle install --path vendor/bundle
```

recipeの雛形を作成。

```
$ bundle exec knife solo init .
```

## cookbookの作成
下記コマンドで、自作のcookbookのひな型を、sample_cookbookという名でsite-cookbooksの下に生成。

```
$ bundle exec knife cookbook create sample_cookbook  -o site-cookbooks
```

ちなみに、
`--copyright "Foo company" --email "Bar <bar@gmail.com>"`
というオプションで、metadata.rbのmaintainerやレシピ(default.rb)のCopyrightを置換することも可能。


## recipeの作成

下記は、CentOS７に、git、php7、composerをインストールするレシピ。
`site-cookbooks/sample_cookbook/recipes/default.rb`に記述する。

```lang:site-cookbooks/sample_cookbook/recipes/default.rb
# # # # #
# install git
# # # # #
package 'git' do
  action :install
end

# # # # #
# php
# # # # #

# epel
package 'epel-release.noarch' do
  action :install
end

# remi
remote_file "#{Chef::Config[:file_cache_path]}/remi-release-7.rpm" do
    source "http://rpms.famillecollet.com/enterprise/remi-release-7.rpm"
    not_if "rpm -qa | grep -q '^remi-release'"
    action :create
    notifies :install, "rpm_package[remi-release]", :immediately
end

rpm_package "remi-release" do
    source "#{Chef::Config[:file_cache_path]}/remi-release-7.rpm"
    action :nothing
end

# php
package 'php' do
  flush_cache [:before]
  action :install
  options "--enablerepo=remi --enablerepo=remi-php70"
end

%w(php-openssl php-common php-mbstring php-xml).each do |pkg|
  package pkg do
    action :install
    options "--enablerepo=remi --enablerepo=remi-php70"
  end
end

# # # # #
# install composer
# # # # #
bash 'install_composer' do
  not_if { File.exists?("/usr/local/bin/composer") }
  user 'root'
  cwd '/tmp'
  code <<-EOH
    curl -sS https://getcomposer.org/installer | php -- --install-dir=/tmp
    mv /tmp/composer.phar /usr/local/bin/composer
  EOH
end

# # # # #
# others
# # # # #
packages = %w(unzip fontconfig-devel)
packages.each do |pkg|
  package pkg do
    action :install
  end
end
```

## 設定ファイルを作成

各種パスを明記したファイルを作成。

```lang:chef.rb
file_cache_path "/ディレクトリパス/chef-repo"
cookbook_path %w(/ディレクトリパス/chef-repo/site-cookbooks)
role_path "/ディレクトリパス/chef-repo/roles"
```

## jsonファイルを作成


```
$ vi chef-repo/nodes/chef.json
{
  "run_list": [
    "recipe[sample_cookbook]"
  ]
}
```

## Chef実行
chef-clientのローカルモードで実行する。

```
$ rbenv sudo bundle exec chef-client --local-mode -j nodes/chef.json -c chef.rb
```


## Berkshelfを使う場合
BerkshelfはChefのcookbook管理ツールで、サードパーティ製のCookbookをダウンロードして利用することができます。gemとbundlerみたいなものです。

Berksfileを作成。bundlerでいうGemfileみたいなもの。

```lang:Berksfile
source "https://supermarket.getchef.com"
cookbook 'sudo'
```

下記コマンドでインストール

```
$ berks vendor vendor/cookbooks
```

以上。

[参考]
[Chefを読んで実行するための全知識](http://qiita.com/TsuyoshiUshio@github/items/89030baca68b05a9783d)
[これからはじめるChefのチュートリアル　基本編](http://qiita.com/syou007/items/70006424d66e3f41152d)
[knife create cookbook する時にちょっとした便利なオプション](http://qiita.com/shu1/items/95216161c1c89c374be1)
[Chef Solo ではなく Chef Client Local Mode を使おう](http://qiita.com/1000k/items/1217c66d592089931891)