Day-to-day the memorandum

やったことのメモ書きです。

Vagrantをやってみた

VagrantでCentOS7にApache+PHP+MySQL+phpMyAdminの自動構築をやってみたのでその時のメモ(完全自分用)

VirtualBox
Vagrant

以上2点はインストールしておく。

フォルダ構成

最初にフォルダ構成を書いておこうと思います。

project
    ├─ vagrant
           ├─ bootstrap.sh
           ├─ Vagrantfile
           ├─ conf
                ├─ phpMyAdmin.conf

Vagrantの初期化

vagrant initで初期化します。
その際にBOXが必要で、下記サイトにいろいろなBOXがあるので自分が使いたいものを探します。
https://atlas.hashicorp.com/boxes/search
上記フォルダ構成のvagrantフォルダ内で下記コマンドを実行します。

$ vagrant init bento/centos-7.2

ちなみにbentoはchef社の公式BOXリポジトリらしいです。
https://atlas.hashicorp.com/bento/

また、他のサイトからBOXをDLして使えるらしいです。
その場合はbox addで使いたいBOXを追加してください。

$ vagrant box add {title} {url}
$ vagrant init {title}

Vagrantfileが作成されたと思います。

Vagrantfileの設定

このままでは外部からアクセスできないのでネットワークの設定をします。
Vagrantfileの下記のコメントを外します。

# config.vm.network "private_network", ip: "192.168.33.10"
config.vm.network "private_network", ip: "192.168.33.10"
次に同期フォルダの設定をしたいと思います。

ホストOSとゲストOS間でファイル共有をする設定を追加します。

config.vm.synced_folder "../", "/vagrant", mount_options: ['dmode=777', 'fmode=777']

ホストOSのVagrantfileがあるフォルダの1つ上のフォルダとゲストOSの/vagrantディレクトリを同期します。
同期フォルダを作ることでホストOSでファイルを変更した時にゲストOSでも反映されます。
なのでわざわざsambaを使ってマウントするということをしなくても、ホストOSで使っているIDEとかが使えるようになりますね。
mount_optionで設定しているのはパーミッションです。

次にプロビジョニングの設定をします。

ここに必要なソフトなどを自動でインストールするように書くことができます。
その設定をシェルで書くことができ、インラインで書く場合と違うファイルに書いてそれを実行する場合があります。

config.vm.provision :shell, :inline => "<実行するコマンド>"
config.vm.provision :shell, :path => "<実行するファイル>"

今回はbootstrap.shに記述していこうと思います。

atlasのBOXでinitした場合はVagantfileに以下が書いてあればいいと思います。

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

Vagrant.configure(2) do |config|
  config.vm.box = "bento/centos-7.2"
  config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.synced_folder "../", "/vagrant", mount_options: ['dmode=777', 'fmode=777']
  config.vm.provision :shell, :path => "bootstrap.sh"
end

プロビジョニングの設定ファイル

今回はApache+PHP+MySQL+phpMyAdminを自動構築するスクリプトを書いていこうと思います。
bootstrap.shに以下を記述します。

#!/usr/bin/env bash

echo '############################################################'
echo '# PROVISION START'
echo '############################################################'

#Apache
sudo yum -y install httpd
sudo systemctl start httpd.service
sudo systemctl enable httpd.service

#firewalld
sudo systemctl stop firewalld.service
sudo systemctl disable firewalld.service

#MariaDB
sudo yum -y remove mariadb*
sudo rm -rf /var/lib/mysql/

#wget
sudo yum -y install wget

#vim 
sudo yum -y install vim

#MySQL
sudo wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
sudo rpm -Uvh mysql-community-release-el7-5.noarch.rpm
sudo sed -i 's/enabled=1/enabled=0/g' /etc/yum.repos.d/mysql-community.repo
sudo yum -y --enablerepo=mysql56-community install mysql-community-server 
sudo systemctl start mysqld.service
sudo systemctl enable mysqld.service
sudo mysql -u root -e "SET PASSWORD FOR root@localhost = PASSWORD('root');"

#PHP
sudo yum -y install php php-mysql php-mbstring
sudo systemctl restart httpd.service

#phpMyAdmin
sudo yum install -y epel-release
sudo yum install --enablerepo=epel -y phpMyAdmin
sudo cp -f /etc/httpd/conf.d/phpMyAdmin.conf /etc/httpd/conf.d/phpMyAdmin.conf.bak
sudo cp -f /vagrant/vagrant/conf/phpMyAdmin.conf /etc/httpd/conf.d/phpMyAdmin.conf
sudo systemctl restart httpd.service

echo '############################################################'
echo '# PROVISION FINISH'
echo '############################################################'

phpMyAdminの初期設定では外部からのアクセスが許可されてないので設定を変えなければいけません。
なのでconfフォルダに設定を変えたphpMyAdmin.confをあらかじめ用意しておき、インストール後に入れ替えるようにしています。(43行目付近)
この方法を使って他にもApacheの設定ファイルなどを入れ替えることができます。

Vagrantの起動

以下のコマンドで起動できます。

$ vagrant up

初めて起動するときはイメージのダウンロードやプロビジョニングに設定したソフトのインストールなどで時間がかかります。
2回目以降はダウンロードやインストールをしないので早く起動することができます。

Vagrantのコマンド

$ vagrant up         # 起動
$ vagrant halt       # 停止
$ vagrant reload     # 再起動
$ vagrant destroy    # 破棄
$ vagrant provision  # プロビジョニング実行
$ vagrant ssh        # ゲストOSにSSHログイン

おわりに

なんとなくGitHubにあげてます。
GitHub - kkasai/va_sample
思ったよりも簡単に構築することができた。
chefとかできたらもっと柔軟に環境構築できるのかなーと思ったり。
今度はdocker使っていろんなコンテナー立てまくってセキュリティの勉強とかしたいなーと思っています。