いまさら Vagrant に入門した

いまさら Vagrant に入門しました.

Vagrant って?

Virtual Box 等の仮想化ソフトのラッパーツールです.
通常は Virtual Box で仮想マシン(以下 VM)作って,OSインストールして,Guest Addition入れて,...って使えるようにするまで色々手順を踏む必要があると思いますが,Vagrant を使うとそんなオペレーションから開放されます.

どう使うの?

ざっくり説明するとこんな感じです.

すると VM ができちゃいます.

Vagrant をはじめるには?

まず,仮想化ソフトが必要です.
私は Virtual Box を使っています.
あと Vagrant が必要です.

Vagrant を使えるようにする

VitrualBox については https://www.oracle.com/technetwork/server-storage/virtualbox/downloads/index.html?ssSourceSiteId=otnjp からインストーラーを取得して実行してください.
Vagrant については https://www.vagrantup.com/downloads.html からインストーラーを取得して実行してください.

Vagrant の動作確認

まずはバージョンを表示してみます.

> vagrant --version
Vagrant 2.2.4

プラグインを導入する

すぐ VagrantVM を作りたくなるところですが,Guest Addition を入れたり,Proxy 設定したりと色々設定があるので便利なプラグインたちをまず導入します.

Proxy関係

※ Proxy に苦しめられていないかたは読み飛ばしてください.

私は Proxy に阻まれているので社外につなぐためには Proxy 設定が必須です.
そんなときはホストに vagrant-proxyconf プラグインをインストールします.
このプラグインによってゲストの Proxy 設定を自動でおこなってくれます.

> vagrant plugin install vagrant-proxyconf

Vagrantfile で proxy を設定する例です.

Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"
  # proxy 設定
  config.proxy.enabled  = true
  config.proxy.http     = "http://user_id:password@proxy_address:proxy_port"
  config.proxy.https    = "http://user_id:password@proxy_address:proxy_port"
  config.proxy.no_proxy = "localhost,127.0.0.1"
end

Guest Additions

ホストとゲストでファイルを共有するために必要です.
ホストに vagrant-vbguest プラグインをインストールするとゲストに自動でGuest Additions をインストールしてくれます.
Vagrantfile で特に設定は不要です.

> vagrant plugin install vagrant-vbguest

hosts

vagrant-hosts プラグインをインストールすると VM のホスト名を解決できるようになります.

> vagrant plugin install vagrant-hosts

Vagrantfile でホスト名解決を可能にする設定例です.
プロビジョニングで hosts の設定を有効にしています(プロビジョニングは vagrant up を実行する際にシェルを実行したりVMの設定をしたりする機能のことです).

Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"

  config.vm.define :vm1 do |vm1|
    vm1.vm.hostname = "vm1"
    vm1.vm.network "private_network", ip: "192.168.33.10"
    vm1.vm.provision :hosts, :sync_hosts => true
  end

  config.vm.define :vm2 do |vm2|
    vm1.vm.hostname = "vm2"
    vm2.vm.network "private_network", ip: "192.168.33.11"
    vm2.vm.provision :hosts, :sync_hosts => true
  end
end

Vagrant を使って CentOS7 の VM を作成する

プラグインを入れていよいよ準備が整いました.
まず任意のディレクトリを用意してそこに移動します.

> mkdir D:\vargrant\centos7
> mkdir D:\vagrant\centos7\shared
> cd D:\vagrant\centos7

続いて Vagrantfile を作成します.

> vagrant init -m

Vagrantfile を以下のように編集します.

Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"
  config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.synced_folder "./shared", "/home/vagrant/shared", owner: "vagrant", group: "vagrant"

  config.proxy.enabled  = true
  config.proxy.http     = "http://user_id:password@proxy_address:proxy_port"
  config.proxy.https    = "http://user_id:password@proxy_address:proxy_port"
  config.proxy.no_proxy = "localhost,127.0.0.1"
end

構成はこのようになりました.

D:\vagrant\centos7
┣Vagrantfile
┗shared

最後に vargant up すれば VM が起動します.

> vagrant up

VagrantSSH 接続する

Vagrantfile を置いたディレクトリで vagrant ssh すれば VM に接続できます.

> pwd
D:\vagrant\centos7
> vagrant ssh
Last login: Mon Jun 10 00:19:01 2019 from 10.0.2.2
[vagrant@centos7 ~]$ pwd
/home/vagrant

VM 作成時にシェルスクリプトを実行する

Vagrantfile を作成したディレクトリに start.sh を作成します.

yum update

Vagrantfile に シェルを実行するように設定します.

Vagrant.configure("2") do |config|
  ...
  config.vm.provision :shell, path: "./start.sh"
  ...
end

構成はこのようになりました.

D:\vagrant\centos7
┣Vagrantfile
┗start.sh

あとは vagrant up すればシェルが実行されます.

> vagrant up

Guest Addition インストール済みの CentOS7 の box を作る

毎回新しく VM を作成する際に Guest Addition をインストールしていると時間がかかるので Guest Addition インストール済みの box を作ってみます.

D:\vagrant\centos7ga
┗Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"
  config.proxy.enabled  = true
  config.proxy.http     = "http://user_id:password@proxy_address:proxy_port"
  config.proxy.https    = "http://user_id:password@proxy_address:proxy_port"
  config.proxy.no_proxy = "localhost,127.0.0.1"
  config.vm.provision "shell", inline: <<-SHELL
    yum update
  SHELL
end

まずは VM を作成して停止します.

> cd D:\vagrant\centos7ga
> vagrant up
> vagrant halt

box を作成します. --output で box 名を指定します.

> vagrant package default --output centos7ga.box

作成した box を使用するには box を登録する必要があります.

> vagrant box add centos7ga centos7ga.box

これ以降 Vagrantfile で以下のように作成した box を使うことができます.

Vagrant.configure("2") do |config|
  config.vm.box = "centos7ga"
end