Virtualbox + Vagrant + Ansible + laravel の環境構築

#LAMP環境でlaravelを使用する
laravelを使用するため、仮想環境にLAMP環境を構築します
正直詳しくは分かっていないので、とりあえず使えるという程度の記事です。

##必要なソフトの準備
###Virtualbox
仮想環境を作成するソフトです。
ダウンロードは<a>https://www.virtualbox.org/</a>から
windowsの方は　windows hosts
macの方は　OS X hosts
からダウンロードしてください

###Vagrant
仮想環境の管理を行うツールです。
ダウンロードは<a>https://vagrantup/com/</a>から

###vagrant-vbguest
vagrant起動時に、ホストとゲストのversion違いを修正します。
インストールはターミナルから行います

```
$ vagrant plugin install vagrant-vbguest
```


###Ansible
構成管理ツールと呼ばれるもので、細かい設定が行えます。
インストールはターミナルから行います

```
$ brew install ansible
```

##Vagrantfileの設定
まずはvagrantの設定を行います

```
#　vagrantの初期化
$ vagrant init
```

初期化により、新たにVagrantfileが作成されます。
変更する箇所は、下記の部分です。

```:Vagrantfile
(15行目) config.vm.box = "centos/7"
　# centOS7を使用する
(35行目) config.vm.network "private_network", ip: "192.168.33.10"
　# アクセスするIPアドレス
(46行目) config.vm.synced_folder "./htdocs", "/var/www", type: "virtualbox"
 # 同期するディレクトリを指定。ここでは、ホストのVagrantfileと同階層のhtdocsディレクトリと、ゲスト（仮想）の/var/wwwディレクトリが同期されます。
 # type: "virtualbox"とすることで、双方向の同期が行われます。typeを指定しないとホスト→ゲストの方向のみ同期されます
(57行目) vb.memory = "256"
 # ゲストが使用するメモリを指定します。ここでは２５６MBとしています。
（最終行のend手前に追記）  
  config.vm.provision "ansible" do |ansible|
    ansible.playbook = "ansible/playbook.yml"
    ansible.inventory_path = "ansible/hosts"
    ansible.limit = 'all'
  end
 # Asinbleを使うための記述。playbook と　inventory　のファイルを指定しています。

  config.vm.provision :shell, run: "always", :inline => <<-EOT
    sudo service httpd restart
  EOT
 # Apacheの再起動を行なっています。
end (<-最終行のend)
```

##Ansibleの設定
まずはinventoryの設定から
対象となるサーバーの指定を行います

```ansible/hosts
[vagrant]
192.168.33.10
```

次に、設定ファイルを作成します

```ansible/playbook.yml
---
- hosts: all
  sudo: yes
  vars:
    mysql_user_name: vagrant
    mysql_user_password: vagrant
  tasks:
    - name: SELinuxのDisable設定
      selinux: state=disabled

    - name: add ja_JP.UTF-8 to locale
      shell: localedef -f UTF-8 -i ja_JP /usr/lib/locale/ja_JP.UTF-8

    - name: set locale
      shell: localectl set-locale LANG=ja_JP.utf8
      when: ansible_env.LANG | default('')!='ja_JP.UTF-8'

    - name: set timezone to Asia/Tokyo
      timezone:
        name: Asia/Tokyo

    - name: Install Apacheをインストール
      yum: name=httpd

    - name: Apacheを起動
      service: name=httpd state=started enabled=yes

    - name: .htaccessを有効にする
      replace:
        dest=/etc/httpd/conf/httpd.conf
        regexp='AllowOverride None'
        replace='AllowOverride All'

    - name: yum install epel-repease
      yum: name=epel-release state=installed

    - name: add remi-repo repository
      command: rpm -ih http://rpms.famillecollet.com/enterprise/remi-release-7.rpm creates=/etc/yum.repos.d/remi.repo

    - name: PHP7.2をインストール
      yum: name={{item}} enablerepo=remi,remi-php72 state=installed
      with_items:
        - php
        - php-devel
        - php-common
        - php-fpm
        - php-opcache
        - php-pecl-redis
        - php-mbstring
        - php-mcrypt
        - php-mysqlnd
        - php-pdo
        - php-gd
        - php-xml
        - php-zip
        - unzip
        - php-pecl-zip

    - name: PHPタイムゾーンの設定
      replace: >
       dest=/etc/php.ini
       regexp="^;date\.timezone ="
       replace="date.timezone = Asia/Tokyo"

    - name: MySQL5.7のリポジトリを追加
      command: >
       yum -y install http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
       creates=/etc/yum.repos.d/mysql-community.repo

    - name: MySQLをインストール
      yum: name={{item}}
      with_items:
        - mysql-server
        - MySQL-python

    - name: MySQLを起動
      service: name=mysqld state=started enabled=yes

    - name: MySQLのユーザーを追加
      mysql_user: name={{mysql_user_name}} password={{mysql_user_password}} priv=*.*:ALL

    - name: install composer
      shell: curl -sS https://getcomposer.org/installer | php -- --install-dir=/bin/ && mv /bin/composer.phar /bin/composer
      args:
        creates: /bin/composer

    - name: laravel install
      shell: composer global require "laravel/installer"
      args:
        creates: /root/.composer/vender/bin/laravel

    - name: laravel project
      shell: composer create-project "laravel/laravel" sample
      args:
        chdir: /var/www
        creates: /var/www/sample

    - name: httpd.conf 編集
      replace:
        path: /etc/httpd/conf/httpd.conf
        regexp: '^DocumentRoot "/var/www/html"'
        replace: DocumentRoot "/var/www/sample/public"

    - name: httpd.conf 編集
      replace:
        path: /etc/httpd/conf/httpd.conf
        regexp: '^\<Directory "/var/www/html"\>'
        replace: <Directory "/var/www/sample/public">
 # アクセスパスの変更、デフォルトは/var/www/html
```

nameを見てもらえれば、なんとなく何をやってるかわかると思います。

##Vagrantの起動
動作確認をします。
ターミナルにて、

```
$ vagrant up --provision
 # --provision は初回のみでOK、playbook.ymlを変更した際は再度実行する
```

実行した最後に

```
PLAY RECAP ****
```

と表示され入力画面に戻れは成功です。

この状態で<a>http://192.168.33.10/</a>にアクセスすれば、laravelのページが表示されるはずです。

vagrantの停止は、

```
$ vagrant halt
```

GitHub
https://github.com/hideiwa1/festina/tree/master/vagrant

##参考
<a>https://sinap.jp/blog/2018/10/-osapachenginxphpmysql-pc.html</a>
<a>https://qiita.com/ohuron/items/057b74a42b182b200ae6</a>