倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

『実践 Vagrant』の Vagrantfile をバージョン2で書いてみる

オライリーの『実践 Vagrant』を購入して読んでみると、サンプルとして書かれている Vagrantfile のバージョンが1で現在はほとんど使われていないのでちょっと悩ましいなぁと思っていたのだけど、せっかくなので勉強と動作確認を兼ねて自分で書き換えてみることにしました。 と言っても、ほとんど VagrantGetting Started にそのまま載ってるものばかりなんですが。

【記事の内容】

【参考】

Vagrant, VirtualBox の使用バージョン

Vagrant ファイル自体は OS の種類に依らないはずですが、動作確認は Windows10 の 32-bit マシンで行っています。 VagrantVirtualBox の使用バージョンは以下の通り:

それぞれ以下のサイトから Windowsインストーラーをダウンロードできます:

Vagrant のインストールを行ったのはこの記事を書いた1~2か月前ですが、その時点では Windows 10 で Vagrant 2.x 系がキチンと動かなかったので Vagrant 1.x 系の最後のリリースである 1.9.8 を使用しています。

また、Windowsコマンドラインでは仮想マシンにアクセスする ssh が使えないので、ここでは Git for Windows をインストールしたときについてくる「Git Bash」を使っています(実態は MINGW32 なようですが)。

以下、「バージョン」と言った場合は、Vagrant ではなく Vagrantfile のバージョンのことを指すものとします。

2章 初めての Vagrant マシン

2.2 Vagrantfile (p,22)
ここでの Vagrantfile は Vagrantfile の基本的な構造を見せているだけで内容には立ち入っていないのですが、一応書き換えておきましょう:

Vagrant.configure("2") do |config|
  config.vm.box = "precise64"

  config.vm.synced_folder ".", "/vagrant"

  config.vm.provision "shell" do |s|
    s.path = "script.sh"
  end
end

まぁ、大して変わってないですね。

2.4 ボックス (p.28)
コマンドライン上で単純に「vagrant init」を実行した際に作成される Vagrant ファイルでコメントを除いた部分:

Vagrant.configure("2") do |config|
  config.vm.box = "precise64"
  config.vm.box_url = "http://files.vagrantup.com/precise64.box"
end

Vagrant のドキュメント内に書かれているサンプルでは、ボックスとして "hashicorp/precise64" が使われていますが、vagrant init で生成される Vagrantfile
では "precise64" が指定されるようです。 本記事中では "precise64" を使うことにします。

2.6.3 共有ファイルシステム (p.35)
共有ファイルの設定は share_folder から synced_folder に変更されました。 synced_folder では共有フォルダの識別子(本書の "v-root")はオプション扱い(id オプション)になっているようなので、ここでは省略します。 また、ホストマシンとゲストマシンのパスの設定順序が逆になっているようです。 これを踏まえて、共有ファイルの設定は以下のようになります:

Vagrant.configure("2") do |config|
  config.vm.box = "precise64"

  config.vm.synced_folder ".", "/foo"
end

ファイルシステムの共有で他に使えるオプションなどは「Basic Usage - SyncedFolder」を参照。

2.6.4 基本的なネットワーキング (p.37)
ポートのフォワードは foward_port から network"forwarded_port" 設定に変更されました:

Vagrant.configure("2") do |config|
  config.vm.box = "precise64"

  config.vm.network "forwarded_port", guest: 80, host: 8080
end

こちらは名前付きでポートを設定するので、ホストとゲストのポートを混同することはないでしょう。

ポートのフォワードで他に使えるオプションなどは「Forwarded Ports - Networking」参照。

3章 Vagrant 仮想マシンのプロビジョニング

3.4 自動化プロビジョニングの基本 (p.56)
シェルを使ったプロビジョニングの設定方法はバージョン1のものと同じです:

Vagrant.configure("2") do |config|
  config.vm.box = "precise64"
  config.vm.network "forwarded_port", guest: 80, host: 8080
  config.vm.provision "shell", path: "provision.sh"
end

provision.sh の内容は『実践 Vagrant』本文に書かれているものを使えます(当然ですが):

#!/usr/bin/env bash

echo "Installing Apache and setting it up..."
apt-get update >/dev/null 2>&1
apt-get install -y apache2 >/dev/null 2>&1
rm -rf /var/www
ln -fs /vagrant /var/www

provision.sh は Vagrantfile と同じディレクトリに配置します。

Chef や Puppet を使用したプロビジョニングについては省略。

3.7.1 シェルスクリプト (p.64)
シェルスクリプトをインラインで指定する方法もバージョン1と同じです:

  config.vm.provision "shell", inline: "apt-get install -y apache"

シェルスクリプトによるプロビジョニングで他に使えるオプションなどは「Shell Scripts - Provisioning」参照。

4章 Vagrant におけるネットワーク

ネットワーク関連の設定はドキュメントに載っているコードを参考にしてるだけで、正直あまり動作確認してません・・・

4.1.2 基本的な使用方法(フォワードされたポート) (p.75)
フォワードされたポートの基本については既に2章で出てきました:

  config.vm.network "forwarded_port", guest: 80, host: 8080

4.1.3 衝突の検出と修正 (p.76)
ポートが衝突した場合に自動的に修正を行うようにする設定は、バージョン1の場合と同じく auto_correct オプションを true に設定します:

  config.vm.network "forwarded_port", guest: 80, host: 8080,
    auto_correct: true

自動修正を行う際に使用するポートの範囲の設定もバージョン1の場合と同じです:

  config.vm.usable_port_range = (2200..2250)

4.1.4 TCPUDP (p.77)
UDP ポートフォワードもバージョン1の場合と同じく protocol オプションを追加で設定します:

  config.vm.network "forwarded_port", guest: 80, host: 8080,
    protocol: "udp"

その他、フォワードされたポートで使えるオプションなどは「Forwarded Ports - Networking」参照。

4.2.2 基本的な使用方法(ホストのみのネットワーク) (p.78)
『実践 Vagrant』本文の4章最初に訳者の方から注意書きされてるように、バージョン1で「ホストのみ (hostonly) のネットワーク」と呼ばれていたものは「プライベートネットワーク (private network)」に変更になっています。 静的 IP は ip オプションで指定します:

  config.vm.network "private_network", ip: "192.168.33.10"

バージョン1の場合と比べて、フォワードされたポートの場合と統一された形式になっています。

ちなみに Git Bashping をすると文字化けするようですね・・・*1 コマンドプロンプトPowerShell でやれば普通に表示されます。

プライベートネットワークの設定で使える他のオプションなどは「Private Network - Networking」参照。

4.3.2 基本的な使用方法(ブリッジのネットワーク) (p.81)
「ブリッジのネットワーク」は、バージョン2から「パブリックネットワーク (public network)」に変更されました*2

  config.vm.network "public_network"

パブリックネットワークの設定で使える他のオプションなどは「Public Network - Networking」参照。

4.4 ネットワークの選択肢の組合せ (p.83)
複数のネットワーク定義は各定義を単に並べて書きます:

  config.vm.network "fowarded_port", guest: 80, host: 8080
  config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.network "public_network"

5章 複数マシン構成のクラスタモデリング

5.1 複数の仮想マシンの実行 (p.88)
複数のマシンを定義する方法はバージョン1の場合と同じです:

Vagrant.configure("2") do |config|
  config.vm.box = "precise64"

  config.vm.define "web" do |web|
    web.vm.network :forwarded_port, guest: 80, host: 8080
    web.vm.provision :shell, path: "provision.sh"
  end

  config.vm.define "db" do |db|
    # ここはこの後作成します。
  end
end

『実践 Vagrant』の本文に合わせて web マシンのプロビジョニングの設定で "shell" ではなく :shell としていますが、これは Vagrant ではなく Ruby のシンボルという機能で、バージョン1, 2 のどちらでも使えるようです。 フォワードされたポートの設定も同じようにシンボル :forwarded_port を使うように変更しています。 もちろん前と同じように文字列をしていしてもかまいません。

5.3.1 ホストのみのネットワーク (p.92)
次は複数マシンにホストのみのネットワーク(プライベートネットワーク)を定義する Vagrantfile です:

Vagrant.configure("2") do |config|
  config.vm.box = "precise64"

  config.vm.define "web" do |web|
    web.vm.network :forwarded_port, guest: 80, host: 8080
    web.vm.provision :shell, path: "provision.sh"
    web.vm.network :private_network, ip: "192.168.33.10"
  end

  config.vm.define "db" do |db|
    db.vm.network :private_network, ip: "192.168.33.11"
  end
end

ここでもプライベートネットワークの指定にシンボル :private_network を使っています。 Vagrantfile の内容自体は特に問題ないと思います。

5.4 実際的な例:MySQL (p.94)
MySQL をデータベースサーバとして使った例の Vagrantfile:

Vagrant.configure("2") do |config|
  config.vm.box = "precise64"

  config.vm.define "web" do |web|
    web.vm.network :forwarded_port, guest: 80, host: 8080
    web.vm.provision :shell, path: "provision.sh"
    web.vm.provision :shell, inline: "apt-get install -y mysql-client"
    web.vm.network :private_network, ip: "192.168.33.10"
  end

  config.vm.define "db" do |db|
    db.vm.provision :shell, path: "db_provision.sh"
    db.vm.network :private_network, ip: "192.168.33.11"
  end
end

MySQL の設定を行う db_provision.sh は『実践 Vagrant』本文に載っているものと同じものを使います:

export DEBIAN_FRONTEND=noninteractive
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;"

この db_provision.sh を Vagrantfile や provision.sh (Apache Web サーバ)と同じディレクトリに配置します。

まとめ

「6章 ボックス」、「7章 プラグインによる Vagrant の拡張」では Vagrantfile が出てこない*3もしくはバージョン2を使用しているので、バージョン1の Vagrantfile の書き換えはこれで終了。 1つ1つ書き換えてみるとそのままの書き方で大丈夫な設定も結構あって、思ったよりは変更が少なかった印象でした。

正直なところ、Vagrantfile のバージョンの違いよりも Windows 10 で Vagrant 2.x 系が動かなかったことの方がかなり悩まされました(笑)

実践 Vagrant

実践 Vagrant

*1:フォントを変えてもおかしいままなんですが。

*2:Vagrant のドキュメントの「Public Network」の項目によると、「パブリックネットワーク」という語が誤解を招くので今後「:bridged」に変更される(戻される?)というようなことが書かれてますが。

*3:6章では SSH のユーザー名を変更する方法が書かれていますが、バージョン2でも1と同じように書けます。