Chef knif-solo LAMP環境構築

開発時にアプリケーションを実行する環境を自動構築する方法を記載。
開発環境の構築を自動化しておけば、いつでも開発環境を作ったり壊したりでき、
例えばチームに新しい開発メンバーが加わったときにも簡単に開発環境を用意し、
開発を始めることが可能となる。
ここでは、CentOS7.2・ApachePHPRubyMySQLを軸にLAMP環境を構築。

1. Chef Solo インストール
* Chef社が提供しているオムニバスインスト―ラーを使ってChefをインストール
curl -L https://www.opscode.com/chef/install.sh | sudo bash

* インストールが完了したらchef-soloコマンドが実行できるか確認
(バージョンが表示されたらOK)
chef-solo -v

 

2. Bundlerを導入&実行
* クックブックの管理のためBerksfileを利用する。
  Berksfileとは、第三者が公開しているクックブック(コミュニティクックブック)を
  Rubyの依存性管理ツールであるBundlerのように管理するための設定ファイルのこと。
  Berksfileはgemという形式で配布されており、Rubyにはgem管理のために
  Bundlerというツールがあり、Gemfileに書かれたgemの依存関係を解決してくれる。

* Bundlerのインストール
gem install bundler

 

3. knife-soloでリポジトリを作成
* 新たに作業用ディレクトリを作成し、そちらに移動する。

  この作業用ディレクトリの中にあるファイルのみで環境の構築は完結する。
  また、既存のディレクトリで作業する場合には、BerksfileによってVagrantfileをはじめ
  いくつかのファイルが上書かれてしまうので、事前にバックアップを取っておく。
  作業ディレクトリ内に独立した環境を構築するために、Bundler用のGemfileを作成する。

mkdir /var/chef_knife_solo
cd /var/chef_knife_solo
knife solo init .

* 以下の内容を記述したGemfileを作成。(vim /var/chef_knife_solo/Gemfile
ーーーーーーーーーーーーーーーーーーーーーーーーー
source 'https://rubygems.org'

gem 'chef'
gem 'knife-solo'
gem 'berkshelf', "2.0.16"
ーーーーーーーーーーーーーーーーーーーーーーーーー

* bundleコマンドを実行
yum install libxml2-devel libxslt-devel
bundle install

※これで必要なライブラリのインストールが完了する。

 

4. Apacheのクックブックを作成
* knife-soloを使ってApacheのクックブックを作成する。
chef generate cookbook site-cookbooks/apache

ーーーーーーーーーーーーーーーーーーーーーーーーー
include_recipe "yum-epel"

package "httpd" do
  action :install
end

service "httpd" do
  action [ :enable, :start ]
  supports :status => true, :restart => true, :reload => true
end

directory "/var/www/html/local.develop.co.jp/htdocs" do
  owner "apache"
  group "apache"
  recursive true
  mode 0755
  action :create
end

template "security.conf" do
  path "/etc/httpd/conf.d/security.conf"
  owner "root"
  group "root"
  mode 0644
end

template "local.develop.co.jp.conf" do
  path "/etc/httpd/conf.d/local.develop.co.jp.conf"
  owner "root"
  group "root"
  mode 0644
notifies :restart, 'service[httpd]'
end
ーーーーーーーーーーーーーーーーーーーーーーーーー

 

 

5. Apacheのレシピを作成
* site-cookbooks/apache/recipes/default.rbに以下内容を記述。

 

6. Apacheのセキュリティ用テンプレートを作成
*  templatesディレクトを作成する
mkdir -p site-cookbooks/apache/templates/default

* site-cookbooks/apache/templates/default/security.conf.erb に以下内容を記述。
ーーーーーーーーーーーーーーーーーーーーーーーーー

# バージョン情報の隠蔽
ServerTokens Prod
Header unset X-Powered-By
ServerSignature off

# httpoxy 対策
RequestHeader unset Proxy

# クリックジャッキング対策
Header always append X-Frame-Options SAMEORIGIN

# XSS対策
Header set X-XSS-Protection "1; mode=block"
Header set X-Content-Type-Options nosniff

# XST対策
TraceEnable Off

# DoS 攻撃対策
LimitRequestBody 10485760
LimitRequestFields 20

# TCPタイムアウト時間
TimeOut 10

# slowloris 対策
RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500

<Directory /var/www/html>
    # .htaccess の有効化
    AllowOverride All
    # ファイル一覧出力の禁止
    Options -Indexes
</Directory>

<Directory "/var/www/cgi-bin">
    <IfVersion > 2.4>
        Require all denied
    </IfVersion>
</Directory>

ーーーーーーーーーーーーーーーーーーーーーーーーー

 

7. Apacheの開発環境用テンプレートを作成
* site-cookbooks/apache/templates/default/local.develop.co.jp.conf.erb に以下内容を記述。
ーーーーーーーーーーーーーーーーーーーーーーーーー

<VirtualHost *:80>
    ServerName local.develop.co.jp
    DocumentRoot "/var/www/html/local.develop.co.jp/htdocs"
    DirectoryIndex index.php index.html
    ErrorLog "/var/log/httpd/local.develop.co.jp-error.log"
    CustomLog "/var/log/httpd/local.develop.co.jp-access.log" common

    <Directory "/var/www/html/local.develop.co.jp/htdocs">
        AllowOverride All
        Order Allow,Deny
        Allow from all
    </Directory>
</VirtualHost>

ーーーーーーーーーーーーーーーーーーーーーーーーー

 

8. Berksfileを編集
* クックブックの依存関係を定義する。Berksfileに以下内容を記述。
ーーーーーーーーーーーーーーーーーーーーーーーーー

site :opscode

cookbook "yum-epel"
cookbook "apache", path: "./site-cookbooks/apache"
ーーーーーーーーーーーーーーーーーーーーーーーーー

  

9. berks installコマンドを実行
* うまくいかない場合は、以下コマンドを実行
berks vendor ./cookbooks

 

10. vagrant init コマンドを実行
vagrant init コマンドを実行し、Vagrantfileを作成する。
vagrant init

 

11. Vagrantfileを編集
* Vagrantfileにホスト名の設定、box設定、IPアドレスの設定から
   Apacheをインストールするプロビジョニングの設定を記述。
ーーーーーーーーーーーーーーーーーーーーーーーーー

# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
    config.vm.box = "opscode-centos-7.2"
    config.vm.box_url = "http://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/opscode_centos-7.2_chef-provisionerless.box"

    # IPアドレスの設定
    config.vm.network :private_network, ip: "192.168.33.15"

    # vagrant-omnibusの有効化
    config.omnibus.chef_version = :latest

    config.vm.provision :chef_solo do |chef|
        chef.cookbooks_path = ["./cookbooks", "./site-cookbooks"]
        chef.run_list = %w[
            recipe[yum-epel]
            recipe[apache]

        ]
    end
end
ーーーーーーーーーーーーーーーーーーーーーーーーー

 

12. vagrant-omnibusプラグインをインストール
* BentoのboxにはChef SoloおよびChef Clientが含まれていないため、
  仮想サーバ起動時に自動インストールされるようにvagrant-omnibusという
  Vagrantのプラグンをインストールしておく。
vagrant plugin install vagrant-omnibus

 

13. 仮想サーバの起動とプロビジョニングを実行
vagrant up --provision

※ブラウザでhttp://192.168.33.15にアクセスし疎通確認をすること。

 

14. PHPをインストール
* PHPの導入に伴い、PHP-FPMのインストールを行う。
  Apacheと同様にknifeコマンドを使ってクックブックのひな形を作成する。
chef generate cookbook site-cookbooks/php-env

  

15. PHPのレシピを作成
* site-cookbooks/php-env/recipes/default.rbに以下内容を記述。
  PHP5.5から標準バンドルされたPHPの動作を高速化するためのキャッシュモジュールである
  OPcacheが一緒にインストールされるように設定しておく。
ーーーーーーーーーーーーーーーーーーーーーーーーー
%w{php-fpm php-pecl-zendopcache}.each do |pkg|

    package pkg do
        action :install
        notifies :restart, "service[php-fpm]"
    end
end

service "php-fpm" do
    action [:enable, :start]
end
ーーーーーーーーーーーーーーーーーーーーーーーーー

  

16. PHP7.2をインストールするレシピを作成
* yumの標準リポジトリではPHP7.2は提供されていないため、
  外部リポジトリであるRemiからイントールするようにレシピを作成する。

* yumにremiリポジトリを追加して、PHP7.2をインストールするレシピを作成し、
  php-envクックブックのrecipesフォルダphp72.rbに追加する。

* site-cookbooks/php-env/recipes/php72.rbに以下内容を記述。
ーーーーーーーーーーーーーーーーーーーーーーーーー

yum_repository 'remi' do
  description 'Les RPM de Remi - Repository'
  baseurl 'http://rpms.famillecollet.com/enterprise/7/remi/x86_64/'
  gpgkey 'http://rpms.famillecollet.com/RPM-GPG-KEY-remi'
  fastestmirror_enabled true
  action :create
end

yum_repository 'remi-php72' do
  description 'Les RPM de remi de PHP 7.2 pour Enterprise Linux 7'
  baseurl 'http://rpms.famillecollet.com/enterprise/7/php72/$basearch/'
  gpgkey 'http://rpms.famillecollet.com/RPM-GPG-KEY-remi'
  fastestmirror_enabled true
  action :create
end

# 関連パッケージのインストール
%w{
  php
  php-fpm
  php-opcache
  php-devel
  php-mbstring
  php-mcrypt
  php-mysqlnd
  php-phpunit-PHPUnit
  php-pecl-xdebug
}.each do |pkg|
  package pkg do
    action :install
    options "--enablerepo=remi"
  end
end

# PHPサンプルページ
template "phpinfo.php" do
  path "/var/www/html/local.develop.co.jp/htdocs/phpinfo.php"
  owner "apache"
  group "apache"
  mode 0644
  notifies :restart, 'service[httpd]'

end

ーーーーーーーーーーーーーーーーーーーーーーーーー

 

17. PHP7.2のテンプレートを作成
*  templatesディレクトを作成する
mkdir -p site-cookbooks/php-env/templates/default

* site-cookbooks/php-env/templates/default/phpinfo.php.erb に以下内容を記述。
ーーーーーーーーーーーーーーーーーーーーーーーーー
<?php phpinfo(); ?>
ーーーーーーーーーーーーーーーーーーーーーーーーー

   

18. Berksfileにphp-envを追記
* 最後に、Berksfileに以下一文を追記しておく。

cookbook "php-env", path: "./site-cookbooks/php-env"

  

19. プロビジョニングを再実行
berks vendor ./cookbooks

 

20. Vagrantfileにphp-envを追記
* php-envクックブックを実行するようにVagrantfileを編集する。

ーーーーーーーーーーーーーーーーーーーーーーーーー

# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
    config.vm.box = "opscode-centos-7.2"
    config.vm.box_url = "http://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/opscode_centos-7.2_chef-provisionerless.box"

    # IPアドレスの設定
    config.vm.network :private_network, ip: "192.168.33.15"

    # vagrant-omnibusの有効化
    config.omnibus.chef_version = :latest

    config.vm.provision :chef_solo do |chef|
        chef.cookbooks_path = ["./cookbooks", "./site-cookbooks"]
        chef.run_list = %w[

            recipe[yum-epel]
            recipe[apache]

            recipe[php-env::php72]
        ]

    end
end
ーーーーーーーーーーーーーーーーーーーーーーーーー

 

21. 仮想サーバの起動とプロビジョニングを実行
vagrant up --provision

 

22. hostsの設定
* ローカルPCの C:\Windows\System32\drivers\etc\hosts に以下を追記。
192.168.33.12   local.develop.co.jp
 

23. phpinfoを表示する
* ブラウザでhttp://local.develop.co.jp/phpinfo.phpにアクセス。

  PHP7.2の情報が表示されることを確認。

  

24. MySQLをインストール
オープンソースRDBMSMySQLを扱うクックブックを作成する。

chef generate cookbook site-cookbooks/mysql

 

25. MySQLのレシピを作成
site-cookbooks/mysql/recipes/default.rbに以下を追記。 
ーーーーーーーーーーーーーーーーーーーーーーーーー

remote_file "#{Chef::Config[:file_cache_path]}/mysql-community-release-el7-5.noarch.rpm" do
  source 'http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm'
  action :create
end

rpm_package 'mysql-community-release' do
  source "#{Chef::Config[:file_cache_path]}/mysql-community-release-el7-5.noarch.rpm"
  action :install
end

package "mysql-server" do
  action :install
end

template "my.conf" do
  path "/etc/my.conf"
  owner "root"
  group "root"
  mode 0644
end

service "mysqld" do
  action [ :enable, :start ]
end
ーーーーーーーーーーーーーーーーーーーーーーーーー

 

26. MySQLのテンプレートを作成
* templatesディレクトを作成する
mkdir -p site-cookbooks/mysql/templates/default

* site-cookbooks/mysql/templates/default/my.conf.erb に以下内容を記述。

ーーーーーーーーーーーーーーーーーーーーーーーーー

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

#log=/var/log/mysql.log

#default-character-set=utf8
character-set-server=utf8
skip-character-set-client-handshake

innodb_file_per_table
innodb_buffer_pool_size=64M
innodb_log_file_size=16M
innodb_log_files_in_group=2

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

ーーーーーーーーーーーーーーーーーーーーーーーーー

27. Berksfileにmysqlを追記
* Berksfileに以下一文を追加しておく。
cookbook "mysql", path: "./site-cookbooks/mysql"

 

28. プロビジョニングを再実行
berks vendor ./cookbooks

 

29. VagrantfileにMySQLを追記
* mysqlクックブックを実行するようにVagrantfileを編集する。

ーーーーーーーーーーーーーーーーーーーーーーーーー

# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
    config.vm.box = "opscode-centos-7.2"
    config.vm.box_url = "http://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/opscode_centos-7.2_chef-provisionerless.box"

    # IPアドレスの設定
    config.vm.network :private_network, ip: "192.168.33.15"

    # vagrant-omnibusの有効化
    config.omnibus.chef_version = :latest

    config.vm.provision :chef_solo do |chef|
        chef.cookbooks_path = ["./cookbooks", "./site-cookbooks"]
        chef.run_list = %w[
            recipe[yum-epel]
            recipe[apache]

            recipe[php-env::php72]
            recipe[mysql]
        ]

    end
end
ーーーーーーーーーーーーーーーーーーーーーーーーー

 

30. 仮想サーバの起動とプロビジョニングを実行
vagrant up --provision

 

31. その他のパッケージをインストール
* その他、必要なパッケージをインストールするクックブックを作成する。
chef generate cookbook site-cookbooks/package

  

32. その他のパッケージのレシピを作成
site-cookbooks/package/recipes/default.rbに以下を追記。 
ーーーーーーーーーーーーーーーーーーーーーーーーー

%w{
  fping
  iksemel
  net-snmp-libs
  curl
  unixODBC
  OpenIPMI-libs
  libssh2
  vim
  mlocate
}.each do |pkg|
  package pkg do
    action :install
  end
end

file "/etc/localtime" do
  content IO.read("/usr/share/zoneinfo/Japan")
end

ーーーーーーーーーーーーーーーーーーーーーーーーー

 

33. Berksfileにpacを追記
* Berksfileに以下一文を追加しておく。
cookbook "package", path: "./site-cookbooks/package"

 

34. プロビジョニングを再実行
berks vendor ./cookbooks

 

35. Vagrantfileにpackageを追記
* packageクックブックを実行するようにVagrantfileを編集する。

ーーーーーーーーーーーーーーーーーーーーーーーーー

# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
    config.vm.box = "opscode-centos-7.2"
    config.vm.box_url = "http://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/opscode_centos-7.2_chef-provisionerless.box"

    # IPアドレスの設定
    config.vm.network :private_network, ip: "192.168.33.15"

    # vagrant-omnibusの有効化
    config.omnibus.chef_version = :latest

    config.vm.provision :chef_solo do |chef|
        chef.cookbooks_path = ["./cookbooks", "./site-cookbooks"]
        chef.run_list = %w[
            recipe[yum-epel]
            recipe[apache]

            recipe[php-env::php72]
            recipe[mysql]
            recipe[package]
        ]

    end
end
ーーーーーーーーーーーーーーーーーーーーーーーーー

 

36. 仮想サーバの起動とプロビジョニングを実行
vagrant up --provision