VagrantfileとShellだけでLAMP環境を構築する(CentOS6.7,Apache2.2,PHP5.6,MySQL5.6)

# きっかけ

Vagrantはちょこちょこ使ってたんですが、毎回同じようなvagant boxを作ってbox共有してました。。。
boxだと容量デカイし後からパッケージや設定を追加して結局みんなバラバラの開発環境になっていくのを何度も経験し、どげんかせんといかんということで作ってみました。

# Ansibleあるじゃん

ええ。。あるんですがね。。。
とりあえず1つのplaybookにゴリゴリ書いて後からrole振ってvarsも外出ししてなんて思ったりもしてたんですが、いかんせん作るまでが面倒臭すぎたうえに、書き方覚えて共有して、なんて言ってたらコストがどんどん高くなりそうだなと思い断念しました。
そもそもLAMPくらいの環境で使う必要ないですよね（開き直り

# ざっくり概要

## 構成

まず、ファイル構成はこんな感じです。

```
.
├── Vagrantfile
├── index.php
├── info.php
└── provision
    ├── httpd
    │   └── httpd.conf
    ├── mysql
    │   └── my.conf
    ├── php
    │   └── php.ini
    └── provision.sh
```

それぞれのファイルを簡単に説明します。

### Vagrantfile

Vagrantの基本的な設定を書いてます。
初回のvagrant up時にprovision/provision.shを呼んでます。

```:Vagrantfile
Vagrant.configure("2") do |config|

    config.vbguest.auto_update = false

    # 対象box設定
    config.vm.box = "centos67"
    config.vm.box_url = "https://github.com/CommanderK5/packer-centos-template/releases/download/0.6.7/vagrant-centos-6.7.box"

    # 外部から接続するIP
    config.vm.network "private_network", ip: "192.168.33.100"

    # CPU,メモリーサイズ
    config.vm.provider "virtualbox" do |vb|
        vb.cpus = 2
        vb.memory = 1024
    end

    # 共有フォルダの指定
    config.vm.synced_folder ".",
                            "/var/www/html",
                            :mount_options => ["dmode=775,fmode=775"]

    # [初回のみ]必要なパッケージのインストール等初期設定
    config.vm.provision :shell, :path => "provision/provision.sh"

    # シンボリックリンクがうまくいかずhttpdが自動起動しない場合の対策
    config.vm.provision :shell, run: "always", :inline => <<-EOT
        service httpd restart
    EOT

end
```
### provision/provision.sh

初回起動時に実行するコマンド群です。
パッケージごとにファイル分けようかとも思ったんですが、パッと見の見た目より実運用重視で考えて1つにまとめてます。
コメントが日本語なところは。。苦笑

```shell-session:provision/provision.sh
#!/bin/sh

echo -------------------------------------------------
echo
echo                    基本設定
echo
echo -------------------------------------------------

echo -------------------------------
echo
echo historyフォーマット設定
echo
echo -------------------------------

HISTTIMEFORMAT='%y/%m/%d %H:%M:%S ';

echo -------------------------------
echo
echo タイムゾーン設定
echo
echo -------------------------------

echo cp /usr/share/zoneinfo/Japan /etc/localtime

echo -------------------------------
echo
echo remiレポジトリ取得
echo
echo -------------------------------

curl -OL http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

echo -------------------------------------------------
echo
echo                    Apache設定
echo
echo -------------------------------------------------

echo -------------------------------
echo
echo Apacheインストール
echo
echo -------------------------------

yum -y localinstall remi-release-6.rpm
yum -y install httpd httpd-devel

echo -------------------------------
echo
echo Apache自動起動設定
echo
echo -------------------------------

chkconfig httpd on

echo -------------------------------
echo
echo Apache関連設定ファイル書き換え
echo
echo -------------------------------

mv /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.bk
cp /var/www/html/provision/httpd/httpd.conf /etc/httpd/conf/httpd.conf

echo -------------------------------------------------
echo
echo                    MySQL設定
echo
echo -------------------------------------------------

echo -------------------------------
echo
echo MySQLインストール
echo
echo -------------------------------

curl -OL http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
yum -y localinstall mysql-community-release-el6-5.noarch.rpm
yum -y install mysql mysql-devel mysql-server
mv /usr/my.conf /usr/my.conf.bk
cp /var/www/html/provision/mysql/my.conf /usr/my.conf

echo -------------------------------
echo
echo MySQLDB作成、初期パスワード設定
echo
echo -------------------------------

mysql -uroot -e "GRANT ALL PRIVILEGES ON *.* TO root@\"%\" IDENTIFIED BY 'root' WITH GRANT OPTION;"
mysql -uroot -e "FLUSH PRIVILEGES;"
mysql -uroot -e "create database testdb;"

echo -------------------------------------------------
echo
echo                    PHP設定
echo
echo -------------------------------------------------

echo -------------------------------
echo
echo PHPインストール
echo
echo -------------------------------

yum -y install --enablerepo=remi,remi-php56 php php-mysql php-xml php-pear php-pdo php-cli php-mbstring php-gd php-mcrypt php-common php-devel php-bcmath
mv /etc/php.ini /etc/php.ini.bk
cp /var/www/html/provision/php/php.ini /etc/php.ini

echo -------------------------------
echo
echo xdebugインストール
echo
echo -------------------------------

wget http://www.xdebug.org/files/xdebug-2.3.3.tgz
tar xzvf xdebug-2.3.3.tgz
cd xdebug-2.3.3/
phpize
./configure --enable-xdebug
make
make install

echo -------------------------------------------------
echo
echo                    ビルド用ツール設定
echo
echo -------------------------------------------------

echo -------------------------------
echo
echo Gitインストール composer用
echo
echo -------------------------------

yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
yum -y install perl-ExtUtils-MakeMaker
cd /usr/local/src/
wget https://www.kernel.org/pub/software/scm/git/git-2.9.3.tar.gz
tar xzvf git-2.9.3.tar.gz
cd git-2.9.3
make prefix=/usr/local all
make prefix=/usr/local install
echo ----- git version
echo | git --version
echo -----

echo -------------------------------
echo
echo composerインストール
echo
echo -------------------------------

curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
echo ----- composer version
echo | /usr/local/bin/composer --version
echo -----

echo -------------------------------
echo
echo nodejs,npmインストール
echo
echo -------------------------------

yum -y install nodejs npm
echo ----- node version
echo | node --version
echo -----
echo ----- npm version
echo | npm --version
echo -----
```

### provision配下の各種ファイル

パッケージインストール時に出来上がったファイルを退避させ、provision配下に置かれたファイルを上書きしてます。

### **.php

テスト用です。

# 使い方

1. Vagrantfileと同じ場所で `vagrant up` を行う
1. （実作業なし）Vagrantfileが読み込まれ、初回のみprovision/provision.shが走る(けっこう時間かかります)
1. （実作業なし）provision内の各ファイルが設定される(マウントではなく初回実行時にコピー)
1. （実作業なし）VMが出来あがる
1. https://192.168.33.100 にアクセスする
1. アクセス出来てればOK

# サンプル

[こちら](https://github.com/TsukasaGR/vagrant-lamp)にサンプルを置いてます。