Ubuntu 17.04 + Vagrant + Virtualbox ことはじめ

Vagrant は、Virtualbox や VMware 、Hyper-V などの仮想化ソフトウェアの補助ツールで、事前に用意した設定ファイルにもとづいてコマンド一発で仮想マシンを作成したり設定して立ち上げてくれたり、削除したりしてくれるツールです。設定ファイルさえ用意できれば、どのホストマシンででも、同一状態の仮想マシンを作ったり削除したりできるので便利です。
以下、Ubuntu17.04 上で Virtualbox を使うという前提で。

# 0.vagrant のおおまかな流れ
私がvagrant を勉強し始めた時、「いったいなにをしているのか」、というがなかなか理解・把握ができませんでした。大まかな流れと、どこにどういうデータを持つのか、というのを押さえるのが、理解の早道と思います。
おおまかな流れとしては、まず任意の専用ディレクトリを用意し、その中に置いた設定ファイルである"Vagrantfile"に書かれた内容に沿って、仮想マシンの雛形イメージである"Box"を、HashiCorp のサイト（https://atlas.hashicorp.com/boxes/search） からダウンロードして~/.vagrant.d/Boxes/ ディレクトリ内に置き、その"Box" をコピーして、~/VirtualBoxVMs 内に実際の仮想マシンを生成してくれます。同じ"Box"と"Vagrantfile"を使えば、ホストマシンが違っても、同じ状態の仮想マシンを生成できるわけです。また、仮想マシンをいじっていて、やり直したくなった場合にも、仮想マシンイメージを vagrant destroy でいったん削除してしまって、再度作成する、ということも手軽に試せるのです。"Box"が要らなくなった場合は、vagrant box remove です。

# 1.インストール
vagrantとvirtualboxをaptインストール。いずれもUbuntu 標準リポジトリにパッケージがあります。

```zsh
% sudo apt install vagrant
% sudo apt install virtualbox
```

# 2.最初の作業
設定ファイル"Vagrantfile"を置くためのディレクトリを作り、そこで作業開始。

```zsh
% mkdir vgrnt_test
% cd vgrnt_test
% vagrant status #仮想マシンの状態の一覧
% vagrant box list #box の一覧
% vagrant init #Vagrantfile の生成
% ls
```

# 3.Vagrantfile の中身
生成された"Vagrantfile"を見てみる。"box"の指定がきちんとできていないので、まだこのファイルでは仮想マシンの作成はできない。いろいろコメントで説明が書かれている (http://qiita.com/78tch/items/6e95991d9783c8b330ee) が、有効な部分は以下の３行のみである。

```zsh
% cat Vagrantfile 
Vagrant.configure("2") do |config|
  config.vm.box = "base"
end
```

1行目と3行目の間に設定を書いていく。1行目で指定が変えられるのは"2"の部分のみであり、ここは"1"とすることもできる。これはコンフィギュレーションバージョンを示しており、バージョン1とバージョン2があるが、いまから始めるのであれば"2"でいいでしょう。
2行目の"base"のところに、使いたいboxを指定する。
box は、自分で用意することもできるそうだけれども、HashiCorp のサイトで公開されているものを使うのが簡単である。指定の仕方は、

```zsh
% vagrant init $USER/$BOX
```

とすると、

```zsh
% cat Vagrantfile 
Vagrant.configure("2") do |config|
  config.vm.box = "$USER/$BOX"
end
```

となります。
これは、Atlas サイト (https://atlas.hashicorp.com/boxes/search) で、\$USER というIDの人が登録した \$BOX という名前の box をダウンロードしてきて、~/.vagrant.d/boxes/ に置き、これを雛形にして~/VirtualBoxVMs に仮想マシンを作る、という意味になります。

見た感じ、ubuntu さんの xenial64 というbox が良さそうなので、指定してみます。Vagrantfileをいちど削除してディレクトリに何もない状態に戻してから、改めて vagrant init します。


```zsh
% rm Vagrantfile
% vagrant init ubunt/xenial64 --minimal
% cat Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/xenial64"
end
% vagrant up #仮想マシンの起動 初回には、box のダウンロードもここで行われる
% vagrant status #ステータスの表示
% vagrant box list #ホストマシンに取り込み済のboxの一覧
% vagrant port #仮想マシンへのポートフォワーディング設定の一覧
% vagrant halt #仮想マシンの電源オフ
```

こうしてできた仮想マシンへは、vagrant ssh とするだけでログインできる。これは、仮想マシンの起動時にもちらっと

```zsh
==> default: Forwarding ports...
    default: 22 (guest) => 2222 (host) (adapter 1)
```

みたいな感じで出てる通り、ポートフォワーディングによって接続される。
ログインしてみてみるとこんな感じ。

```zsh
% vagrant ssh
Welcome to Ubuntu 16.04.2 LTS (GNU/Linux 4.4.0-78-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud

0 packages can be updated.
0 updates are security updates.


Last login: Sun May 28 05:52:22 2017 from 10.0.2.2
ubuntu@ubuntu-xenial:~$ hostname
ubuntu-xenial
ubuntu@ubuntu-xenial:~$ whoami
ubuntu
ubuntu@ubuntu-xenial:~$ sudo ls
ubuntu@ubuntu-xenial:~$ pwd
/home/ubuntu
ubuntu@ubuntu-xenial:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 16.04.2 LTS
Release:        16.04
Codename:       xenial
ubuntu@ubuntu-xenial:~$
```

あとは、ネットワークの設定と、仮想マシン（インスタンス）とbox（雛形）の管理（実際のデータがどこに置かれて、消すにはどうするか）ぐらいをこの記事に追記するつもり。