Vagrantとchef-soloでCentOS6.4にPHP5.4を入れる

調べても「どんぴしゃ!」な情報がなかったのでまとめておきます。

1.前提情報

  • OS
  • Vagrant
    • Vagrant version 1.0.7
  • 利用するbox

2.下ごしらえ

boxをadd、initして、upしておきます。
事件が起きた際にロールバックできるよう、sandboxモードをonにしておくと良いでしょう。

【参考】

また、クックブックを格納するためのディレクトリ「cookbooks」を「Vagrantfile」のある階層に作成しておきます。

3.iusリポジトリを追加するためのレシピを追加

yumからPHP5.4系をインストールするためには、ius等の外部リポジトリをyumに登録する必要があります。
yumリポジトリに関するクックブック、opscode-cookbooks/yum · GitHub を利用させてもらいます。

クックブックをcloneする
> cd cookbooks
> git clone https://github.com/opscode-cookbooks/yum
レシピをVagrantfileに追加

実際に利用するレシピは、「cookbooks/yum/recipes/ius.rb」 となります。
Vagrantfileの中ほどにある、chef-soloに関する記述部分を以下のように編集します。

  # Enable provisioning with chef solo, specifying a cookbooks path, roles
  # path, and data_bags path (all relative to this Vagrantfile), and adding 
  # some recipes and/or roles.
  #
  config.vm.provision :chef_solo do |chef|
    chef.cookbooks_path = "./cookbooks"
    chef.add_recipe "yum::ius"

    # You may also specify custom JSON attributes:
    chef.json = {
      'yum' => {
        'ius_release' => '1.0-11'
      }
    }
  end

chef.jsonに、iusのバージョン(1.0-11)を指定しています。
ただ、このバージョンは「cookbooks/yum/attributes/default.rb」内で

default['yum']['ius_release'] = '1.0-11'

というデフォルト指定がされていますので、省略しても大丈夫です。

なお、iusリポジトリを追加する場合、一緒にepelリポジトリも追加しなければなりませんが、
ius.rbの冒頭にある以下の記述によって自動的に行われます。

include_recipe "yum::epel"

package "epel-release"

4.PHP5.4をインストールするためのレシピを追加

せっかくなので、クックブックを作ってやってみました。

クックブックの作成

Vagrantfileのある場所で、knifeを使います。

> knife cookbook create php54 -o cookbooks
 ** Creating cookbook php54
 ** Creating README for cookbook: php54
 ** Creating CHANGELOG for cookbook: php54
 ** Creating metadata for cookbook: php54
レシピを記述

「cookbooks/php54/recipes/default.rb」を以下のように編集します。

%w(php54 php54-mbstring php54-pecl-xdebug).each do |package|
  yum_package package do
    action :install
  end
end
レシピをVagrantfileに追加

yumの下に追加します。

  # Enable provisioning with chef solo, specifying a cookbooks path, roles
  # path, and data_bags path (all relative to this Vagrantfile), and adding 
  # some recipes and/or roles.
  #
  config.vm.provision :chef_solo do |chef|
    chef.cookbooks_path = "./cookbooks"
    chef.add_recipe "yum::ius"
    chef.add_recipe "php54"

    # You may also specify custom JSON attributes:
    chef.json = {
      'yum' => {
        'ius_release' => '1.0-11'
      }
    }
  end

5.レッツ、クック!

> vagrant provision

でお料理できます。

が、

[default] Running provisioner: Vagrant::Provisioners::ChefSolo...
Shared folders that Chef requires are missing on the virtual machine.
This is usually due to configuration changing after already booting the
machine. The fix is to run a `vagrant reload` so that the proper shared
folders will prepared and mounted on the VM.

と言われたので、素直に従い、vagrant reloadしました。

でろでろ、と結構な出力がありますが、抜粋すると、、、

epelリポジトリの追加
INFO: Processing yum_key[RPM-GPG-KEY-EPEL-6] action add (yum::epel line 22)
INFO: Adding RPM-GPG-KEY-EPEL-6 GPG key to /etc/pki/rpm-gpg/

先にキーの追加をしていますね。

INFO: Processing package[epel-release] action install (yum::ius line 22)
INFO: package[epel-release] installing epel-release-6-8 from epel repository

epel-release-6-8が入りました。

iusリポジトリの追加
INFO: Processing remote_file[/tmp/vagrant-chef-1/ius-release-1.0-11.ius.el6.noarch.rpm] action create (yum::ius line 27)
INFO: remote_file[/tmp/vagrant-chef-1/ius-release-1.0-11.ius.el6.noarch.rpm] updated
INFO: remote_file[/tmp/vagrant-chef-1/ius-release-1.0-11.ius.el6.noarch.rpm] sending install action to rpm_package[ius-release] (immediate)
INFO: Processing rpm_package[ius-release] action install (yum::ius line 33)

rpmをローカルに落としてインストールしています。

phpのインストール
INFO: Processing yum_package[php54] action install (php54::default line 10)
INFO: yum_package[php54] installing php54-5.4.14-1.ius.el6 from ius repository
INFO: Processing yum_package[php54-mbstring] action install (php54::default line 10)
INFO: yum_package[php54-mbstring] installing php54-mbstring-5.4.14-1.ius.el6 from ius repository
INFO: Processing yum_package[php54-pecl-xdebug] action install (php54::default line 10)
INFO: yum_package[php54-pecl-xdebug] installing php54-pecl-xdebug-2.2.2-1.ius.el6 from ius repository

レシピ通り、3つインストールしています。

6.いただきます!

vagrant sshして、確認します。

yumのリポジトリの追加
$ ls -l /etc/yum.repos.d/
 total 44
 -rw-r--r--. 1 root root 1926 Feb 25 08:57 CentOS-Base.repo
 -rw-r--r--. 1 root root  638 Feb 25 08:57 CentOS-Debuginfo.repo
 -rw-r--r--. 1 root root  630 Feb 25 08:57 CentOS-Media.repo
 -rw-r--r--. 1 root root 3664 Feb 25 08:57 CentOS-Vault.repo
 -rw-r--r--  1 root root  278 May 13 08:04 epel.repo
 -rw-r--r--  1 root root  957 Nov  5  2012 epel.repo.rpmnew
 -rw-r--r--  1 root root 1056 Nov  5  2012 epel-testing.repo
 -rw-r--r--  1 root root 1090 Mar 25 19:08 ius-archive.repo
 -rw-r--r--  1 root root 1072 Mar 25 19:08 ius-dev.repo
 -rw-r--r--  1 root root 1013 Mar 25 19:08 ius.repo
 -rw-r--r--  1 root root 1090 Mar 25 19:08 ius-testing.repo

epel, iusの2つが追加されています。

php
$ php -v
PHP 5.4.14 (cli) (built: Apr 12 2013 10:52:14)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
    with Xdebug v2.2.2, Copyright (c) 2002-2013, by Derick Rethans


すばらしい!ごちそうさまでした!

sandboxをcommitするのを忘れずに!