このすみノート

Webエンジニアが技術や趣味を書くブログです。

実践Vagrantで学ぶ、自動サーバ構築【感想】

O'Reilly(オライリー)の「実践Vagrant」を読みました。

実践 Vagrant

実践 Vagrant

今まで何気なく Vagrant を使っていたのですが、詳しく理解していなかったのです。

今年は、インフラやサーバ周りの知識強化を目標にしているので、その一環でもあります。やっていきです。

www.konosumi.net

オライリーの割にはページ数が少ないので、さくっと読めます。しかも開発者である「Mitchell Hashimoto」氏が自ら記した本なのです。

少し古い本ではあるのですが、おすすめです。

こんなに簡単に開発環境を構築することです

Vagrantを使ってみて驚く点は、そのお手軽さです。

VirtualBoxとVagrantのインストールが完了していれば、以下の3ファイルをプロジェクト直下に置くだけで、Web+Dbサーバを構築することができます。

Vagrantfile

Vagrant::Config.run do |config|
  # ベースとなるBoxイメージを指定
  # 基本的には、最小限のOSがインストールされています
  config.vm.box = "precise64"
   
  # Webサーバの構築
  config.vm.define "web" do |web|
    # ポートフォワーディング(localhost:8080をVMの80に転送する) 
    web.vm.forward_port 80, 8080
    # ホストからのみアクセスできるローカルIPを付与する
    web.vm.network :hostonly, "192.168.33.10"

    # 共有フォルダの設定
    # ホストの特定のフォルダに対して、VMからアクセスできるようになります
    # WebプログラムのソースコードをVMから読めるようにしたい時などに使います!
    web.vm.share_folder "v-root", "/vagrant", "." 

    # シェルによるプロビジョニング(コマンド実行、ChefやPuppetも可能) 
    web.vm.provision :shell, path: "web_provision.sh"
    # Vagrantfile 内で、直接コマンドを実行したい場合
    web.vm.provision :shell, inline: "apt-get install -y mysql-client"
  end 

  # Db(Mysql)サーバの構築
  config.vm.define "db" do |db|
    db.vm.network :hostonly, "192.168.33.11"
    db.vm.provision :shell, path: "db_provision.sh"
  end 
end

web_provision.sh

#!/usr/bin/env bash

# Apache2をインストールして、セットアップします
echo "Installing Apache and setting up..."
apt-get update
apt-get install -y apache2
rm -rf /var/www
# 共有フォルダの/vagrantをDocumentRoot化する対応
ln -fs /vagrant /var/www

db_provision.sh

#!/usr/bin/env bash

# Mysqlをインストールして、セットアップします
export DEBIAN_FRONTEND=nonintaractive
apt-get update
apt-get install -y mysql-server
sed -i -e 's/127.0.0.1/0.0.0.0/' /etc/mysql/my.cnf
restart mysql
mysql -uroot mysql <<< "GRANT ALL ON *.* TO 'root'@'%'; FLUSH PRIVILEGES;"

「vagrant up」を実行すると、自動でサーバが構築されていきます

There were warnings and/or errors while loading your Vagrantfile
for the machine 'web'.

Your Vagrantfile was written for an earlier version of Vagrant,
and while Vagrant does the best it can to remain backwards
compatible, there are some cases where things have changed
significantly enough to warrant a message. These messages are
shown below.

Warnings:
* The 'v-root' shared folders have been renamed to 'vagrant-root'.
Assuming you meant 'vagrant-root'...

Bringing machine 'web' up with 'virtualbox' provider...
Bringing machine 'db' up with 'virtualbox' provider...
==> web: Importing base box 'precise64'...
==> web: Matching MAC address for NAT networking...
==> web: Setting the name of the VM: vagrant_book_example_web_1518418409374_42956
==> web: Clearing any previously set network interfaces...
==> web: Preparing network interfaces based on configuration...
    web: Adapter 1: nat
    web: Adapter 2: hostonly
==> web: Forwarding ports...
    web: 80 (guest) => 8080 (host) (adapter 1)
    web: 22 (guest) => 2222 (host) (adapter 1)
==> web: Booting VM...
==> web: Waiting for machine to boot. This may take a few minutes...
    web: SSH address: 127.0.0.1:2222
    web: SSH username: vagrant

サーバ構築の自動化という理想郷

だいぶ前の話ですが、私は以前、Perlで Sledgeフレームワークな開発をしていたことがありました。しかし、PerlでSledgeが動く開発環境を作るのは、なかなかに大変でした。

特に、Sledgeが少し古いCPANモジュールを要求するので、なかなかにCPANインストールが通りません。悪戦苦闘しながらコマンドを叩き、無事に開発環境を構築することは出来たのですが、再現できる自信がないというジレンマに陥ります。

Vagrant を使用すれば、悪戦苦闘した過程も、プロビジョニングファイルに残ります。そのため、サーバを作り直すための時間とコストが、大幅に節約できます。全く同じ環境を、すぐに構築することができるのです。

その当時にVagrant があったとしたら、こんなに苦労することはなかっただろうな・・・と、思いつつ(苦笑)。

個人的には、Vagrant の最大のメリットは、環境構築の記録がファイルとして残ることで、再現性のあるサーバ構築をすることができる点にあると思います。

さいごに

これさえあれば「自分の環境では動くのに」がなくなりますね!

本書の冒頭に「明快かつシンプル、強力で有用」という性質をすべて兼ね備えたソフトウェアと書いてありますが、正にそう思います。 Vagrantは確かに凄いです。

実践 Vagrant

実践 Vagrant

(後日追記)サンプルコードを追加しました!

github.com