PHP
Mac
CentOS
chef
vagrant

Vagrant+Chef Centos6.4 PHP5.3.3 → 5.3.28 バージョンアップ

More than 3 years have passed since last update.

背景

サービスが稼働しているAWS上のPHPバージョンとVagrantで構築している開発環境のPHPバージョンに差異があった。
本番環境の方がバージョンが進んでおり、本番環境では利用できる関数が開発環境では意図した動きをしなかったため、開発環境のPHPをアップデートすることにした。

環境

AWS

Amazon Linux
PHP 5.3.28

開発環境

CentOS 6.4
PHP 5.3.3

ゴール

Chef-soloを使い、vagrant upでPHP5.3.28がインストールされたCentOSが立ち上がるようにする

調査

CentOS6.4のyumリポジトリにあるPHPの最新版は5.3.3であり、そのままでは5.3.28をインストールすることができない。
epalやらremiやら探してみたが、どこも5.4だったり5.5だったりで目当てのPHP5.3.28を持っているリポジトリを見つけるのに手間取ってしまった。

色々探した結果、iusリポジトリにphp53uなるパッケージを発見したので、これを使ってレシピを書く事にした。

recipe

Vagrantfile
  config.vm.provision :chef_solo do |chef|
    chef.cookbooks_path = "cookbooks/site-cookbooks"
    chef.add_recipe "php"

    # You may also specify custom JSON attributes:
    chef.json = { 
      php53u: {
        ius_rpm_url: 'http://dl.iuscommunity.org/pub/ius/stable/CentOS/6/x86_64/ius-release-1.0-11.ius.centos6.noarch.rpm',
        ius_rpm_filename: 'ius-release-1.0-11.ius.centos6.noarch.rpm'
      },
    }
recipe/default.rb
# php53u repository導入
remote_file "/tmp/#{node['php53u']['ius_rpm_filename']}" do
  source "#{node['php53u']['ius_rpm_url']}"
  not_if { ::File.exists?("/tmp/#{node['php53u']['ius_rpm_filename']}") }
end

package node['php53u']['ius_rpm_filename'] do
  action :install
  provider Chef::Provider::Package::Rpm
  source "/tmp/#{node['php53u']['ius_rpm_filename']}"
end

# phpインストール
%w{php53u php53u-cli php53u-common php53u-dba php53u-devel php53u-mbstring php53u-mysql php53u-pdo php53u-pear php53u-pecl-apc php53u-pecl-memcache php53u-xml php53u-xmlrpc pcre-devel}.each do |p|
  package p do
    action :install
    options "--enablerepo=ius"
  end
end

これでさっくり終わりかと思っていたところ、iusリポジトリにはサービス内で利用していたpecl_httpのパッケージが存在しないことが発覚。
どうしようか思案したが素直にpeclコマンドで入れる事にした。

recipe/default.rb
execute "install pecl_http" do
  command "pecl install pecl_http-1.7.6"
  action :run
end

# pecl_http設定
template "http.ini" do
  path "/etc/php.d/http.ini"
  source "http.ini.erb"
  mode 0644
  notifies :restart, 'service[httpd]'
end
templates/default/http.ini.erb
extension=http.so

当初はpeclコマンドでインストールされるpecl_http-2.0.4をインストールしてみたが、http.soがうまくロードされないようでエラーになったため、こちらを参考にpecl_http-1.7.6を導入した。

terminal
$ vagrant up                                                                                                                                                                                                                 [20:39:53]
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'centos64'...
==> default: Matching MAC address for NAT networking...

〜中略〜

[2014-06-04T11:57:10+00:00] INFO: Chef Run complete in 852.584544316 seconds
[2014-06-04T11:57:10+00:00] INFO: Running report handlers
[2014-06-04T11:57:10+00:00] INFO: Report handlers complete

うまく動いた。よかったよかった。