オライリーの『実践 Vagrant』を購入して読んでみると、サンプルとして書かれている Vagrantfile のバージョンが1で現在はほとんど使われていないのでちょっと悩ましいなぁと思っていたのだけど、せっかくなので勉強と動作確認を兼ねて自分で書き換えてみることにしました。 と言っても、ほとんど Vagrant の Getting Started にそのまま載ってるものばかりなんですが。
【記事の内容】
- Vagrant, VirtualBox の使用バージョン
- 2章 初めての Vagrant マシン
- 3章 Vagrant 仮想マシンのプロビジョニング
- 4章 Vagrant におけるネットワーク
- 5章 複数マシン構成のクラスタのモデリング
- まとめ
【参考】
Vagrant, VirtualBox の使用バージョン
Vagrant ファイル自体は OS の種類に依らないはずですが、動作確認は Windows10 の 32-bit マシンで行っています。 Vagrant と VirtualBox の使用バージョンは以下の通り:- Vagrant : 1.9.8
- VirtualBox : 5.1.30
それぞれ以下のサイトから Windows のインストーラーをダウンロードできます:
- Vagrant : こちらの vagrant_1.9.8_i686.msi
- VirtualBox : こちらのサイトで VirtualBox 5.1.30 → Windows hosts → x86
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 TCP 対 UDP (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 Bash で ping をすると文字化けするようですね・・・*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 系が動かなかったことの方がかなり悩まされました(笑)
- 作者:Mitchell Hashimoto
- 発売日: 2014/02/21
- メディア: 単行本(ソフトカバー)