仮想環境構築ツール「Vagrant」で開発環境を仮想マシン上に自動作成する

VagrantでVirtualBox用の仮想マシンを作成する

続いては、Vagrantで実際にVirtualBox用の仮想マシンを作る流れを説明しよう。

boxファイルの選定

Vagrantでは、OSのインストーラを使って仮想マシンにOSをインストールするのではなく、あらかじめOSがインストールされたディスクイメージを使用して仮想マシンを作成する。VagrantではディスクイメージやVirtualBoxの設定ファイル、メタデータなどを「box」(複数形は「boxes」)という形式のファイルにまとめて取り扱う仕組みだ。

Vagrantが公式に配布しているboxファイルはUbuntu 12.04 LTS(32ビットおよび64ビット)のみだが、サードパーティによるboxファイルの配布も行われている。

たとえば、設定管理ツールPuppetの開発元であるPuppet LabsはPuppet Labs Vagrant BoxesというサイトでCentOSやFedora、Debianなどのboxファイルを公開している。ここで配布されているboxファイルにはあらかじめPuppetがインストールされているため、環境設定にPuppetを利用する場合に特に有用だ(Puppetが含まれない「nocm」バージョンもダウンロード可能)。

また、同じく設定管理ツールChefの開発元であるChef社(旧社名Opscode)もboxファイルを公開しているおり、その一覧はChef社の「Bento」プロジェクトにて公開されている。こちらではCentOSやDebian、Fedoraに加え、FreeBSDのboxファイルも公開されている。

詳細は割愛するが、自分でboxファイルを作成することも可能だ(boxファイル作成に関する公式ドキュメント)。ただし、作業はやや面倒なので、初めのうちは上記のサイトなどで公開されている既存のboxファイルを使うことをおすすめする。

なお、Vagrantにはネットで公開されているboxファイルを自動的にダウンロードする機能があるため、事前にこれらをダウンロードしておく必要は無い。

設定ファイル「Vagrantfile」の作成

Vagrantでは、「Vagrantfile」というファイルに作成する仮想マシンの設定情報を記述する。「vagrant init」コマンドでこのファイルのひな形を生成可能だ。

$ vagrant init
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.

また、使用するboxファイルとその名称を指定して「vagrant init」コマンドを実行することも可能だ。たとえば「http://puppet-vagrant-boxes.puppetlabs.com/centos-64-x64-vbox4210.box」というboxファイルを使用し、その名称を「centos-6-x64」とする場合、以下のように実行すれば良い。

$ vagrant init centos-6-x64 http://puppet-vagrant-boxes.puppetlabs.com/centos-64-x64-vbox4210.box

このようにすると、boxファイルに関する情報が記述された以下のようなVagrantfileが生成される。

  # Every Vagrant virtual environment requires a box to build off of.
  config.vm.box = "centos-6-x64"

  # The url from where the 'config.vm.box' box will be fetched if it
  # doesn't already exist on the user's system.
  config.vm.box_url = "http://puppet-vagrant-boxes.puppetlabs.com/centos-64-x64-vbox4210.box"

続いて「vagrant up」コマンドを実行すると、指定したboxファイルがダウンロードされ、仮想マシンの作成と起動が実行される。

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
[default] Box 'centos-6-x64' was not found. Fetching box from specified URL for
the provider 'virtualbox'. Note that if the URL does not have
a box for this provider, you should interrupt Vagrant now and add
the box yourself. Otherwise Vagrant will attempt to download the
full box prior to discovering this error.
Downloading box from URL: http://puppet-vagrant-boxes.puppetlabs.com/centos-64-x64-vbox4210.box
Extracting box...te: 9182k/s, Estimated time remaining: 0:00:02)
Successfully added box 'centos-6-x64' with provider 'virtualbox'!
[default] Importing base box 'centos-6-x64'...
[default] Matching MAC address for NAT networking...
[default] Setting the name of the VM...
[default] Clearing any previously set forwarded ports...
[default] Clearing any previously set network interfaces...
[default] Preparing network interfaces based on configuration...
[default] Forwarding ports...
[default] -- 22 => 2222 (adapter 1)
[default] Booting VM...
[default] Waiting for machine to boot. This may take a few minutes...
[default] Machine booted and ready!
[default] Mounting shared folders...
[default] -- /vagrant

ここでダウンロードされたboxファイルは~/.vagrant.d/以下に保存され、2回目以降はダウンロードなしに仮想マシンを作成できる。

仮想マシンの起動後は、「vagrant ssh」コマンドで仮想マシンにログインできる。このとき、仮想マシンには「vagrant」というユーザー名でログインされ、通常のSSHと同様、シェルから抜ける(Ctrl-Dを入力する)ことで接続を切断できる。

$ vagrant ssh
Last login: Sun Apr 14 22:24:07 2013
Welcome to your Vagrant-built virtual machine.
[vagrant@localhost ~]$

なお、vagrantユーザーのパスワードは「vagrant」に設定されている。また、仮想マシンの稼働状況は「vagrant status」コマンドで確認できる。

$ vagrant status
Current machine states:

default                   running (virtualbox)

The VM is running. To stop this VM, you can run `vagrant halt` to
shut it down forcefully, or you can run `vagrant suspend` to simply
suspend the virtual machine. In either case, to restart it again,
simply run `vagrant up`.

そのほか、「vagrant halt」コマンドで仮想マシンの停止を、「vagrant destory」コマンドで仮想マシンの破棄が可能だ。

$ vagrant halt
[default] Attempting graceful shutdown of VM...

仮想マシンの環境設定

仮想マシンに割り当てるメモリ量などの環境設定は、設定ファイルであるVagrantfile内に設定値を記述することで行える。Vagrantfileで行える設定についてはVagrantのWebサイトで説明されているので詳細はそちらに譲り、ここではよく使われると思われる項目についてのみ解説しておこう。

Vagrantfileの書式

Vagrantfileはそれ自体がRubyによるプログラムとなっており、VagrantではRubyの機能を利用し、あたかも独自のDSL(ドメイン固有言語)を使って設定を記述しているかのように見せている。

この設定ファイルではAPIのバージョンによって設定内容を変更できるようになっている。「vagrant init」コマンドで生成したVagrantfileの場合、「Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|」から「end」の間に設定内容を記述すれば良い。

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
 
 ここに設定内容を記述する
 
end

Vagrantfile内では、「config」などのオブジェクトに値を設定することで設定を行う。たとえば、仮想マシンの作成に使用するboxファイルの名前およびその取得元URLは「config.vm.vox」および「config.vm.box_url」というプロパティで指定できる。

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "centos-6-x64"
  config.vm.box_url = "http://puppet-vagrant-boxes.puppetlabs.com/centos-64-x64-vbox4210.box"
end

ネットワーク関連の設定

仮想マシンのネットワーク設定は、デフォルトではベースとなるboxファイルで指定されているものが使われる。NATにより仮想マシンからインターネットへの接続が可能なように構成されているのが一般的だが、これに加えて追加で「ポートフォワーディング」および「プライベートネットワーク」、「パブリックネットワーク」といった設定を行うことも可能だ。これらの設定は、「config.vm.network」というプロパティで設定できる。

まず1つめのポートフォワーディング設定だが、これはホストマシンの指定したポート宛てのパケットを仮想マシンに転送(フォワーディング)するというものだ。NATによって仮想マシンからインターネットへの接続を実現している場合、ホスト以外から仮想マシンに直接アクセスすることはできないが、この機能を利用すればホスト以外から特定のポートへのアクセスが可能となる。

たとえば、ホストマシンの8080版ポートへの接続を仮想マシンの80番ポートに転送する設定は以下のようになる。

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

デフォルトではTCPでの接続のみがフォワーディングされるが、「protocol: 'udp'」というパラメータを追加することでUDPのパケットを転送するよう指定できる。

config.vm.network "forwarded_port", guest: 1024, host: 10240, protocol: 'udp'

2つめのプライベートネットワークは、ホストと仮想マシンの間でのみ通信が行える仮想ネットワークインターフェイス(仮想NIC)を作成するものだ。仮想NICはホストと仮想マシンの両方に作成され、それぞれが仮想的に1対1で接続される形となる。

たとえば、プライベートネットワーク機能を利用し、ホスト側の仮想NICには「192.168.100.1」というIPアドレスを割り当てる設定は以下のようになる。

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

なお、仮想マシン側のネットワークインターフェイスに対するIPアドレスの割り当てについてはVagrantは関知しない。そのため、仮想マシン内でなんらかの方法でIPアドレスの割り当てを行う必要がある。

プライベートネットワーク機能では、「virtualbox__intnet: <内部ネットワーク名>」というオプションパラメータを追加することで、仮想マシン間を接続した仮想ローカルネットワークを構築することも可能だ。たとえば、「network01」というローカルネットワークに接続させるには以下のように指定する。

config.vm.network "private_network", ip: "192.168.50.4", virtualbox__intnet: "network01"

この場合、仮想マシン側では「ホストオンリーアダプター」ではなく「内部ネットワーク」型のネットワークアダプタが作成される。

最後のパブリックネットワークは、「ブリッジ接続」を利用して仮想マシンがホストOSのネットワークと直接通信できるようにするものだ。この設定を利用するには、以下の設定項目をVagrantfile内に記述すれば良い。

config.vm.network "public_network"

この場合も、プライベートネットワークの場合と同様、仮想マシン側のネットワークインターフェイスに対しては仮想マシン内でなんらかの方法でIPアドレスの割り当てを行う必要がある。

また、ブリッジ接続に指定できるネットワークインターフェイスが複数ある場合、「:bridge」パラメータで使用するネットワークインターフェイスを指定できる。たとえば「eth0」を利用する場合、以下のようになる。

config.vm.network "public_network", :bridge => 'eth0'

プライベートネットワークおよびパブリックネットワーク設定を利用する場合、仮想マシンに新たなネットワークインターフェイスが追加される。そのため、追加されたネットワークインターフェイスに対するネットワーク設定が自動で行われるよう、利用するboxファイル側であらかじめ設定が行われている。これらに対応していないboxファイルの場合、仮想マシンへのネットワーク接続が行えず、仮想マシンの設定が完了しない場合があるため注意したい。

仮想化ソフトウェア固有の設定

Vagrantを使って仮想マシンを作成する場合、その仮想マシンはベースとするboxファイルに含まれる設定ファイルに従って作成される。たとえばVirtualBoxの場合、boxファイルにはovf形式の設定ファイルが含まれており、ここに仮想マシンが使用するCPU数やメモリ、仮想ハードウェア構成などが記載されている。これらを変更したい場合、boxファイル自体を変更するか、もしくはVagrantfile内でに設定を記述すれば良い。VirtualBoxの場合、VagrantのドキュメントのVirtualbox以下で設定方法が解説されている。詳しくはそちらに譲るが、例えば仮想マシンに割り当てるメモリ量を変更する場合、以下のように記述する。

config.vm.provider "virtualbox" do |v|
  v.memory = 512
end

ここで、「config.vm.provider "virtualbox" do |v|」というコードは「仮想化ソフトウェアとしてVirtualBoxを利用する場合のみ続く設定を実行する」という意味となる。続く「v.memory」が、仮想マシンに割り当てるメモリ量を指定するプロパティだ。この例の場合、仮想マシンに512MBのメモリを割り当てていることになる。

メモリ以外の設定項目を変更する場合はやや面倒で、以下のような書式となる。

config.vm.provider "virtualbox" do |v|
  v.customize ["modifyvm", :id, "<変更したい項目>", "<設定する値>"]
end

この書式では、VirtualBoxの管理用コマンドラインツール「VBoxManage」を呼び出して設定を行うことになる。第一引数の「"modifyvm"」ではVBoxManageの「modifyvm」コマンドを実行するということを意味しており、3つ目の引数にはmodifyvmコマンドで設定する項目を示すオプションを、4つ目の引数には設定する値を与える。

VBoxManageコマンドやmodifyvmコマンドについてはドキュメントを確認して欲しいが、たとえば使用する仮想マシンのCPU数を2に指定するには以下のように記述する。

config.vm.provider "virtualbox" do |v|
  v.customize ["modifyvm", :id, "--cpus", "2"]
end

>>次ページ:仮想マシンのプロビジョニング / ChefやPuppetを利用したプロビジョニング

【関連記事】
>>Vagrantで作った仮想マシンを簡単に共有できる「Vagrant Share」を使ってみる

おしらせ