Vagrant+Chefを使ってVirtualBoxにLAMP開発環境を作りCakePHPのマイグレーションをかける。


今年、先生から出された課題が「Vagrantを使った開発環境の構築」で、その成果をまとめます。
最初に言われた時は「Vagrantって何？え？？何者なん？？というか<font color="red">環境構築とか大嫌いなんだけど！</font>」と思いつつ、この半年くらいの土日はチョコチョコと調査&作業をしていた形です。
開発環境としてはMacを使っています。

#Vagrant
## Vagrantインストール
下記のサイトからインストールのためのファイルをダウンロードしてインストール。
https://www.vagrantup.com/downloads.html

#Omnibusをインストール
vagrantを起動する時にChefが入っているか確認してインストールするvagrant-omnibusをインストールしておきます。
`vagrant plugin install vagrant-omnibus`

##VagrantのBoxを作成する
最初にVagrant環境を作るのに必要なBoxを下記コマンドで作成します。
`vagrant init <BOXの名前> <パス/BOXファイル>`
使用するBOXファイルについては貰い物でも自分が作成した環境をエクスポートしたヤツでも良いですが、下記サイトの中から見つけたものにするのも可能です。
http://www.vagrantbox.es/
このサイトからBoxファイルを取得する場合には、以下のようなコマンドになります。
`vagrant init NewChefTest http://puppet-vagrant-boxes.puppetlabs.com/centos-64-x64-vbox4210.box`

##Vagrantfileを書く
Vagrantを起動する際に必要なVagarntfileを作成します。

```rb:Vagrantfile
Vagrant.configure(2) do |config|
	#使用するBoxの名前
	config.vm.box = "NewChefTest"
	# sshポートフォワーディングを設定する
	config.ssh.forward_agent = true
	# BOXを入れる際に使用したBOXのパス
	config.vm.box_url = "http://puppet-vagrant-boxes.puppetlabs.com/centos-64-x64-vbox4210.box"
	#VirtualBoxの設定
	config.vm.provider "virtualbox" do |vb|
		#VirtualBox上の名前
		vb.name = "NewCentOS"
	end
	#vagrant環境の80ポートをホスト環境の8080ポートに繋げる。
	config.vm.network :forwarded_port, guest: 80, host: 8080
	#ホストオンリーアダプター
	config.vm.network "private_network", ip: "192.168.33.10"
	# ChefをVMにインストールするプラグイン
	config.omnibus.chef_version = "12.0.3"
	# Chefの設定
	config.vm.provision "chef_solo" do |chef|
		# cookbooksの場所を指定します
		chef.cookbooks_path = "./Chef"
		# SetUpCentOSという名前のCookBookを適用
		chef.run_list = %w[recipe[SetUpCentOS]]
	end
end
```

# Chef
## Chef Solo をインストール
下記のサイトからインストールのためのファイルをダウンロードしてインストール。
https://downloads.chef.io/chef-dk/ 

## knifeSolo をインストール
下記のサイトに従ってKnife-soloをインストール。
http://matschaffer.github.io/knife-solo/

## Cookbookを作成
作業フォルダ内で`knife cookbook create <cookbook名> -o <作成先ディレクトリ>`でcookbookを作成します。
cookbook名はVagrantfileの「chef.run_list」で設定したcookbook名に、作成先ディレクトリはVagrantFileの「chef.cookbooks_path」で設定したディレクトリにします。
`knife cookbook create SetUpCentOS -o Chef`


## recipeを書く
大事なrecipeを書きます。これに色々な設定やらインストールやらの記述をします。
recipeファイルはcookbook内の`recipes/default.rb`に記載します。
また、CentOS内に配置するファイルは`files/default`の中に配置してます。

###Apache・mysqlなどをインストール
packageでインストールします。yumでインストールできるものは`yum_`を付けてインストールします。何がyumでインストール出来て何が出来ないかは、よく分からない…。

```rb
yum_package "httpd"
yum_package "git"
yum_package "php"
yum_package "php-common"
yum_package "php-mbstring"
yum_package "php-xml"
yum_package "php-devel"
yum_package "php-process"
yum_package "php-cli"
yum_package "php-pear"
yum_package "php-mysql"
yum_package "mysql-server"
yum_package "openssh"
yum_package "openssh-server"
```

### Gitリポジトリの取得
開発に必要なリポジトリをcloneしてきます。

- publicリポジトリ<br />
公開されているリポジトリに関しては、特に特殊な処理は必要ありません。今回は、この後CakePHPのマイグレーションに必要なリポジトリをcloneしてみます。

```rb
git "・・・・/app/Plugin/Migrations" do
  repository "https://github.com/CakeDC/migrations.git"
  revision "master"
  action :sync
end
```

- privateリポジトリ<br />
この場合は、少し工夫が必要です。手順としては、

1. 公開鍵を作成する
1. その鍵を予め自分の鍵として登録しておく
2. その鍵を仮想環境内に配置する

という作業が必要になってきます。
下記のような処理になります。

```rb
# 用意しておいた公開鍵・秘密鍵をサーバに移行する
directory "/root/.ssh" do
  action :create
  mode   "700"
end
cookbook_file "/root/.ssh/id_rsa" do
  source "id_rsa"
  mode   "600"
end
file "/root/.ssh/privateRepository.sh" do
  mode "700"
  content <<-EOL
    #!/bin/bash
    ssh -i /root/.ssh/id_rsa -o "StrictHostKeyChecking=no" "$@"
  EOL
end

# リポジトリclone
git <クローンする先のパス> do
  repository <リポジトリのＵＲＬ>
  revision "master"
  action :sync
  ssh_wrapper "/root/.ssh/privateRepository.sh"
end
```

こちらのサイトをもとに処理を作成しました。
http://ikosin.hatenablog.com/entry/2014/09/12/121612

### CakePHPのパーミッション設定 (tmp)
CakePHPといえばtmpのパーミッション設定はかかせない作業です。
単純に１つのディレクトリのパーミッションを設定するのならば、以下のような形で良いです。

```rb
directory "・・・/app/tmp" do
  owner 'vagrant'
  group 'apache'
  mode "777"
end
```
ですが、何個もこのような記載をしていると、かなり長文になってしまいます。
そういう場合は、このように記載できます。

```rb
permissions = [
	"/var/www/html/・・・", 
	"/var/www/html/・・・/app/tmp", 
	"/var/www/html/・・・/app/tmp/cache",
	"/var/www/html/・・・/app/tmp/cache/persistent" ,
	"/var/www/html/・・・/app/tmp/cache/models",
	"/var/www/html/・・・/app/tmp/logs"
]
permissions.each do |path|
  directory path do
   owner 'apache'
   group 'apache'
   mode "757"
  end
end
```
### マイグレーションをする
マイグレーションを行います。そのためには「PHPの時刻設定」「データベース作成」が必要なので、その処理を作っていきます。

- mysqlサーバの起動<br />
マイグレーション作業に必要になるのでMySQLサーバを立ち上げます。

```rb
service "mysqld" do
    # OSブート時のサービス有効をenabled,:startでサービスを起動
    action [ :enable, :start ] 
end
```


- php.iniの時刻設定<br />
 あらかじめphp.iniを書いておき、そのファイルを配置します。

```rb:
cookbook_file "/etc/php.ini" do
  source "php.ini"
  mode   "644"
end
```

- データベース作成<br />
 必要なデータベースを作成します。下記のようなSQLファイルを用意しておき、それを実行します。

```sql:createDatabase.sql
CREATE DATABASE <データベース名>;
```

このSQLファイルを実行します。

```rb:
execute "create_db" do
  command "mysql -uroot  < ・・・/createDatabase.sql"
  user "root"
end
```

- マイグレーション実行<br />
マイグレーション実行処理の記述は以下です。

```rb
bash "migration" do
  cwd "・・・/app"
  code <<-EOH
    ./Console/cake Migrations.migration status
    ./Console/cake Migrations.migration run all
  EOH
end
```

### Webサーバの設定・起動
最後にWebサーバの設定・起動を行います。

- iptablesの設定<br />
iptablesは開発環境でもあるし無効にしてしまいます。本番サーバとかでは、ちゃんと設定しましょうね。

```rb
service 'iptables' do
 # OSブート時のサービス有効をdisable,:stopでサービス停止
  action [:disable, :stop]
end
```

- Apacheの起動<br />
Apacheの起動処理を書きます。以下の記載です。

```rb
service "httpd" do
   # OSブート時のサービス有効をenabled,:startでサービスを起動
  action [ :enable, :start ]
end
```

以上のことを踏まえて記載したレシピがこちらです。

```rb:recipes/default.rb
#
# Cookbook Name:: Chef
# Recipe:: default
#
# Copyright 2015, hoge
#
# All rights reserved - Do Not Redistribute
#

# 1. Apacheとmysqlとgitをインストール
yum_package "httpd"
yum_package "git"
yum_package "php"
yum_package "php-common"
yum_package "php-mbstring"
yum_package "php-xml"
yum_package "php-devel"
yum_package "php-process"
yum_package "php-cli"
yum_package "php-pear"
yum_package "php-mysql"
yum_package "mysql-server"
yum_package "openssh"
yum_package "openssh-server"

# 2. 用意しておいた公開鍵・秘密鍵をサーバに移行する
directory "/root/.ssh" do
  action :create
  mode   "700"
end
cookbook_file "/root/.ssh/id_rsa" do
  source "id_rsa"
  mode   "600"
end
file "/root/.ssh/privateRepository.sh" do
  mode "700"
  content <<-EOL
    #!/bin/bash
    ssh -i /root/.ssh/id_rsa -o "StrictHostKeyChecking=no" "$@"
  EOL
end

# 3.リポジトリclone
# private
git "/var/www/html/・・・" do
  repository <リポジトリのＵＲＬ>
  ssh_wrapper "/root/.ssh/privateRepository.sh" #privateリポジトリの際に記載
end
# public
git "/var/www/html/・・・/app/Plugin/Migrations" do
  repository "https://github.com/CakeDC/migrations.git"
  revision "master"
  action :sync
end

# 4./var/www/html/以下のパーミッションを設定
permissions = [
	"/var/www/html/・・・", 
	"/var/www/html/・・・/app/tmp", 
	"/var/www/html/・・・/app/tmp/cache",
	"/var/www/html/・・・/tmp/cache/persistent" ,
	"/var/www/html/・・・/tmp/cache/models",
	"/var/www/html/・・・/tmp/logs"
]
permissions.each do |path|
  directory path do
   owner 'apache'
   group 'apache'
   mode "757"
  end
end

# 5.マイグレーション設定
#mysql起動
service "mysqld" do
    # OSブート時のサービス有効をenabled,:startでサービスを起動
    action [ :enable, :start ] 
end
# php.iniの時刻設定
cookbook_file "/etc/php.ini" do
  source "php.ini"
  mode   "644"
end
#データベース作成
cookbook_file "/var/www/html/・・・/createDatabase.sql" do
  source "createDatabase.sql"
  mode   "600"
end
execute "create_db" do
  command "mysql -uroot  < /var/www/html/・・・/createDatabase.sql"
  user "root"
end
#マイグレーション
bash "migration" do
  cwd "/var/www/html/・・・/app"
  code <<-EOH
    ./Console/cake Migrations.migration status
    ./Console/cake Migrations.migration run all
  EOH
end

# 6.web設定
#iptables無効
service 'iptables' do
 # OSブート時のサービス有効をdisable,:stopでサービス停止
  action [:disable, :stop]
end
#apache起動
service "httpd" do
   # OSブート時のサービス有効をenabled,:startでサービスを起動
  action [ :enable, :start ]
end

```

# 起動する
上記の作業が終わったら、Vagrantfileがあるディレクトリで`vagrant up`コマンドを打ってvagrantを起動してください。
しばらくしたら、環境が出来上がっているはずです。

# 環境にログインする
無事に起動したら`vagrant ssh`でログインします。
最初はvagrantユーザでログインになっています。rootで作業したい場合には`su`を打ってください。初期パスワードは`vagrant`です。
なお、他に使う頻度の多いコマンドは以下に書きます。他にも、わんさかありますが。

- vagrant環境を停止 → `vagrant halt`
- vagrant環境を削除 → `vagrant destroy`

***

最初はイヤイヤだったにせよ、今は色々勉強になって良かったかなと思います。
**『こぉぉぉのポンコツがぁぁぁぁっ！！！:pig_nose:』**と言われながらも頑張りました。
まだまだ至らないところも多いので、**優しい**意見・感想は大歓迎です。