ローカル環境でのサーバ構築自動化(VirtualBox+Vagrant)


背景

Windows端末のローカル環境で色々試す際に、サーバ構築を効率化したいために導入
調べると、VirtualBox+Vagrantの組み合わせで自動化しているケースがあったため、導入をしてみる。

今回の範囲

VirtualBox+Vagrantを組み合わせてコマンドラインにてVMを作成できることを確認するまでを実施。そのため、ネットワークIFが2つで、共有ディスクがあってなどの細かい?設定は気にせず、対象のOSでVMが立ったまでを見ます。

Vagrantとは

コマンドラインで、VirtualBoxやVMwareを操作することが可能なツール
Vagrantfileに構成情報を記載して、コードを実行することで、仮想マシンの構築が可能

簡単な流れは以下のイメージ。。これだけ書くと簡単に見える。。。

  1. vagrantBoxファイル(イメージファイル)の取得
  2. vagrantfileに構成情報の作成
  3. vagrantコマンドで仮想マシン起動

また、VMに対してシェルスクリプトを記載し実行できるため、MWインストールも可能。

環境

環境構築時のソフトウェアのバージョンは下記の通り

  • windows 10
  • VirtualBox 6.0.20
  • Vagrant 2.2.7

インストール

VirtualBox:こちらからDLしてインストール
Vagrant:こちらからDLしてインストール

環境

(とても雑ですが)環境のイメージは以下の通り。

VagrantでのVM構築

vagrantBoxファイル(イメージファイル)の取得

Boxファイル自体は、vagrantfileの記載の仕方から、

  • 構築時にインターネット上からBoxファイルを取得
  • 事前にローカルのVagrantに登録し取得しておいたBoxファイルを利用

することが可能だが、今回は、構築時にBoxファイルのDLが発生して待機時間が発生するのが嫌なので事前にDLしておく。

なお、構築時にインターネット上から取得する場合は(DL時間が発生するが、)初回の場合はローカルのVagrantBoxに登録も行うため、2回目以降は再度取得することはない。
また、別のVMの構築でも、ローカルのVargrantBoxに登録したBox名である場合は、ローカルのBoxを使用するため、DL時間は発生しない。
vagrantfileを他の環境でも使いまわすことも考えるなら、前者の方が良いのだろうと思う。

Boxファイルはインターネット上で公開されており、例えば、下記サイトから対象のイメージを検索することが可能
Vargrant Cloud:こちらで検索
Vagrantbox.es:こちらで検索

BoxファイルのURLパスを確認し、下記コマンドを実行することでBoxファイルを登録することが可能

コマンドプロンプト
> vagrant box add {VM名} {BoxファイルのURL}

なお、Vargrant CloudからBoxを取得する場合は、以下のような書き方でも取得できる。
VM名の部分は、Vargrant Cloudのサイトで対象のBoxイメージを確認すると記載してある。
例えば、2020/4時点でCentOS7の最新版"7.6.1811"を取得する場合は下記コマンドで可能。

コマンドプロンプト
> vagrant box add centos/7

また、旧バージョンを取得したい場合、例えば、今回はCentOS7.4を取得してみたが、その場合は下記の記載で取得可能。
box-versionオプションでバージョンを指定することで、OSのマイナーバージョンを指定することが可能。

コマンドプロンプト
> vagrant box add centos/7 --box-version 1803.01

つまり、Boxは、Box名とバージョンの組み合わせで一意になれば、どのようにでも登録可能となる。
ちなみに、上記のコマンドだとCentOS7.xのどのバージョン?となったので、今回は以下のコマンドでBoxを登録した。

コマンドプロンプト
> vagrant box add centos7.4.1708 https://vagrantcloud.com/centos/boxes/7/versions/1803.01/providers/virtualbox.box

URLの部分は、「vagrant box add centos/7 --box-version 1803.01」を実行した際に、実行時の標準出力で出てきたので、そちらを使用した。「1803.01」を変えれば他のCentOSのバージョンも取得できる。

ローカルにあるBoxファイルを登録したい場合は下記コマンドで可能。

コマンドプロンプト
> vagrant box add {VM名} {パス}

vagrantコマンド

command 内容
vagrant box add {VM名} {BoxファイルのURL} ローカルのBoxへ追加
vagrant box list ローカルのBox一覧取得
vagrant box remove {box名} ローカルのBoxからの削除
vagrant init vagrant初期化(Vagrantfile作成)
vagrant up vagrantからVM起動
vagrant ssh VMへのログイン
vagrant halt VM停止
vagrant reload VM再起動
vagrant destroy VM破棄

なお、今回はVertualBoxであるが、例えばVmwareで使いたい場合は、vagrantのコマンドに「--provider=●●●」をつけることで、操作が可能となる。(デフォルトはVertualBoxなので、このオプションは要らない。)

vagrantfileに構成情報の作成

vagrantfileを作成するにあたって、Vagrant用のフォルダを作成

コマンドプロンプト
> mkdir Vagrant & cd Vagrant

各仮想マシン用にフォルダを作成

コマンドプロンプト
> mkdir centos74 & centos74

下記コマンドにて、vagrant初期化して、vagrantfileのひな型を生成させる。

コマンドプロンプト
> vagrant init [vagrantbox名]

なお、vargrantbox名は、後でvagrantfileに追記できるため、コマンドにて指定する必要はない。

生成されたvagrantfileを参考に、必要な情報を記載。
今回は、最低限の構成情報で記載した内容で実行する。パラメータ等は次回に確認することとする。

vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "centos7.4.1708"
  config.vm.box_version = "0"
  config.vm.network "private_network", ip: "192.168.33.10"
end

config.vm.box:Box名
config.vm.box_version:Boxのバージョン指定(今回はBox名だけで一意になるので、記載しなくても問題ない)
config.vm.network:VMのネットワークIF設定

なお、バージョンを確認したい場合は、下記コマンドでBoxリストを出力し確認が可能

コマンドプロンプト
> vagrant box list
centos/7       (virtualbox, 1803.01)
centos7.4.1708 (virtualbox, 0)

vagrantコマンドで仮想マシン起動

vagrantfileの編集を終えたら、vagrantfileと同じフォルダで、下記コマンドを実行

コマンドプロンプト
> vagrant up

あとは待つだけ、、、と思ったら、下記エラーが発生し起動しない。

コマンドプロンプト
 VBoxManage.exe: error: Implementation of the USB 2.0 controller not found!

VirtualBoxの拡張機能が足らないことが原因らしいので、「Oracle VM VirtualBox Extension Pack」を導入
ここからDLして、VirtualBoxの
 ファイル>環境設定>機能拡張
で、DL資材を指定して、インストール完了させた後、再度、「vagrat up」を実行!

エラーがなく完了したら、ssh接続を行い、ログインを試みる。

コマンドプロンプト
> vagrant ssh

問題なければ、ログインができる。

環境のイメージとしてはこんな感じかなと。

後片付け

今回、確認したいことは一通り確認できたので、作成したVMを削除する。

まずは、下記コマンドでVMの停止

コマンドプロンプト
> vagrant halt

停止が完了したら、VMを下記コマンドで破棄する。

コマンドプロンプト
> vagrant destroy

VirtualBoxのGUI画面を確認すると消えていることが分かる。

さて、「vagrant destroy」コマンドでVMを破棄しても、vagrantfileとBoxファイルは残っているため、1コマンドで再作成が可能であり、すぐ復旧できるので、(VM作成後にOS上で作業した内容は当然消えているけど)便利ですね~。

今回は、ここまで。

vagrantfileの内容やvargrantコマンドについては次回見てみます。