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


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

Vagrantの設定は下記を参照。
Vagrantのインストール、設定手順

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環境構築メモ

rbenv-sudoのインストール

bundleコマンドをsudoで実行可能にする。

下記参照
sudo bundle execを実行可能にする

Chefのインストール

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

$ mkdir chef-repo
$ cd chef-repo/

Gemfileを作成して

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 <[email protected]>"
というオプションで、metadata.rbのmaintainerやレシピ(default.rb)のCopyrightを置換することも可能。

recipeの作成

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

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

設定ファイルを作成

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

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みたいなもの。

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

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

$ berks vendor vendor/cookbooks

以上。

[参考]
Chefを読んで実行するための全知識
これからはじめるChefのチュートリアル 基本編
knife create cookbook する時にちょっとした便利なオプション
Chef Solo ではなく Chef Client Local Mode を使おう