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

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

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

boxファイルの選定

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

 boxファイルは、Vagrantの開発を行っているHashiCorpが運営する「Atlas」というサイトで公開されている。Atlasではさまざまなサードパーティが作成したboxファイルが登録されており、キーワードや条件を指定しての検索が可能だ(AtlasのVagrant Box検索ページ)。

 Atlasでは、「<登録者名>/<boxファイル名>」といった形でさまざまなboxファイルが登録されている。たとえば「chef/centos-7.0」は、設定管理ツールChefの開発元であるChef社が登録したCentOS 7.0ベースのboxファイルだ(図3)。

図3 Atlasで「CentOS」を検索した結果
図3 Atlasで「CentOS」を検索した結果

 また、同じく設定管理ツールであるPuppetの開発元であるPuppet Labsなどもboxファイルを提供している。いっぽうで無名の個人ユーザーが登録しているboxファイルなどもあるので、boxファイルを選ぶ際はその出自なども確認しておいたほうが良いだろう。

 もちろん、自分でboxファイルを作成することも可能だ(boxファイル作成に関する公式ドキュメント)。ただし、作業はやや面倒なので、初めのうちは上記のサイトなどで公開されている既存の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」コマンドを実行することも可能だ。たとえばAtlasに登録されている「chef/centos-7.0」というboxファイルを利用したい場合、次のように実行すれば良い。

$ vagrant init chef/centos-7.0

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

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'chef/centos-7.0'...
==> default: Matching MAC address for NAT networking...
==> default: Checking if box 'chef/centos-7.0' is up to date...
==> default: Setting the name of the VM: test_default_1423818480748_17162
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 22 => 2222 (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Connection timeout. Retrying...
    default:
    default: Vagrant insecure key detected. Vagrant will automatically replace
    default: this with a newly generated keypair for better security.
    default:
    default: Inserting generated public key within guest...
    default: Removing insecure key from the guest if its present...
    default: Key inserted! Disconnecting and reconnecting using new SSH key...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
==> default: Mounting shared folders...
    default: /vagrant => /home/hylom/test

 ここでダウンロードされた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(2) do |config|」から「end」の間に設定内容を記述すれば良い。

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

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

Vagrant.configure(2) do |config|
  
  
  config.vm.box = "chef/centos-7.0"
  
  
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'

 プライベートネットワークは、ホストと仮想マシンの間でのみ通信が行える仮想ネットワークインターフェイス(仮想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