コンテンツにスキップ

Vagrantfile@Vagrant

はじめに

本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。


01. Vagrantの仕組み

アーキテクチャ


ユースケース

Vagrantfileを使用して、プロバイダーとプロビジョナーを操作し、仮想環境を作成する。

Vagrantfile自体をプロビジョナーとして使用もできる。

プロビジョニングによりサーバー (物理サーバー、仮想サーバー) とコンテナを作成できる。

ただし、Vagrantは仮想サーバーの作成のために使用することが多い。

vagrant_provider_provisioner


プロバイダー

▼ プロバイダーとは

仮想環境を提供する。

▼ プロバイダーの種類

プロバイダー名 補足
VirtualBox https://www.vagrantup.com/docs/providers/virtualbox
VMWare https://www.vagrantup.com/docs/providers/vmware
Docker https://www.vagrantup.com/docs/providers/docker
Hyper-V https://www.vagrantup.com/docs/providers/hyperv


プロビジョナー

▼ プロビジョナーとは

プロバイダーによって作成された仮想環境に、ソフトウェアをインストールできる (構成管理できる) 。

具体的には、プログラミング言語やファイアウォールをインストールする。

▼ プロビジョナーの種類

プロビジョナー名 ユースケース 補足
シェル Vagrantfile自体をプロビジョニングツールとして使用する。 https://www.vagrantup.com/docs/provisioning/shell
Ansible Vagrantfileでプロビジョニングを実行する代わりに、Ansibleを使用する。 https://www.vagrantup.com/docs/provisioning/ansible
CFEngine Vagrantfileでプロビジョニングを実行する代わりに、CFEngineを使用する。 https://www.vagrantup.com/docs/provisioning/cfengine
Chef Vagrantfileでプロビジョニングを実行する代わりに、Chefを使用する。 https://www.vagrantup.com/docs/provisioning/chef_common
Docker Vagrantfileでプロビジョニングを実行する代わりに、Dockerfile (に似た記述) を使用する。 https://www.vagrantup.com/docs/provisioning/docker
Puppet Vagrantfileでプロビジョニングを実行する代わりに、Puppetを使用する。 https://www.vagrantup.com/docs/provisioning/puppet_apply


Vagrantfile

プロバイダーとプロビジョナーの一連の操作内容を設定する。

チームメンバーが別々に仮想環境を作成する場合、プロバイダーとプロビジョナーの処理によって作られる仮想サーバーの環境に、違いが生じてしまう。

Vagrantfileにプロバイダーとプロビジョナーの操作を設定しておけば、チームメンバーが同じソフトウェアの下で、仮想サーバーを作成し、ソフトウェアをインストールできる。


02. Vagrant.configure

Vagrant.configureとは

Vagrantfileのバージョンを設定する。

Vagrant.configure("2") do |config|

  # その他の全てのオプションを設定する。

end


03. config.vm

config.vmとは

仮想環境の構成を設定する。


config.vm.box

▼ boxとは

仮想環境のベースとするボックス名を設定する。

Vagrant.configure("2") do |config|

  config.vm.box = "foo"

end


config.vm.hostname

▼ hostnameとは

仮想環境にホスト名を設定する。

Vagrant.configure("2") do |config|

  config.vm.host = "foo-server"

end


config.vm.box_check_update

▼ box_check_updateとは

Vagrantの更新通知を設定する。

Vagrant.configure("2") do |config|

  config.vm.box_check_update = false

end


config.vm.network

▼ networkとは

仮想環境のネットワークを設定する。

▼ forwarded_port

ホストから仮想環境へポートフォワーディングを設定する。

Vagrant.configure("2") do |config|

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

end

▼ private_network

仮想環境にプライベートIPアドレスを設定する。

同じプライベートネットワーク内の他の仮想環境とのみ、通信できるようになる。

他の仮想環境とIPアドレスが重複しないようにする必要がある。

Vagrant.configure("2") do |config|

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

end


config.vm.provider

▼ providerとは

プロバイダー固有のオプションを設定する。

▼ virtualbox

Vagrant.configure("2") do |config|

  config.vm.provider "virtualbox" do |vb|
    vb.cpus = "2"
    vb.gui = true
    vb.memory = "1024"
  end

end

▼ docker

Vagrant.configure("2") do |config|

  config.vm.provider "docker" do |docker|
    docker.build_dir = "./docker/Dockerfile"
    docker.has_ssh = true
  end

end


config.vm.provision

▼ provisionとは

仮想環境のプロビジョニングを設定する。

▼ shell

shellを使用して、仮想環境のプロビジョニングを実行する。もしVagrantがサポートしていないプロビジョニングツールを使用する場合は、これ自体をインストールしておく必要がある。シェルが複数行に渡る場合は、Rubyのヒアドキュメント形式 (<<-) を使用すると良い。

Vagrant.configure("2") do |config|

  config.vm.provision "shell", inline: <<-SHELL
    apt-get update
    # fooというプロビジョニングツールをインストールする。
    apt-get install -y foo
  SHELL

end

▼ ansible

ホスト側にAnsibleをインストールし、加えて仮想環境のプロビジョニングを実行する。

開発環境ではこのオプションを使用することは非推奨で、ansible_localオプションを使用することが推奨である。

Vagrant.configure("2") do |config|

  config.vm.provision "ansible" do |ansible|
    ansible.playbook = "playbook.yml"
    ansible.inventory_path = "inventory.yml"
  SHELL

end

▼ ansible_local

仮想環境側にAnsibleをインストールし、加えて仮想環境のプロビジョニングを実行する。

注意点としては、開発環境ではコントロールノードと管理対象ノードが同じサーバー (仮想環境) になるため、コントロールノードは自分で自分を指定してプロビジョニングを実行することになる。

開発環境ではこのオプションを使用することが推奨されており、ansibleオプションを使用することが非推奨とされている。

Vagrant.configure("2") do |config|

  config.vm.provision "ansible_local" do |ansible|
    ansible.playbook = "playbook.yml"
    ansible.inventory_path = "inventory.yml"
  SHELL

end

ただし、Vagrantからではなく、Ansibleを直接的に操作したい場合は、shellオプションでAnsibleをインストールする必要がある。

こちらが推奨である。

Vagrant.configure("2") do |config|

  config.vm.provision "shell", inline: <<-SHELL
    apt-get update
    # Ansibleをインストールする。
    apt-get install -y ansible
    # Ansibleを直接的に操作する。
    ansible-playbook /etc/ansible/playbook.yml -i inventory.yml
  SHELL

end


config.vm.synced_folder

▼ synced_folderとは

ホストのディレクトリを仮想環境にマウントする。

Vagrant.configure("2") do |config|

  config.vm.synced_folder ".", "/var/www/foo"

end

▼ type

マウント方法を設定する。

デフォルト値は、VirtualBox共有ディレクトリである。

その他、NFS、RSync、SMBを設定できる。

Vagrant.configure("2") do |config|

  config.vm.synced_folder ".", "/var/www/foo", type: "nfs"

end

ホストと仮想環境間のファイルのIOPSによって、性能に差がある。

以下のリンクで、ロードテストを実施したところ、『RSync > SMB > VirtualBox共有ディレクトリ』の順で性能が良かった。

また、『RSync > NFS』『NFS > SMB』である。

これらから、おおよそ『RSync > NFS > SMB > VirtualBox共有ディレクトリ』の順で性能が良くなると考えておけばよい。