塩焼きブログ

塩焼きに関しての研究内容を公開しています

Vagrantを使ってコマンド一発で仮想開発環境を構築する

Virtualboxにイメージをダウンロードしてきてインストールして、その中で環境を整えて、ファイルをマウントしてって作業を手作業でやるとかなり萎えるので、Vagrantを使って半日かけてこれを自動化する方法を考えて実践してみた。

必要な奴らをインストール

  • Oracle VM VirtualBox (無料で仮想化してくれるやつ)
  • Vagrant (仮想化を簡単にできるようにしてくれるやつ)

プロジェクトディレクトリの構成

/PHPファイルとか公開したくないものをもろもろ入れる所、public/*がDocumentRoot、vagrant/rewrites/*には仮想マシン内の設定ファイルを置き換えるものを入れていて、vagrant/shellにはVagrantに叩かせるshellを入れている。

├── public
│   └── index.html
└── vagrant
    ├── Vagrantfile
    ├── rewrites
    │   ├── httpd.conf
    │   └── selinux.conf
    └── shell
        └── setup.sh

ぱっと見面倒そうだけどやってることはシンプルで、基本はVagrantfileだけ用意すれば仮想マシンは立ち上がるけど、それだけだとただ立ち上がるだけなので、いろんなファイルとかshellとかを使ってWebサーバーのセットアップまで自動化させているって感じ。

そしてvagrantについてはhoge/vagrantとして公開しているので簡単に検証したいならcloneしてきて利用するのがおぬぬめ

github.com

vagrant/Vagrantfile

boxは公開されてたイメージの中から適当にfedora20を選択してみた。毎度IPアドレス変わるのもだるいのでIPアドレス縛って、さっきのディレクトリ構成のうちの/仮想マシン内の/appにマウントし、最後に内部で実行してほしいshellを渡している。

VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "fedora20"
  config.vm.box_url = "https://dl.dropboxusercontent.com/u/15733306/vagrant/fedora-20-netinst-2014_01_05-minimal-puppet-guestadditions.box"
  config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.synced_folder "../", "/app"
  config.vm.provision :shell, :path => "./shell/setup.sh"
end

vagrant/shell/setup.sh

MariaDBPHPでの開発環境を想定してみた

# -------- MariaDbの設定 --------

yum install mariadb mariadb-devel mariadb-server
systemctl enable mariadb
systemctl start mariadb
/usr/bin/mysqladmin -u root password 'password'

# -------- PHPの設定 --------

yum -y install httpd php php-mbstring php-gd php-mysql php-devel

# httpd.conf
mv /etc/httpd/conf/httpd.conf ~
cp /vagrant/rewrites/httpd.conf /etc/httpd/conf/httpd.conf

# iptables無効化 (無効化しなければブラウザから接続できない)
iptables -F
systemctl disable firewalld.service

# SELinux無効化 (無効化しなければマウントしたディレクトリをDocumentRootに設定できない)
cp /vagrant/rewrites/selinux.conf /etc/selinux/config
setenforce 0

systemctl enable httpd
systemctl start httpd

vagrant/rewrites/httpd.conf

さっきのshellの中で必要としてたhttpd.confの内容。yumhttpd入れた時についてきたhttpd.confからコメント消しただけで大した変更してないけど、ドキュメントルートあたりを変更してみた。

ServerRoot "/etc/httpd"
Listen 80
Include conf.modules.d/*.conf
User vagrant
Group vagrant
ServerAdmin root@localhost
ServerName www.example.com:80
<Directory />
    AllowOverride All
    Require all denied
</Directory>
DocumentRoot "/app/public"
<Directory "/app/public">
    AllowOverride All
    Require all granted
    Options Indexes FollowSymLinks
</Directory>
<IfModule dir_module>
    DirectoryIndex index.php index.html
</IfModule>
<Files ".ht*">
    Require all denied
</Files>
ErrorLog "logs/error_log"
LogLevel warn
<IfModule log_config_module>
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common
    <IfModule logio_module>
      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    </IfModule>
    CustomLog "logs/access_log" combined
</IfModule>
<IfModule mime_module>
    TypesConfig /etc/mime.types
    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz
    AddType text/html .shtml
    AddOutputFilter INCLUDES .shtml
</IfModule>
AddDefaultCharset UTF-8
<IfModule mime_magic_module>
    MIMEMagicFile conf/magic
</IfModule>
EnableSendfile off
IncludeOptional conf.d/*.conf

vm/rewrites/selinux.conf

shellの中で必要としていたselinux.confの内容。ドキュメントルート変更したのでselinux無効化しなきゃいけない。

SELINUX=disabled
SELINUXTYPE=targeted

いざ構築

vagrantディレクトリへ移動して以下の呪文を唱えるだけ

vagrant up

192.168.33.10にブラウザからアクセスすればpublicディレクトリに入れたものが表示される