はじめに
本文章は、Vagrant公式サイト内のドキュメント内のGETTING STARTEDに記載されている内容を意訳に近い形で日本語化したものである。
誤訳が含まれている可能性が十分にあることを踏まえて、参考いただきたい。
入門
Vagrant入門ガイドでは、初めてのVagrantプロジェクトを順を追って見ていくことで、Vagrantが提供する主要かつ基本的な機能を説明する。
Vagrantが提供する機能によってもたらされる利益がなんであるかを知りたいのであれば、なぜVagrantか? も読んでおくこと。
無料かつ主要なプラットフォームにおいて入手可能で、Vagrantに対応する機能が組み込まれているので、本ガイドではVagrantをVirtualBoxとともに使用する。 これ以降を読み進めるにあたり、Vagrantが他の多くのプロバイダで動かすことが可能であることは忘れてはならない。
はじめてのプロジェクトに飛び込む前に、Vagrantの最新バージョンをインストールしよう。そして、この入門に際してVirtualBoxをプロバイダとして使用するので、こちらもインストールしておこう。
書籍は?物理的な本を読みたい方は、Vagrantの開発者によってかかれ、O'Reillyから出版されているVagrant: Up and Runningに興味があるだろう。
起動
$ vagrant init hashicorp/precise64
$ vagrant up
上記の2つのコマンドを実行した後、VirtualBox上でUbuntu 12.04 LTS 64-bitが動作する、完全に起動した仮想マシンを手に入れるだろう。あなたはvagrant ssh
によってこのマシンにSSH接続することができ、そして一通り遊んだらvagrant destroy
で仮想マシンを終了することが出来る。
これまで関わったすべてのプロジェクトがこの簡単なセットアップになることを想像してみよう。
Vagrantであれば、vagrant up
がプロジェクトにとりかかるために必要なすべてのことである。これは、すべてのプロジェクトが必要な依存関係をインストールし、ネットワークや同期フォルダを設定し、自身のマシンを引き続き快適に動かし続けられるようにしてくれる。
このガイドの以降ではより完全なプロジェクトの設定するとともに、Vagratnのその他の機能を見ていこう。
次の段階
ここではVagrantで初めての仮想環境を生成した。さらにプロジェクトの設定について、学習していこう。
プロジェクトの設定
いかなるプロジェクトにおいても、設定において最もはじめの段階は、Vagrantfileを生成することである。Vagrantfile の目的はおもに2つだ。
- プロジェクトのルート・ディレクトリを設定する。Vagrantにおける多くの設定項目は、このルート・ディレクトに関連している。
- どのソフトウェアをインストールするかやどのようにマシンにアクセスするかと同様に、プロジェクトで稼働させるために必要なマシンの種類とリソースについて記載する。
Vagrantはvagrant init
として使用する、ディレクトリ初期化用の組み込みコマンドを持っている。この入門ガイドの目的のために、ターミナル内で以下のコマンドを実行してよう。
$ mkdir vagrant_getting_started
$ cd vagrant_getting_started
$ vagrant init
これはカレント・ディレクトリ内にVagrantfileを配置する。もし見たければ、Vagrantfileは見ることが出来る。その中身はコメントや例でいっぱいである。恐れる必要はない。すぐにそれを変更できるようになることだろう。
vagrant init
は既存のプロジェクト用に設定された既存のディレクトリ内でも実行することが出来る。
もし、プロジェクトでバージョン管理を行う場合、Vagrantfileがバージョン管理されることを意味する。 これによって、プロジェクトに関わる全ての人間が、事前準備からの開放をVagrantから受けることが出来る。
次の段階
初めてのプロジェクト環境の生成に成功した。さらにVagrantのBoxについて学習を進めよう。
Box
一から仮想マシンを構築するといった非常に遅く煩雑な作業の代わりに、Vagrantは仮想マシンのクローンを素早く作るためのベース・イメージを使用する。これらのベース・イメージはVagrantでは”Box"と呼ばれている。Vagrant環境として使用するBoxを指定することが、新しいVagrantfileを生成した後に行う最初の作業である。
Boxのインストール
もし入門ページのコマンドを実行していたら、すでにBoxをインストールしているため、再度このコマンドを実行する必要はない。しかしながら、Boxがどのように管理されるかを学ぶこのセクションを読む価値は依然としてあるだろう。
Boxはvagrant box add
によってVagrantに追加される。これのコマンドは、複数のVagrant環境がそのBoxを利用できるように、特定の名前で格納される。まだBoxを追加していない場合、以下のコマンドで実行できる。
$ vagrant box add hashicorp/precise64
これのコマンドは"hashicorp/precise64"と名付けられたBoxを、Boxを見つけたり公開できるHashiCorpのAtlas Boxカタログからダウンロードする。HashiCorpのAtlasからBoxをダウンロードするのが最も簡単だが、ローカルファイルやカスタムURLなどからもBoxを追加することが出来る。
Boxはカレント・ユーザの全体に対して格納され。それぞれのプロジェクトはBoxをそこからクローンを生成するための初期イメージとして使用し、実際のベース・イメージを変更することはない。これは、もしある2つのプロジェクトが共に、先ほど我々が追加したBoxであるhashicorp/precise64
を使用していても、一方のゲストマシンへのファイルの追加は他方のマシンになんの影響も与えない。
上記のコマンドでBoxが名前空間を持つ点に注意すること。Boxは2つの部分に分けられる。スラッシュで区切られたユーザー名とBox名である。上記例では、ユーザ名は"hashicorp"であり、Box名は"precise64"である。BoxをURLやローカル・ファイル・パスでも指定できるが、それは本入門での範囲外である。
名前空間は正規のBoxであることを保証するものではない。よくある誤った認識は"ubuntu"のような名前空間はUbuntuのBoxであることを保証する、ということである。これは真実ではない。Atlasにおける名前空間は、例えばGitHubでの名前空間に似た振る舞いをする。GitHubのサポートチームがだれかのリポジトリにおける問題の手助けを行えないのと同様に、HashiCorpのサポートチームはサードパーディーの公開したBoxの手助けを行えない。
Boxを使う
ここまででVagrantにBoxが追加された。これはベースとして使用するので、それぞれプロジェクトのためには設定を行う必要がある。Vagrantfile
を開き、以下のとおり変更する。
Vagrant.configure("2") do |config|
config.vm.box = "hashicorp/precise64"
end
この場合"hashicorp/precise64"は以前の手順においてBoxを追加した際に使用した名前と一致している必要がある。これはVagrantが、使用するためのBoxを知る手段である。もしBoxがそれ以前に追加されていない場合、Vagrantは稼働時に自動でそのBoxをダウンロードして追加する。
次のセクションではVagrantを立ち上げ、すこしだけ操作をしてみる。
他のBoxを探す
この入門ガイドの以降では、われわれはこれまでに追加した"hashicorp/precise64"のBoxだけを使用する。この入門ガイドを終えた後にでてくる初めての質問は"どこで他のBoxを見つけられるのか?"だろう。
Boxを探すのにもっともよい場所はHashiCorpのAtlas Box カタログである。HashiCorpのAtlasには、様々はプラットフォームやテクノロジが動作するBoxを、自由に入手可能な公開ディレクトリがある。HashiCorpのAtlasには、求めるBoxを見つけるためのすばらしい検索機能もある。
無料のBoxを探すのに加えて、HashiCorpのAtlasは自作のBoxを、自身の組織のために作成した私的なBoxと同様に公開することが出来る。
次の段階
はじめてのVagrant Boxのダウンロードに成功し、そのBoxを利用するためにVagrantfileの設定を行った。さらに起動とSSHによるVagrantマシンへのアクセスについて学習を進めよう。
upとssh
初めてのVagrant環境を起動する時が来た。ターミナルで以下のとおり実行する。
$ vagrant up
一分程度で、このコマンドは終了し、Ubuntuが稼動した仮想マシンを手に入れる。VagrantはUIを持たない仮想マシンを起動するので、実際には何も目に見えてわからない。起動している証拠に、そのマシンにSSH接続することが出来る。
$ vagrant ssh
このコマンドは本格的なSSHセッションに入る。マシンと対話し、やりたいことをしてみれば良い。これは非常に魅力的ではあるがrm -rf /
を実行するのは気をつけたほうが良い。VagrantはホストマシンのVagrantfileによって/vagrant
でディレクトリ共有しているが、そのコマンドの実行はそこにある全ファイルを削除することになるためだ。
すこし何が起こったかを考える時間を設けよう。たった一行の設定とターミナルからの一つのコマンドで、我々は完全な機能を持った、SSHアクセス可能な仮想マシンを起動することが出来た。スゲー。
ひととおりマシンをいじったら、ホストマシンに戻ってvagrant destroy
を実行する。Vagrantは仮想マシンによって使用されていた各リソースの使用を終了する。
vagrant destroy
コマンドはダウンロードしたBoxファイルを実際に削除することはない。Boxのファイルを完全に削除したい場合はvagrant box remove
コマンドを使用する。
次の段階
はじめてのVagrant環境の生成とVagrant環境との対話に成功した。さらに同期フォルダについて学習を進めよう。
同期フォルダ
仮想マシンをこうも簡単に持てることが出来るのはすばらしいが、SSHを経由したプレーンなターミナル・ベースのエディタだけを使ってファイルを編集する人はそう多くない。運の良いことに、Vagrantはそうはさせない。同期フォルダを使用することで、Vagrantはゲストマシンとの間でファイルの同期をすることが出来る。
デフォルトでは、Vagrantはプロジェクト・ディレクトリをゲストマシンの/vagrant
ディレクトと共有する(これはVagrantfile内で設定できる)。
vagrant ssh
によってマシンに接続した場合、/home/vagrant
にいることに注意すること。/home/vagrant
は同期された/vagrant
ディレクトリとは異なるディレクトリである。
Guest Addtionsの非互換性(またはGuest Addtionsがないこと)によって、ターミナル画面にエラーが表示された場合、Boxのアップデートかhashicorp/precise64
のような異なるBoxを選ぶ必要がある。ユーザによってはvagrant-vbguest プラグインによって成功したとのことだが、それはVagrantコア・チームによるサポート公式に行われない。
再度vagrant up
を実行し、SSHでマシンに接続してみる。
$ vagrant up
...
$ vagrant ssh
...
vagrant@precise64:~$ ls /vagrant
Vagrantfile
これを信じようと信じまいと、仮想マシン内にあるように見えるVagrantfileは、実際にはホストマシン上のVagrantfileと同じものである。このファイルに触れることによって自分自身で証明してみよう。
vagrant@precise64:~$ touch /vagrant/foo
vagrant@precise64:~$ exit
$ ls
foo Vagrantfile
なんと! "foo"がホストマシンにある。今見たとおり、Vagrantはフォルダ内を同期し続けるのだ。
同期フォルダでは、ホストマシン上の自分のエディタを使用し続けることが出来、ゲストマシンとファイルを同期することが出来る。
次の段階
ゲストマシン上の同期フォルダを介してホストマシンとのやりとりに成功した。さらにプロビジョニングについて学習を進めよう。
プロビジョニング
よし。Ubuntuの基本的なコピーが動作する仮想マシンを手に入れ、ホスト側のマシンからファイルを編集し、それを仮想マシンに同期することが出来るようになった。それでは、Webサーバを使用することでそれらのファイルを提供できるようにしよう。
SSHで接続したり、Webサーバをインストールすることが、我々独自の方法となってしまえば、Vagrantを使用するすべての人々がそれぞれ同じことをするはめなる。その代わりに、Vagrantは自動プロビジョニングをサポートするための組み込み機能を持っている。この機能を使えば、vagrant up
を行った際に、ゲストマシンが使用可能な状態に繰り返し生成されるよう、自動的にソフトウェアをインストールすることが出来る。
Apacheのインストール
われわれの基本プロジェクトに対してApacheをインストールしよう。そのためにシェル・スクリプトを使用することにする。以下のシェル・スクリプトを作りbootstrap.sh
としてVagrantfileとおなじディレクトリに保存する。
#!/usr/bin/env bash
apt-get update
apt-get install -y apache2
if ! [ -L /var/www ]; then
rm -rf /var/www
ln -fs /vagrant /var/www
fi
次にマシンの設定実行時に、このシェル・スクリプトが実行されるようにVagrantを設定する。これは、以下のとおりVagrantfileを編集することで行う。
Vagrant.configure("2") do |config|
config.vm.box = "hashicorp/precise64"
config.vm.provision :shell, path: "bootstrap.sh"
end
"provision"のある行が新しく追加した行であり、Vagrantにマシンの設定用のプロビジョナとしてbootstrap.sh
ファイルと共にshell`を使用することを伝えている。このファイル・パスはプロジェクト・ルート(Vagrantfileが存在する場所)に対する相対パスである。
プロビジョニング
すべてが設定し終えたら、マシンを生成するためにvagrant up
を実行するだけである。すると、Vagrantは自動的にプロビジョニングを行う。ターミナル上にシェル・スクリプトからの出力を見ることが出来るだろう。ゲストマシンが既にまえの段階で起動している場合は、vagrant reload --provision
を実行することで、初期のインポート処理をとばして、素早く仮想マシンを起動できる。たいていVagrantは最初のvagrant up
の時しかこれを行わないので、reload
コマンドのprovison
フラグはVagrantにプロビジョナを実行することを指示できる。
Vagrantが完全に稼働したら、Webサーバが起動している。自身のブラウザからは(まだ)Webサイトを見ることが出来ないが、マシンとSSH接続し、ファイルを読み取ることでプロビジョニングされたことを確認できる。
$ vagrant ssh
...
vagrant@precise64:~$ wget -qO- 127.0.0.1
これは、上記のシェル・スクリプト内でApacheをインストールして、ApacheのDocumentRoot
のデフォルトをVagrantによって設定されたデフォルトの同期フォルダである/vagrant
ディレクトリを指すように設定したため、動作する。
もっと何かのファイルを作って、それをターミナルからみてみるなどして遊んでみるとよい。次のステップでは、ゲストマシンにアクセスするためのブラウザを使用することが出来るよう、ネットワークのオプションをみていこう。
より複雑なプロビジョニング・スクリプトの場合、毎回ビルドする代わりに、事前にインストールされた目的のパッケージをもつカスタムVagrant Boxのパッケージを使うほうが、より効率的かもしれない。このトピックスはこの入門ガイド内では対象としていないが、Base Boxの生成の文書で見つけることが出来るだろう.
次の段階
Vagrantで初めての仮想マシンのプロビジョニングに成功した。さらにネットワーク設定について学習を進めよう。
ネットワーク設定
これまでにWebサーバを立ち上げ、ホストからファイルの変更ができるようにし、ゲストと自動的に同期するようにした。しかしながら、マシン内部のターミナルからWebページに単純にアクセスしている状態であり、満足していない。ここでは、ホストマシンからアクセスするための追加的なオプションを与えてくれる、Vagrantのネットワーク機能を使用する。
ポート・フォワーディング
一つのオプションは、ポート・フォワーディングを使用することである。ポート・フォワーディングによって、ゲストマシンのポートを、ホストマシン上のポートと共有するように指定することが出来る。これは、ホストマシンのポートにアクセスを許すのだが、実際にはすべてのネットワーク・トラフィックをゲストマシンの特定のポートに転送することができる。
ゲストマシンのApacheにアクセスすることが出来るように、フォワード・ポートを設定しよう。このように、Vagrantfileを単に編集するだけである。
Vagrant.configure("2") do |config|
config.vm.box = "hashicorp/precise64"
config.vm.provision :shell, path: "bootstrap.sh"
config.vm.network :forwarded_port, guest: 80, host: 4567
end
これらの変更が有効となるように、(マシンが稼動しているかどうかによって)vagrant reload
またはvagrant up
を実行する。
一旦マシンが再稼動すれば、ブラウザでhttp://127.0.0.1:4567
を読み込んでみよう。Vagrantによって自動的に設定された仮想マシンから送られたWebページを見ることが出来るだろう。
その他のネットワーク設定
Vagrantには、ゲストマシンに静的IPアドレスを割り当てるのを許したり、既存のネットワークにゲストマシンをブリッジ接続するなど他のネットワークの設定方法もある。もし、これら他のオプションに興味があるなら、ネットワーク設定のページを参照のこと。
次の段階
Vagrantを使った仮想マシンのネットワーク設定に成功した。さらにVagratでの共有設定について学習を進めよう。
共有
これまでに、Webサーバを起動しホストマシンからアクセス出来るようにし、そこそこの機能をもつ開発環境を手に入れた。しかし、開発環境を提供するのに加えて、Vagrantはこれらの環境の共有と協調をさせるのも簡単にできる。Vagrantにおける、この基本的な機能をVagrant共有と呼ぶ。
Vagrant共有は、そのVagrant環境をインターネットで接続された世界中の誰かと共有することが出来る。それは、インターネットで接続された世界中のデバイスからそのファイルVagrant環境への直接的な経路となるURLを与えてくれる。
HashiCorpのAtlasへのログイン
Vagrant環境の共有を可能とする前に、HashiCorpのAtlasのアカウントが必要となる。心配しなくてもよい。無料である。
アカウントを作成すれば、vagrant login
を使ってログインする。
$ vagrant login
Username or Email: mitchellh
Password (will be hidden):
You are now logged in!
SHARE
ログインできればvagrant share
を実行する。
$ vagrant share
...
==> default: Your Vagrant Share is running!
==> default: URL: http://frosty-weasel-0857.vagrantshare.com
...
URLは上記と異なるので、上のURLを試す事のないように。その代わりにvagrant share
によって出力されたURLをコピーして、Webブラウザからそこに訪れよう。先に設定したApacheのページが読み込まれるだろう。
もし、共有フォルダのファイルを変更しURLを更新した場合、それがアップデートされることがわかるだろう。このURLはそのVagrant環境に直接紐付いており、インターネットで接続された世界中のいかなるデバイスからもアクセスできる。
共有についての最後に、ターミナルにおいてCtrl+C
を押してみよう。URLをふたたび更新することで、もはや環境が共有されていないことが確認できるだろう。
Vagrant共有は単純なHTTP共有に比べ非常に強力である。より詳細を知りたければ、Vagrant共有ドキュメントを参照のこと。
Vagrantは商用のトラフィックを提供するように設計されていない。開発やQ/Aの用途の他で、Vagrant共有に依存するようなことはしなこと。Vagrant共有サービスは商用レベルのトラフィックを運ぶ様な設計はされていないのだ。
次の段階
おめでとう。世界に向けてその環境を共有することに成功した。さらにプロセスの終了について学習を進めよう。
終了
これまでに基本的なWeb開発のために使用できる、基本的な機能を備えた仮想マシンを手に入れた。しかし、今、他のプロジェクトで働かなければならなくなったり、昼食に行かなければならなかったり、ただ家に帰らなければならなかったりで使う機器のスイッチを切り替える時間がやってきたとしよう。果たしてどのようにして開発環境をきれいに始末するのだろうか?
Vagrantにおいて、ゲストマシンにsuspend、halt、そして、destroyを実行することが出来る。これらのオプションはそれぞれ長所と短所を持っている。場合に応じて適切な方法を選ぶこと。
休止/サスペンド 仮想マシンはvagrant suspend
を実行することでマシンのその時点での実行状態を保存し、マシンを停止させる。作業を再開する準備ができたら、vagrant up
を実行することで、休止した状態から再開することが出来る。この手法の主な長所は、停止から作業を再開するまでにおよそ5から10秒程度と早い点である。短所としては、仮想マシンがディスク容量を専有し続けることであり、また、ディスク上にすべての仮想マシンのRAMの状態保持するために、さらなるディスク領域を要求する点である。
停止/ホルト 仮想マシンはvagrant halt
を実行することでゲスト・オペレーティング・システムを安全に停止し、電源を切る。再起動の準備ができたらvagrant up
を使用することが出来る。この手法の主な長所は、ディスクの内容を保ちつつ、再び綺麗な状態から開始できるように、安全に停止することが出来る点である。短所としては、コールド・ブートからの開始のため、いくらか時間がかかる点であるのと、ゲストマシンがディスク領域を消費している点である。
破棄/デストロイ 仮想マシンはvagrant destroy
を実行することでシステム上のゲストマシンのすべての痕跡を除去する。ゲストマシンを停止し、電源を切り、ゲストのハードディスクのすべてを除去する。作業が再開出来るようになったら、vagrant up
を実行する。この手法の主な長所は、マシン上にゴミが残らないことである。ゲストマシンによって消費されたディスク領域とRAMは埋め立てられ、ホストマシンは綺麗なままである。短所としては、作業を再開するためにvagrant up
すると、マシンの再インポートや再プロビジョニングのために少し時間がかかるという点である。
次の段階
Vagrantにおいて仮想マシンの休止、停止、そして破棄に成功した。さらに環境の再構築について学習を進めよう。
再構築
プロジェクトに復帰する準備が整った時、それが明日であろうと、1週間後であろうと、1年後であろうと、復旧するのは簡単である。
$ vagrant up
これだけだ。Vagrant環境はすでにVagrantfileによってすべてが設定されているため、あなたもしくは同僚の誰かは、単にvagrant up
を実行するだけで、Vagrantは作業用の環境を再構築してくれる。
次の段階
Vagrant環境のすべてのライフサイクルの管理を習得した。さらにプロバイダについて学習を進めよう。
プロバイダ
この入門ガイドにおいて、プロジェクトは常にVirtualBoxをバック・エンドとしていた。しかし、VagrantはVMware, AWSや、その他、より多くのバック・エンドプロバイダで動作することが出来る。それらの設定などの、より詳細な情報については、それぞれのプロバイダのページを参照のこと。
一度プロバイダをインストールすれば、Vagrantfileの変更をする必要はない、ただ、次のように適切なプロバイダでvagrant up
を実行するだけである。
$ vagrant up --provider=vmware_fusion
クラウドへの移行の準備ができた?AWSでは、、、
$ vagrant up --provider=aws
一度vagrant up
を他のプロバイダで実行すれば、他のVagrantコマンドがどのプロバイダを使用するかを指定する必要はない。Vagrantは自動的にそれを検出することが出来る。SSHする準備ができた、destroyする準備ができた、また、そのほかの準備ができた、そんな場合にも通常通りvagrant destroy
のようにするだけである。他のフラグは不要である。
プロバイダに関する情報は、プロバイダのドキュメントを参照のこと。
次の段階
Vagrantの入門ガイドは以上で完了である。関連する興味深いであろう幾つかのトピックスを以下に示す。