Vagrant + シェルスクリプトでLAMP環境 + WordPressを自動構築する

概要

今回は仮想環境管理ツールのVagrantを導入して、シェルスクリプトを使用し、vagrant upコマンド一発でLAMP環境 + WordPressを自動構築できるようにします。

今回の流れとしては、まずVagrantの定義やイメージを押さえます。そして作業に移り、Vagrantインストールからシェルスクリプト作成まで一通りやっていきます。

最後の動作確認では、起動した仮想マシンにssh接続し、各ミドルウェアがインストールされているかどうか、WebブラウザでWordPressの設定画面が表示されるかどうか確認します。

Vagrantとは?

Vagrantとは、オープンソースの仮想環境管理ツールです。Vagrantを使用すると、簡単に仮想マシンの作成や削除、複製や共有を行えるので大変便利です。

ただし、あくまで管理ツールであって、仮想環境は持っていません。なので、VirtualBox、VMware、Dockerなどの仮想環境(プロバイダ)をインストールしておく必要があります。今回はデフォルトで使用されているVirtualBoxを使用します。

今回の構成

ではVagrantは具体的に何をしているのか? 今回の構成で考えると、以下のようなイメージになります。

Vagrantにて個人的に特に重要だと思うのは、boxファイルとVagrantfileです。

boxファイル各プロバイダ用OSイメージ
Vagrantfile一つの仮想環境ごとに生成されるVagrantの設定ファイル

今回は仮想マシンにCentOS8を採用するので、Vagrant CloudからVirtualBox用CentOS8のboxファイルを使用します。このようにVagrant Cloudには他にも多くのboxファイルが置かれていて、適宜自分が欲しいboxファイルを探します。ちなみに今回はここから取得してきますが、他の公開サーバであったり、社内サーバであったりと、様々な場所から取得することができます。

また、取得するとはいっても、Vagrantfileに使用するboxファイルを登録しておくだけで完了します。つまり、仮想マシンを起動した際に勝手にダウンロードして読み込んでくれるような仕組みになっています(初回の挙動。2回目以降はPC内のキャッシュを使用)。

上記のイメージにはboxファイルのアップロードとありますが、今回はやりません。boxファイルを自作してアップロードできたりもするよということを伝えたかっただけです。

プロビジョニング

今回はただVagrantを導入するのではなく、プロビジョニングを行います。プロビジョニングとは、仮想マシン起動後にする追加処理のことで、様々な方法があります。その中で今回採用するのが、シェルスクリプトによるプロビジョニングです。

今回の場合、LAMP環境構築に必要なミドルウェアをインストールしたり、各設定ファイルの変更を行ったりなどを、スクリプトを書くことによって自動化させます。

なので、vagrant upコマンドで仮想マシンを作成し、起動完了後(スクリプトの処理終了後)にはLAMP環境がすでに構築されていて、WordPressもインストールされている状態になります。

環境

  • Vagrant 2.2.14
  • VirtualBox 6.1.16
  • ホストOS(macOS Catalina 10.15.7)
  • 仮想マシン(CentOS8)
  • Apache 2.4.37
  • PHP 7.4.12
  • MySQL 8.0.21
  • WordPress 5.5.3

事前準備

まだインストールしていない場合は、以下のページからインストールしてきます。

VirtualBoxインストール

Downloads – Oracle VM VirtualBox
% VBoxManage -v
6.1.16r140961

Vagrantインストール

Downloads | Vagrant by HashiCorp
Vagrant enables users to create and configure lightweight, reproducible, and portable development environments.
% vagrant version
Installed Version: 2.2.14
Latest Version: 2.2.14

You're running an up-to-date version of Vagrant!

ディレクトリ作成&初期化

今回の仮想マシン用のディレクトリを作成します。

% mkdir vagrant_lamp

このディレクトリ内でvagrant initコマンドを使用して初期化することで、Vagrantfileなどの必要なファイルが作成されます。また、引数にboxファイル名を指定してあげることで、boxファイルがVagrantfileに登録された状態で初期化されます。

% cd vagrant_lamp
% vagrant init generic/centos8

なので、プロビジョニングや仮想マシンの細い設定をしないのであれば、あとはvagrant upをするだけで仮想マシンを作成し起動することができます。

Vagrantfile編集

VagrantfileはRubyの言語仕様に基づいて書かれていて、configパラメータの値を変更していくことで設定を変更していきます。

% vi Vagrantfile
# Vagrantのバージョン2を指定
Vagrant.configure("2") do |config|
 #boxファイル名を指定
  config.vm.box = "generic/centos8"
  #仮想マシンのプライベートIPアドレスを指定
  config.vm.network :private_network, ip: "192.168.10.2"
  #仮想マシンのホスト名を指定
  config.vm.hostname = "vagrant-lamp"
  #プロバイダ名を指定
  config.vm.provider "virtualbox" do |vb|
    #GUI無効
      vb.gui = false
      #仮想マシン名を指定
      vb.name = "centos8"
      #メモリサイズを指定
      vb.memory = "2048"
    #CPU数を指定
      vb.cpus = 1
  end
  #シェルスクリプト(provision.sh)によるプロビジョニングを指定
  config.vm.provision :shell, path: "provision.sh"
end

provision.sh編集

ではスクリプトを書いていきます。仮想マシン作成中に無事完了しているかどうか分かりやすいようにechoで区切ってます。

#!/bin/sh

echo *****************************************************************************
echo Repository
echo *****************************************************************************
#epelリポジトリインストール
dnf -y install epel-release
#remiリポジトリインストール
dnf -y install http://ftp.riken.jp/Linux/remi/enterprise/remi-release-8.rpm
#一応パッケージの更新
dnf -y update 

echo *****************************************************************************
echo Apache
echo *****************************************************************************
#httpdインストール
dnf -y install httpd
#自動起動&今すぐ起動
systemctl enable httpd --now

echo *****************************************************************************
echo PHP
echo *****************************************************************************
#phpインストール(必要最低限のパッケージも含む)
dnf -y module install php:remi-7.4
#phpとmysqlの連携に必要
dnf -y install php-mysqlnd 
#念のためバックアップ
cp /etc/php.ini /etc/php.ini.org
#タイムゾーンを東京にする
sed -i -e "s/;date\.timezone =/date\.timezone = Asia\/Tokyo/g" /etc/php.ini
#phpをApacheに読み込ませる
systemctl restart httpd

echo *****************************************************************************
echo MySQL 
echo *****************************************************************************
#mysql用リポジトリを追加
dnf -y install https://dev.mysql.com/get/mysql80-community-release-el8-1.noarch.rpm
#mysqlインストール
dnf -y install mysql-server
#自動起動&今すぐ起動
systemctl enable mysqld --now

#変数定義(各自好きなように変えてOK)
database=testdb
user=testuser
host_name=localhost
root_password=root@PASSWORD
user_password=user@USERPASS
#mysql_secure_installationを自動入力で設定
printf "\n\n${root_password}\n${root_password}\n\n\n\n\n" | mysql_secure_installation

#データベース作成(wordpress用)
mysql -u root -p${root_password} --connect-expired-password -e "create database $database"
#新しいユーザ作成(wordpress用)
mysql -u root -p${root_password} --connect-expired-password -e "create user $user@$host_name identified by '$user_password'"
#作成したユーザにデータベースの使用権限を付与
mysql -u root -p${root_password} --connect-expired-password -e "grant all privileges on $database.* to $user@$host_name with grant option"

echo *****************************************************************************
echo 'Firewall&SELinux'
echo *****************************************************************************
#httpとhttps用の待ち受けポートを開放してリロード
firewall-cmd --add-service=http --zone=public --permanent
firewall-cmd --add-service=https --zone=public --permanent
firewall-cmd --reload
#SELinuxを一時的に無効化
setenforce 0

echo *****************************************************************************
echo WordPress
echo *****************************************************************************
#wordpressのtarボールをとってくる
curl -O https://wordpress.org/latest.tar.gz
#解凍して展開
tar -xzvf latest.tar.gz
#ドキュメントルート以下にwordpressディレクトリを配置して移動
mv wordpress /var/www/html/
cd /var/www/html/wordpress
#念のためバックアップ
cp wp-config-sample.php wp-config.php
#作成したデータベース名を入力した設定で置換&上書き保存
sed -i -e "s/define( 'DB_NAME', 'database_name_here' );/define('DB_NAME', '$database');/" /var/www/html/wordpress/wp-config.php
#作成したユーザ名を入力した設定で置換&上書き保存
sed -i -e "s/define( 'DB_USER', 'username_here' );/define('DB_USER', '$user');/" /var/www/html/wordpress/wp-config.php
#作成したユーザパスワードを入力した設定で置換&上書き保存
sed -i -e "s/define( 'DB_PASSWORD', 'password_here' );/define('DB_PASSWORD', '$user_password');/" /var/www/html/wordpress/wp-config.php

echo *****************************************************************************
echo COMPLETE!!!!
echo *****************************************************************************

個人的にmysql_secure_installationをどう自動入力して設定完了させるか奮闘したところが大変勉強になりました。これでスクリプト完成です。

動作確認

vagrant upで仮想マシンを作成し、起動させます(スクリプトも実行される)。

% vagrant up

問題のあるエラーが出ていないことが確認できたので、仮想マシンにssh接続して、ミドルウェアがしっかりとインストールされているかどうか確認します。

% vagrant ssh
$ httpd -v
Server version: Apache/2.4.37 (centos)
Server built:   Sep 15 2020 15:41:16

$ php -v
PHP 7.4.12 (cli) (built: Oct 27 2020 15:01:52) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies

$ mysqld -V
/usr/libexec/mysqld  Ver 8.0.21 for Linux on x86_64 (Source distribution)

はい、大丈夫そうです。では、ホストOS側のWebブラウザで、http://192.168.10.2/wordpressにアクセスして、WordPressが表示されるかどうか確認します。

無事表示されました。以上、Vagrant + シェルスクリプトでLAMP環境 + WordPressを自動構築しました。いつどんな時使うんだ?って感じですが、スクリプトの勉強になる&楽しいってことで良しとします。

ここ間違っている&もっとこうすればいい等あればぜひコメントお願いいたします。

参考文献

標準テキスト CentOS7 構築・運用・管理パーフェクトガイド

VagrantでLAMP環境を自動構築 – Zenn

初心者がVagrantでローカル環境にLAMP環境構築してみた – Qiita

2ファイルでLAMP開発環境構築

WindowsでVagrant + VirtualBox + LAMP環境構築(Cake PHP)を自動化

MySQL5.7の初期パスワードを非対話で変更する | akamist blog

Comments

Copied title and URL