Young Leaves

Vagrantfile (Version2) の設定方法・設定例について

今回はVagrant の設定ファイル・Vagrantfile について説明します。本記事は2020年10月3日の記事であり、仕様などについて変更されている可能性があるためご注意ください。

仮想マシンを1台起動する

初めに、Vagrant Cloudにある既存のBoxイメージを使用した、最低限の設定にて仮想マシンを1台起動する方法について解説します。VagrantfileでBoxイメージを指定する場合、「config.vm.box」を使用します。例えば、「generic/centos8」というBoxを使用する場合は以下のように設定します。

Vagrant.configure("2") do |config|
  # Boxイメージを指定する
  config.vm.box = "generic/centos8"
end

Boxのアップデートをチェックする

VagrantのBoxのアップデートをチェックする場合、「config.vm.boxcheckupdate」を使用します。例えば、Boxのアップデートを有効とするには以下のように設定します。

Vagrant.configure("2") do |config|
  # Boxのアップデートがあるかどうかチェックする
  config.vm.box_check_update = true
end

プライベートIPアドレスを設定する

Vagrantで起動する仮想マシンにプライベートIPアドレスを設定する場合、「config.vm.network」の「private_network」を使用します。例えば、仮想マシンにプライベートアドレス「192.168.33.11」を設定する場合は以下のように設定します。

Vagrant.configure("2") do |config|
  # Boxイメージを指定する
  config.vm.box = "generic/centos8"

  # プライベートネットワーク「192.168.33.11」を設定する
  config.vm.network "private_network", ip: "192.168.33.11"
end

仮想マシンに複数のプライベートIPアドレスを設定する場合、「config.vm.network」を複数設定します。

Vagrant.configure("2") do |config|
  # Boxイメージを指定する
  config.vm.box = "generic/centos8"

  # プライベートネットワーク「192.168.33.11」「192.168.33.12」を設定する
  config.vm.network "private_network", ip: "192.168.33.11"
  config.vm.network "private_network", ip: "192.168.33.12"
end

ブリッジを使用する

Vagrantで起動する仮想マシンにブリッジのネットワークを使用する場合、「config.vm.network」の「public_network」を使用します。例えば、仮想マシンにブリッジネットワークを設定する場合は以下のように設定します。

Vagrant.configure("2") do |config|
  # Boxイメージを指定する
  config.vm.box = "generic/centos8"

  # ブリッジのネットワークを使用する
  config.vm.network "public_network"
end

フォワードするポートを指定する

Vagrantで起動する仮想マシンのポートのマッピングを指定するには、「config.vm.network」の「forwarded_port」を使用します。例えば、ゲストで80番ポート、ホストでIPアドレス127.0.0.1、8080番ポートをマッピングする場合は以下のように設定します。

Vagrant.configure("2") do |config|
  # Boxイメージを指定する
  config.vm.box = "generic/centos8"

  # ゲストで80番ポート、ホストでIPアドレス127.0.0.1、8080番ポートをマッピングする 
  config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: 127.0.0.1 
end

仮想マシンのスペックを指定する

Vagrantで起動する仮想マシンのスペックを指定する場合、「config.vm.provider」で「virtualbox」を使用します。virtualboxの指定後、「vb.customize」を使用し詳細な設定を行います。例えば、NATがホストマシンのDNSで名前解決を行い、メモリ512MB、CPU2コアのマシンを構築する場合は以下のように設定します。

Vagrant.configure("2") do |config|
  # Boxイメージを指定する
  config.vm.box = "generic/centos8"

  # NATがDNSのホストで名前解決を行い、メモリ512MB、CPU2コアのマシンを構築する 
  config.vm.provider "virtualbox" do |vb|
    vb.customize [
      'modifyvm', :id
      '--natdnshostresolver1', 'on',
      '--memory', '512'
      '--cpus', '2'
    ]
  end
end

また、Vagrantで仮想マシンの起動時にVirtualBoxの画面を表示させる場合は「vb.gui」を指定します。

Vagrant.configure("2") do |config|
  # Boxイメージを指定する
  config.vm.box = "generic/centos8"

  # NATがDNSのホストで名前解決を行い、メモリ512MB、CPU2コアのマシンを構築する 
  config.vm.provider "virtualbox" do |vb|
    vb.customize [
      'modifyvm', :id
      '--natdnshostresolver1', 'on',
      '--memory', '512'
      '--cpus', '2'
    ]

    # Vagrantで仮想マシンの起動時にVirtualBoxの画面も表示させる
    vb.gui = true
  end
end

共有フォルダを指定する

Vagrantで起動する仮想マシンで共有フォルダを設定する場合、「config.vm.synced_folder」を使用します。例えば、Vagrantfileと同じ場所にあるdataフォルダを共有フォルダとする場合は以下のように設定します。

Vagrant.configure("2") do |config|
  # Boxイメージを指定する
  config.vm.box = "generic/centos8"

  # 共有フォルダを設定する
  config.vm.synced_folder "data", "vagrant_data"
end

シェルスクリプトを使用してソフトウェアを追加する

Vagrant で起動する仮想マシンで事前にソフトウェアのインストール等のプロビジョニングを行いたい場合、「config.vm.provision」を使用します。例えば、UbuntuサーバにApacheをインストールした状態で仮想マシンを起動する場合は、事前にシェルスクリプトを作成します。

# Apacheをインストールするシェルスクリプトを作成する
vi apache_inst.sh

■apache_inst.sh
------------------------------------------------------------
#!/usr/bin/env bash

apt-get update > /dev/null 2&1
apt-get install -y apache2 > /dev/null 2>&1
------------------------------------------------------------

シェルスクリプト作成後、Vagrantfileで以下のように設定します。

Vagrant.configure("2") do |config|
  # Boxイメージを指定する
  config.vm.box = "bento/ubuntu-20.04"

  # シェルスクリプトを指定する
  config.vm.provision "shell", path: "apache_inst.sh"
end

複数の仮想マシンを設定する

Vagrantで複数の仮想マシンを同時に起動する場合、「config.vm.define」を使用します。例えば、Ubuntuサーバでwebとdbの2台の仮想マシンを起動する場合は以下のように設定します。

# Vagrantfileと同じ場所にdataフォルダを作成する
mkdir data

■ Vagrantfile
------------------------------------------------------------
Vagrant.configure("2") do |config|
  # Boxイメージを指定する
  config.vm.box = "bento/ubuntu-20.04"

  # 仮想マシン・webを設定する
  config.vm.define "web" do |web|
    web.vm.network "private_network", ip: "192.168.33.200"
  end

  # 仮想マシン・dbを設定する
  config.vm.define "db" do |db|
    db.vm.network "private_network", ip: "192.168.33.201"
  end
end
------------------------------------------------------------

仮想マシンごとにBoxイメージを分ける場合は、「config.vm.define」内に「vm.box」を設定します。

# Vagrantfileと同じ場所にdataフォルダを作成する
mkdir data

■ Vagrantfile
------------------------------------------------------------
Vagrant.configure("2") do |config|
  # Boxイメージを指定する
  config.vm.box = "bento/ubuntu-20.04"

  # 仮想マシン・webをUbuntu20.04で設定する
  config.vm.define "web" do |web|
    web.vm.box = "bento/ubuntu-20.04"
    web.vm.network "private_network", ip: "192.168.33.200"
  end

  # 仮想マシン・dbをCentOS8で設定する
  config.vm.define "db" do |db|
    db.vm.box = "generic/centos8"
    db.vm.network "private_network", ip: "192.168.33.201"
  end
end
------------------------------------------------------------