Vagrant+Virtualboxを使いWindows10上にCentOS7.3+php7+MySQL5.7の環境を構築する

# はじめに

VirtualBOXでも同じ環境を複製する場合は、Vagrant+chefが便利ということなので、CentOSサーバの環境を構築してみた。以下の確認環境は Windows10 Home 64bit。

# Vagrant / VirtualBoxのインストール

## VirtualBoxのインストール

VirturlBOXのダウンロードページ https://www.virtualbox.org/wiki/Downloads から、WIndows 版をダウンロードしインストールを実行。記入時点では Vitualbox-5.1.22。

## Vagrant 本体のインストール

Vagrant は https://www.vagrantup.com/downloads.html から vagrant-1.9.5 の Windows版をダウンロードしてイントール実行。実行後、コマンドプロンプトで vagrant -v でバージョンを確認。

## Vagrant プラグインのインストール

コマンドプロンプトからomnibusプラグインをインストールします。これは、起動時にChef Client/Chef Soloを確認、無ければ自動でインストールを行うプラグインです。他にも sahara 等便利なプラグインもあります。

```
> vagrant plugin install vagrant-omnibus
```

念のためバージョンとインストールされたプラグインを確認

```
>vagrant -v
Vagrant 1.9.5

>vagrant plugin list
vagrant-omnibus (1.5.0)
vagrant-share (1.1.8, system)
```

# 仮想マシンの準備

## 利用するBOXのダウンロード

~~centOS-7.2のBOXは、http://www.vagrantbox.es/ から選択。コマンドプロンプトを立ち上げて以下を実行。~~

```
> vagrant box add CentOS72 https://github.com/CommanderK5/packer-centos-template/releases/download/0.7.2/vagrant-centos-7.2.box
```

最新の CentOS-7.3にするため、[Vagrant Cloud](https://app.vagrantup.com/boxes/search)から、[bento/centOS-7.3
(https://app.vagrantup.com/bento/boxes/centos-7.3)](https://app.vagrantup.com/bento/boxes/centos-7.3) に変更。以下のコマンドでboxに追加。

~~~
vagrant box add bento/centos-7.3  --provider virtualbox
~~~

ダウンロードにしばらく時間がかかります。

## Vagrant の設定

任意のフォルダを作り以下を実行

```
> mkdir mycentos
> cd mycentos
> vagrant init bento/centos-7.3
```

実行したディレクトリに設定ファイル Vagrantfile ができる。

## Vagrantfileの変更

作成された環境設定ファイル Vagrantfile ファイルを編集します。
以下の部分のコメントを外す

* IPアドレスの設定
 
```rb
  config.vm.network "private_network", ip: "192.168.33.10"
```

* プラグインomnibusの利用

```rb
   # vagrant-omnibus
   # config.omnibus.chef_version = :latest
     config.omnibus.chef_version = 3.13
```

プロプロビジョニング毎に最新をインストールしにいくのでバージョンを指定したが、latestにしておく方が安心かもしれない。

## 仮想マシンの起動

ここまでの設定で仮想マシンが起動できるか確かめます。

```
vagrant up
```

かなり時間がかかります

## ログイン

適当なSSHクライアントから、上で設定したIPアドレスにログインできることを確かめます。
ID/PASS : vagrant/vagrant でログインします。

## 仮想マシンの停止

```　
vagrant halt
```

VirtualBoxマネージャで見ると「電源オフ」と表示されます。

# 仮想マシンの設定

## 外部リポジトリの追加

最新のphpやMySQLをインストールするために、epel及びremiリポジトリを追加し

site-cookbooks/yum_repo/recipes/default.rb

~~~rb
# epel-repository
yum_package "epel-release" do
    action :install
end

# remi-repository
execute "yum-repo" do
  user 'root'
  command 'yum -y install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm'
  creates "/etc/yum.repos.d/remi.repo"
end
~~~

## PHP7 + Composer のインストール

site-cookbooks/php/recipes/default.rb

```rb
# php7
package 'php' do
  flush_cache [:before]
  action :install
  options "--enablerepo=remi --enablerepo=remi-php71"
end

%w(php-openssl php-common php-mbstring php-xml).each do |pkg|
  package pkg do
    action :install
    options "--enablerepo=remi --enablerepo=remi-php71"
  end
end

# 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
```

## Apacheのインストール＆起動

Apacheの設定ファイルを予めテンプレートに用意しておき、CentOSにコピーします。

site-cookbooks/http/recipes/default.rb

```rb
yum_package "httpd" do
    action :install
end

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

service "httpd" do
    action :start
end
```

site-cookbooks/http/templates/default/test.conf.erb の例。必要な設定をここに含めておけばOK。

```
alias /test/ /home/vagrant/public/

<Directory /home/vagrant/public/>
  AllowOverride all
  Require all granted
</Directory>
```

## MySQLのインストール＆起動

site-cookbooks/mysql/recipes/default.rb

```rb
remote_file "#{Chef::Config[:file_cache_path]}/mysql-community-release-el7-11.noarch.rpm" do
  source 'https://repo.mysql.com/mysql57-community-release-el7-11.noarch.rpm'
  action :create
end
rpm_package 'mysql57-community-release' do
  source "#{Chef::Config[:file_cache_path]}/mysql-community-release-el7-11.noarch.rpm"
  action :install
end
package "mysql-community-server" do
  action :install
end
service "mysqld" do
  supports :status => true, :restart => true, :reload => true
  action [ :enable, :start ]
end
```

**別途データベースの初期設定が必要、MySQL57の初期rootパスワード取得を調べ中**

## 必要なパッケージのyumインストール

nano 
emacs は趣味です。

site-cookbooks/yuminstall/recipes/default.rb

```rb
%w(git nano emacs).each do |pkg|
  package pkg do
    action :install
    options "--enablerepo=remi --enablerepo=remi-php71"
  end
end
```

## （番外）yum update 実行

site-cookbooks/yumupdate/recipes/default.rb

```rb
execute "yum-update" do
  user "root"
  command "yum -y update"
  action :run
end
```

## Vagrantfileに実行設定を追加

./Vagrantfile　に以下の記述を追加。

```
    config.vm.provision "chef_solo" do |chef|

      chef.cookbooks_path = "./site-cookbooks"
      chef.add_recipe "yum_repo"
      chef.add_recipe "yumupdate"
      chef.add_recipe "http"
      chef.add_recipe "php"
      chef.add_recipe "mysql"
    end
```

## 仮想サーバに反映

仮想サーバを再起動し、設定を反映します。

```
>vagrant reload --provision
```

処理が完了したら、再度sshログインして所定の設定ができていることを確認する
エラーがでたらどこかでタイプミスをしている可能性が高いです。

# 設定情報の共有

これから以下のを事をして開発環境をそろえる

* 各種設定やテスト用データベースの自動登録レシピを追加。
* git で共有し、git clone / vagrant up で開発環境完成の状態にする。

## 共有フォルダのマウントエラー対応

yum updete 後に、vagrant コマンドで下のようなエラーが発生しました。

~~~
Vagrant was unable to mount VirtualBox shared folders. This is usually
  <snip>
Vagrant box. For context, the command attempted was:

mount -t vboxsf -o uid=1000,gid=1000 vagrant /vagrant

The error output from the command was:

/sbin/mount.vboxsf: mounting failed with the error: No such device
~~~

yum updateにより、カーネルが更新されしまい、ディレクトリ共有を行うVirtualboxGuestAdditionのバージョンが, ホストとゲストでずれることによって発生するようです。これを解消するためにプラグインを導入します。

~~~
vagrant plugin install vagrant-vbguest
~~~

# 参考

あちこちを参考にさせてもらいましたが、古いものはそのままではダメで、適切に読み変える必要があります。

* http://box406.hatenablog.com/entry/2013/06/01/010715
* http://asobo.hatenablog.jp/entry/2016/01/17/114807
* http://qiita.com/ozawan/items/160728f7c6b10c73b97e
* http://qiita.com/Esfahan/items/8f47382e9e712253feee
* http://www.asnm4.com/2014/09/chef%E3%81%A7yum-update%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E6%89%8B%E9%A0%86/