背景
サービスが稼働している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
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'
},
}
# 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コマンドで入れる事にした。
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
extension=http.so
当初はpeclコマンドでインストールされるpecl_http-2.0.4をインストールしてみたが、http.soがうまくロードされないようでエラーになったため、こちらを参考にpecl_http-1.7.6を導入した。
$ 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
うまく動いた。よかったよかった。