[公式ドキュメントで入門] Vagrantチュートリアル (翻訳+徹底解説付き)

![](https://paper-attachments.dropbox.com/s_58D2B86AF594AA3DDDDBF91B0DA004CC991E1FFC527D7EF3538B9EAD16F96A6A_1599753955486_Vagrant_PrimaryLogo_FullColor.png)

# はじめに
[Zenn](https://zenn.dev/kumamoto/articles/8342de18e5406098b939)の方にも筆者本人が転載しました。基本的にこちらの方を消すつもりは特に無いのでどちらを読んでもおｋ。
## 対象読者
- 仮想環境って聞いたことはあるけど実際に使ったことはない。
- ターミナル の基本的なコマンド(cd, ls, mkdirなど)はなんとなくわかる。
- さらっとVirtualBox/Vagrantの基本をおさえて使ってみたい。
- 仮想環境を使ってLinuxを勉強してみたい。

## 内容紹介

上記のような方が__Vagrant__の概要と使い方を短時間でさらっと掴めるように

- [イントロダクション “Introduction to Vagrant”](https://www.vagrantup.com/intro)
- [クイックスタート “Getting Started”](https://learn.hashicorp.com/collections/vagrant/getting-started)

の二つのVagrant公式ドキュメント記事を翻訳してまとめました。

また上記の２つのドキュメントをまとめるにあたって、(初学者でも)出来るだけこのQiita記事のみで理解が出来るように、__補足説明をかなり丁寧に付け加えました。__

特に__「公式ドキュメントを読む上で知っておくべき概念/用語」と「VirtualBoxとVagrantのインストール」に関しては補足のために独立した章として解説を加えてあります。__
(必要ない方はもちろん飛ばしておｋ！[こちらからどうぞ！](
https://qiita.com/digitalhimiko/items/a1e38d4303cf38185acf#%E5%85%AC%E5%BC%8Fintroduction-to-vagrant))

※「ここがわからん！━(ノдヽ)━」ってポイントがあれば是非是非コメントください！また「この翻訳は意訳しすぎで駄目！この補足説明はおかしい！(｀Д´)」というご指摘もお願い致します。<(_ _)>

# [事前準備その1] 知っておくべき概念/用語

ここでは次の章で実際にVirtualBoxとVagrantを用いて仮想環境を構築する前に、知っておくと理解が捗る用語を補足として__7つ__のトピックに分けて解説していきます。


## 1. VirtualBoxによる仮想化とは？

__VirtualBox__とは[IT用語辞典/e-Words](http://e-words.jp/w/VirtualBox.html)によれば『オープンソースの仮想化ソフトウェアの一つ。オペレーティングシステム（OS）上で実行されるアプリケーションの一つとして仮想的なコンピュータ（仮想マシン/VM：Virtual Machine）を構築し、その上で別のOSを実行することができる』ものです。

![](https://paper-attachments.dropbox.com/s_58D2B86AF594AA3DDDDBF91B0DA004CC991E1FFC527D7EF3538B9EAD16F96A6A_1599756052599_+2020-09-11+1.40.24.png)


MacやWindows、Linuxといったホスト(土台となる)OSの上に異なるOSを持つ仮想的なマシンを動かせるのが特徴です。Vagrantではこういった(VirtualBoxを含めた)仮想化ソフトウェアのことをプロバイダと呼んでいます。

上記の筆者作成図ではホストOSの上に仮想化ソフトウェアが載っています。これをホストOS型の仮想化と呼びます。(これ以外にもハイパーバイザー型等あるのですが今回は割愛します。)

__OSの上に別のOSで動く仮想マシン載せてるんだなぁという理解で今のところは問題ありません。__


## 2. プロバイダ(Provider)とは

__仮想環境を提供するソフトウェア__のことです。Vagrantはこの仮想環境上に仮想マシンを構築し、操作します。今回は基本となる__VirtualBox__を用いますが、プラグインでVMWare Fusion(Workstation)やAWS(EC2)、Rackspaceなども追加可能です。


## 3. プロビジョニング(Provisioning)とは

__仮想マシンへに『Webサーバー(ApacheやNginx)、プログラミング言語(PHP、Python、Ruby,,,etc)、DBMS(PosgreやMySQL,,,etc)』といったソフトウェアをインストール・設定__すること、です。

今回は公式ドキュメントに沿って__シェルスクリプト__を用いますが、他にもAnsible、Chef、Puppetなどのプロビジョニングツールが使用できます。


## 4. Boxファイルとは

仮想マシンを起動する際にベースとなるイメージファイルのことです。__仮想マシンのテンプレート__のようなものと思ってもらえれば良いです。


## 5. Vagrant cloudとは

[Vagrant clooud](https://app.vagrantup.com/boxes/search)とは公式が用意してくれている__Boxファイルの公開サイト__です。
@alfaさんのQiita記事[『Vagrantの正しいはじめ方』](https://qiita.com/alfa/items/dd9e704ebc86b957b174)を読むまでは私も[vagrantbox.es](http://www.vagrantbox.es/)という非公式のBoxファイルサイトから落としてきていました。Vagrantの公式ドキュメントをしっかり読む良いきっかけになりました。深謝です！

## 6. Vagrantfileとは

__仮想マシンの構築(Vagrantを使って構築する仮想マシンのスペックやプロビジョニングツールの指定など)を記述するファイル__です。


## 7. Vagrantコマンドとは

[ターミナル](https://ja.wikipedia.org/wiki/%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB_(macOS))上で簡単にVagrantを操作出来るようにするコマンドのことです。

## ここまでのまとめ

VirtualBoxのみでも仮想化は可能なのですが、Vagrantを用いることで__「Vagrantfile」で仮想環境の設定情報を簡単に設定/共有し、「Vagrantコマンド」でそれを実行することで、環境構築を非常に楽にすることが出来る__のです。


# [事前準備その2] VirtualBoxとVagrantのインストール

##  VirtualBoxをインストール

まず[OracleのVirtualBox公式ページ](https://www.virtualbox.org/)へアクセスして、

![](https://paper-attachments.dropbox.com/s_2E17B88405407FE1BF0414AA8274BB8EA26DF498E8D7DB2B0D2609A78546510D_1599320130884_+2020-09-06+0.35.05.png)


左側のDownloadsから自分の環境にあったものをクリックしてダウンロード！

![](https://paper-attachments.dropbox.com/s_2E17B88405407FE1BF0414AA8274BB8EA26DF498E8D7DB2B0D2609A78546510D_1599320280444_+2020-09-06+0.37.49.png)


インストーラーが開いてからは、全てに肯定的に回答すればインストールが無事終わります。


#  Vagrantのインストール

[Vagrantの公式ページ](https://www.vagrantup.com/)へアクセスしてDownloadボタンをクリック！

![](https://paper-attachments.dropbox.com/s_2E17B88405407FE1BF0414AA8274BB8EA26DF498E8D7DB2B0D2609A78546510D_1599320537958_+2020-09-06+0.42.07.png)


自分の環境にあったものを選択してDownloadボタンをクリック！
dmgファイルがダウンロードされるのでそれをクリック！

![](https://paper-attachments.dropbox.com/s_2E17B88405407FE1BF0414AA8274BB8EA26DF498E8D7DB2B0D2609A78546510D_1599320645323_+2020-09-06+0.43.53.png)


Vagrant.pkg をダブルクリックしてインストーラを起動させます。
選択は「続ける」をクリックしていけば良いです。

![](https://paper-attachments.dropbox.com/s_2E17B88405407FE1BF0414AA8274BB8EA26DF498E8D7DB2B0D2609A78546510D_1599320723266_+2020-09-06+0.45.06.png)


以上でVirtualBoxとVagrantのインストールは終了です！
いよいよ次から公式ドキュメントの読解を進めていきます！

# [公式][Introduction to Vagrant](https://www.vagrantup.com/intro)
## Vagrantとは

Vagrantは仮想マシン環境を(単一の業務手順で)構築・管理するためのツールです。
使いやすいワークフローと自動化に焦点を当てたVagrantは、開発環境のセットアップ時間を短縮し生産性の平均水準(production parity)を押し上げてくれます。


## Why Vagrant

Vagrantは設定が容易で(チームの誰でも)再現性出来る、ポータブル(移植可能な)作業環境を提供してくれます。

またその環境は業界の標準となっている技術に基づいて構築されており、あなたのチームの生産性と柔軟性を最大化するのに役立つ単一の一貫したワークフローにより管理されます。

Vagrantは様々な巨人の肩に乗る(既存の技術の組み合わせの上に立つ)ことでその威力を発揮します。

仮想マシンはVirtualBoxのような仮想環境の他、VMware、AWS、または他のプロバイダーの上にプロビジョニング(provisioning)されます。シェルスクリプト、Chef、Puppetなどの業界標準のプロビジョニングツールを使用することで、仮想マシン上にソフトウェアを自動的にインストールして設定することができます。



## デベロッパーの方々に向けて

 Vagrantは依存関係と一連の設定を単一の一貫した使い捨て環境中で分離します。またその際に自分の使い慣れたツール(例えばエディタ やブラウザ、デバッカなど)が使えなくなるということは一切ありません。
 
 一度、(あなたを含めた)誰かがVagrantfileを一つ作成してしまえば、`vagrant up`とコマンドを打つだけで自分の仕事に必要な物は全てインストールされ設定も済みます。
 
 チームの他メンバーも同じ設定から開発環境を作成しているので、Linux、Mac、WindowsのどのOS上で作業していたとしても、チームメンバーは同一環境で同じ依存関係を反映した、全く同じように設定された、コードを走らせることになります。
 
これで「 自分の環境でしか発生しない現象(バグ)」とはお別れできますね！


## オペレーター/Dev opsの方々に向けて

Vagrantは、インフラの管理スクリプトの開発とテストのため、使い捨て環境と一貫したワークフローを提供します。

シェルスクリプトやChef cookbook、Puppetモジュール、その他VirtualBoxやVMwareのようなローカルの仮想環境に用いるものをすぐにテスト出来ます。

そして同じ構成でこれらのスクリプトをリモートのクラウド環境(AWSやRackSpaceなど)で同じフローに基づいてテスト出来ます。

(AWSの)EC2インスタンスをリサイクルするためにカスタムしたスクリプトを捨て、様々なマシンへSSHプロンプトをジャグリングするのを辞めて、代わりにVagrantを使って自分の生活に正気を取り戻しましょう！


## デザイナーの方々に向けて

VagrantはWebアプリケーションに必要案設定を全て自動で行ってくれるので、デザイン業務にのみ集中出来るようになります！

一度開発者がVagrantを設定してしまえば、そのアプリを動作させる方法について二度と思い悩む必要はないわけです。

デザインテストのために、他の開発者に自分の環境の修正を手伝ってもらう必要はもうありません。デザイナーの皆さんは、コードをチェックして、`vagrant up`して、デザインを始めるだけで良いんです！


## 全ての人に向けて

Vagrantは最も容易、かつ最速で仮想環境を作るためにデザインされたソフトウェアです！
次の章ではいよいよVagrantのクイックスタートガイドに入ります！


# [公式][Getting started](https://learn.hashicorp.com/collections/vagrant/getting-started)
## [1. Quick Start](https://learn.hashicorp.com/tutorials/vagrant/getting-started-index)
### 前提

- Vagrantをインストールしていること
- VirtualBoxをインストールしていること



### VirtualBox上でUbuntu 18.04 LTS 64-bit.仮想マシンを起動させる

Boxファイル名は作者が作ってくれています。Vagrant clooudから落とす場合はurlの記載がいりません。

```
    //Boxファイルを指定してVagrantfileを作成
    $ vagrant init hashicorp/bionic64
    //VMの立ち上げ
    $ vagrant up
    //VMの状態確認
    $ vagrant status
    //ssh接続
    vagarnt ssh
    //VMの削除
    $ vagrant destroy
```

`vagrant up`コマンドを打つだけでプロジェクトに必要な全て(依存関係のあるソフトのインストールやネットワーク、同期されたファイルのセットアップなど)を用意してくれるので自分のマシンで快適に作業が出来ます！



## [2. Install Vagrant](https://learn.hashicorp.com/tutorials/vagrant/getting-started-install)
### 自分のOS環境にあったVagrantのインストール

※前章でインストール済みでない場合はインストールしてください。


### インストールされたか確かめる

ターミナルを立ち上げて下記の3つのコマンドのどれかを打ち込んでみましょう。

```
    $ vagrant
    $ vagrant -h
    $ vagrant -v
```

※__注意__
いくつかのOSのディストリビューションには上流のパッケージレポジトリにvagrantパッケージが含まれている物もあります。そういう場合には(そのディストリビューションの)パッケージマネージャーを用いたインストールは辞めてください。
(パッケージの依存関係から問題が生じることもあります。)ダウンロードページをご利用ください。


## [3. Initialize a Project Directory](https://learn.hashicorp.com/tutorials/vagrant/getting-started-project-setup)


### Vagrantfileの作成

(1)自分のPJのルートディレクトリを指定。Vagrantの設定オプションの多くは、このルートディレクトリからの相対的なものです。
(2)自分のPJに必要なマシンとリソースの種類を記述。また同じようにどのソフトウェアをインストールするか、どのようにアクセスしたいかも記述する


- ディレクトリを作成

```
    //vagrant_getting_startedディレクトリを作成
    $ mkdir vagrant_getting_started
    //vagrant_getting_startedディレクトリに移動
    $ cd vagrant_getting_started
```

- ディレクトリを初期化

```
    $ vagrant init hashicorp/bionic64
```

vagarant init(組み込み関数ですが)はboxファイル名とURLを引数にとります。
これでVagrantfileが同じディレクトリに出来ているはずです。このファイルはバージョン管理の対象となることを意図されており、新規のチームメンバーがこのvagrantfileを使ってすぐに環境構築出来るようにしています。


## [4. Install and Specify a Box](https://learn.hashicorp.com/tutorials/vagrant/getting-started-boxes)

Vagrantでbaseイメージ(イメージファイル)を使えば素早く仮想マシンをクローンすることが出来ます。
こうしたbaseイメージはVagrantではBoxファイルとして知られています。またBoxファイルの指定はVagrantfileの作成後に常にやる仕事の一つであり、一番最初にやるべきことでもあります。


### Boxファイルをインストールする(オプショナル)

(後々に習得するコマンドでこの作業は基本的に不要となりますが)もし、Vagrantfileを作成することなく、boxファイルをインストールしたい時に役立つこともあるのでBoxファイルをインストールするコマンドについて解説します。

```
    $ vagrant box add hashicorp/bionic64
    $ vagrant box add ユーザー名/box名
```

Boxは現在のユーザー向きにグローバルに保存されます。またそこからそれぞれのPJでboxファイルをイニシャルのイメージとして使用出来ます。(つまり二つのプロジェクトで同じBoxファイルを使用していて、片方でファイルを追加しても、もう片方には影響が出ない、ということです。)
boxファイル部分はURLやローカルのファイルパスでも代替可能です。


### Boxファイルを使う

Vagrantfileを開いて、config.vm.boxにBoxファイル名を指定しましょう。
もし仮にboxが事前に追加されていなくてもVagratは起動の際に自動でboxをダウンロードし追加してくれます。(だから上で紹介したBox追加作業は基本的にいらないんです。)

config.vm.box_versionかconfig.vm.box_urlでバージョンを明示的にすることも出来ます。(両方とも必須ではない。)

```
    Vagrant.configure("2") do |config|
      config.vm.box = "hashicorp/bionic64"
      config.vm.box_version = "1.0.282" #->optionnal:config.vm.box_version = "1.0.282"
      #config.vm.box_url = "https://vagrantcloud.com/hashicorp/bionic64"
    end
```

### 他のBoxを探す

[Vagrant cloud](https://app.vagrantup.com/boxes/search)で探しましょう！
※有料アカウントを使えば組織内で限定のBoxを公開したり出来るが今回はパスします。


## [5. Boot an Environment](https://learn.hashicorp.com/tutorials/vagrant/getting-started-up)
- VM(仮想マシン)を立ち上げよう

下記のコマンドを打てば1分ほどでUbuntuで動くVMが立ち上がるはずです

```
    $ vagrant up
```

### [補足] コマンドとGUIでそれぞれVMの状態を確認する

まずコマンドで状態を確認します。

```
    $ vagrant status
```

次にGUI(グラフィカルユーザーインターフェース)でVMが立ち上がっているのを確認します。
起動時にVirtualBox立ち上げがされるようにVagrantfileを書き換えします。

```
    //GUIモードを有効にするためコメントアウトを2つ外す
    config.vm.provider "virtualbox" do |vb|
    #   # Display the VirtualBox GUI when booting the machine
    vb.gui = true
    #
    #   # Customize the amount of memory on the VM:
    #   vb.memory = "1024"
    end
```

これで自動的にVirtualBoxが立ち上がるようになるはずです。
ただ(公式ドキュメントでやっているように)SSH接続で動かす方がいつものterminalで動かせて楽なのでオススメです！


### SSH接続する

立ち上げた仮想マシンにSSH接続してみましょう。

```
    $ vagrant ssh
```

ssh接続から抜けたければ`exit`か`logout`と打つか、ctrl + dと押しましょう。

SSH接続したらまずVagrantfileがあることを確認しましょう

```
    [vagrant@localhost ~]$ pwd
    /home/vagrant
    [vagrant@localhost ~]$ cd ../../
    [vagrant@localhost /]$ ls
    bin   dev  home  lib64       media  opt   root  selinux  swapfile  tmp  vagrant
    boot  etc  lib   lost+found  mnt    proc  sbin  srv      sys       usr  var
    [vagrant@localhost /]$ ls vagrant/
    Vagrantfile
    [vagrant@localhost /]$
```

※__警告！！__
__仮想マシンだからって`rm -rf/` なんてやっちゃダメ！！__というのもVagrantは`/vagrant`にあるディレクトリをあなたのVagrantfileを含むホスト上のディレクトリと共有していて、これも削除されてしまうことになってしまいます！共有フォルダの詳細については次の節で解説していきます。



### 仮想マシンを破棄する

ssh接続を抜けて、マシン作成時に作成されたリソースを全て削除しましょう。

```
    $ vagrant destroy
        default: Are you sure you want to destroy the 'default' VM? [y/N] y ->yと入力！
    ==> default: Forcing shutdown of VM...
    ==> default: Destroying VM and associated drives...
    
    //vagrantの状態を確認
    $ vagrant status
    Current machine states:
    
    default                   not created (virtualbox)
    
    The environment has not yet been created. Run `vagrant up` to
    create the environment. If a machine is not created, only the
    default provider will be shown. So if a provider is not listed,
    then the machine is not created for that environment.
    
    //ちなみにBoxファイルはなくなっていない
    $ vagrant box list
    hashicorp/bionic64  (virtualbox, 1.0.282)
```


### Boxファイルも削除する

```
    $ vagrant box remove hashicorp/bionic64
    Removing box 'hashicorp/bionic64' (v1.0.282) with provider 'virtualbox'...
```

ここまでで一通り、Vagrantでの環境構築、操作、破棄について学べました。
次の節からでは自分のローカルPCと(ゲストの)仮想マシンを間でファイルを同期する方法について学んでいきましょう。


## [6. Synchronize Local and Guest Files](https://learn.hashicorp.com/tutorials/vagrant/getting-started-synced-folders)

SSH接続先のプレーンなvimエディタでファイルを編集したいという人は多くないと思います。

Vagrantではファイルを、ローカル-SSH先ゲストPC間で自動的に同期してくれます。
これにより、ローカルで編集したファイルを、仮想開発環境で実行することが出来ます。

デフォルトで、Vagrantはあなたのプロジェクトディレクトリ(3. Initialize a Project Directoryの `vagrant init`でVagrantfileを作ったディレクトリ)をゲストマシンの/vagrantディレクトリに共有します。

では実際にゲストマシンとのローカルPCでのファイル共有がどのように行われているのか確認していきましょう。


### 共有ファイルの振る舞いを見てみよう

※__注意__ `vagrant ssh`した時のホームディレクトリである`/home/vagrant`はローカルでのファイル共有先とは違います。(共有先はルート直下の`/vagrant`ディレクトリ)

まずssh接続して/vagrantディレクトリに移動しましょう。

```
    $ vagrant ssh
    $ cd ../../vagrant
    $ pwd
    ->/vagrant
```

/vagrrantディレクトリでhogeファイルを新規作成して

    $ touch hoge

ローカルのプロジェクトファイルにもhogeディレクトリがあることが確認できました！

    $ exit
    logout
    $ ls
    Vagrantfile hoge

With synced folders, you can continue to use your own editor on your host machine and have the files sync into the guest machine.
同期されたファイルを使って

次はローカルのマシン上でfuga.htmlというファイルを作ってVMでもそのファイルが同期されるかみてみましょう。



まず、ローカルでファイルを作ります。

    $ touch fuga.html
    $ ls 
    Vagrantfile hoge fuga

次にお好みのエディタでfugaの中身を編集してみます。


```fuga.html
    <p>ちゃんと編集できてる？</p>
```

ssh先でもあるfuga.htmlがあることが確認できました！

```
    $ vagrant ssh
    $ cd ../../
    $ ls vagrant/
    Vagrantfile hoge fuga.html
    //fuga.htmlの中身を確認(viewコマンドで確認でもおk)
    $ cat vagrant/fuga.html
    <p>ちゃんと編集できてる？</p>
```

次の説ではプロビジョニングを使ってパッケージ、ユーザー、その他諸々をインストールする方法について学んでいきましょう。


## [7. Provision a Virtual Machine](https://learn.hashicorp.com/tutorials/vagrant/getting-started-provisioning)

この節ではプロビジョニングをつかってVMをWebサーバーにしていきましょう。


### ローカルの方でHTMLのディレクトリを作成

~/Desktop/vagrant_testにhtmlディレクトリを作成する。

    $ mkdir html

次にhtmlディレクトリにindex.htmlファイルを作成する。


```~/Desktop/vagrant_test/html/index.html
    <!DOCTYPE html>
    <html lang="ja">
    
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Vagrant</title>
    </head>
    
    <body>
      <h1>Vagrant始めてみたンゴ!</h1>
    </body>
    
    </html>
```

※metaタグとかで文字コードしてしないと日本語が文字化けしちゃうよ！


### プロビジョニングスクリプトを書いてみる！

このチュートリアルではシェルスクリプトを使って(Webサーバーとして)Apacehをセットアップしていきます。まず下記のシェルスクリプトを`bootstrap.sh`として保存します。

```bootstrap.sh
    #!/usr/bin/env bash
    
    apt-get update
    apt-get install -y apache2
    if ! [ -L /var/www ]; then
      rm -rf /var/www
      ln -fs /vagrant /var/www
    fi
```  

このスクリプトがApacheをダウンロードし起動してくれます。

さらに「同期されるファイルのディレクトリ」と「Apacehサーバーが、レスポンスとして提供するコンテンツが置いていないか探す場所」との二つの間のsymlink(シンボリックリンク)を作ってくれます。


### [補足] シェルスクリプト
- __#!以降のスクリプト__

一行目の#!以降のスクリプトはShebang(シバン)と言ってインタプリタ(ソースコードを解釈し実行する翻訳機のようなプログラムのこと)を指定してくれています。
つまり今回だと「これはbashスクリプトして解釈してね」とコンピュータに教えているわけです。
`bin/bash`でも特に問題ありません。[リンク先の解説](https://moneyforward.com/engineers_blog/2015/05/21/bash-script-tips/)がわかりやすいです！
※envについては『[手を動かして理解するshebang](https://qiita.com/takey/items/ae2124531fb57a197b22#env%E3%81%A3%E3%81%A6%E4%BD%95)』がオススメです！


- __apt-get__

apt-getはDebian用のパッケージ管理システムです。(今回使っているUbuntuもDebian系という種類のLinuxです。)Macで言うところのHomebrewのようなものです。
Ubuntu 14.04から「apt-get」ではなく「apt」コマンドが推奨されるようになっています。リンク先の解説にもある通り、基本的にaptコマンドの方がユーザーにとっても楽です。


- __if以降のスクリプトについて__

シェルスクリプトわからん！となりそうだが要は下記のようなif文が書かれていると思えば良いでしょう。
参考1：[【シェルスクリプト】条件分岐させるifの使い方！](https://eng-entrance.com/linux-shellscript-if)
参考2:[シェル入門](http://www.tohoho-web.com/ex/shell.html)

    if [ 条件1 ]; then
    条件1の際の処理
    elif [ 条件2 ]; then
    条件2の際の処理
    else
    条件1,2のどちらでもない場合の処理
    fi

条件1にあたるのが`! [ -L /var/www ]`ですが、-Lは「file が存在し、かつシンボリックリンクならば真となる」ということを意味しており、!は論理否定(!trueであればfalseと同義)を表しています。

つまり/var/wwwディレクトリにfileが存在しなければ処理を走らせる、という意味になります。

以上からこのシェルスクリプトは

初回は「シンボリックリンクの/var/wwwがないので(普通の/var/wwwディレクトリが存在していれば削除した上で、)/vagrantのシンボリックリンクとしての/var/wwwを作成します。」

そして二度目は「シンボリックリンクの/var/wwwがあるのでelse以降の処理(今回は何もない)を走らせる」

ということをしてくれるのだ、ということがわかりました。

次にbootstrap.shを起動させます。


### bootstrap.shが起動するようにVagrantを設定する

VMをセットアップしたときにこのスクリプトが起動されるようにVagrantを設定しましょう！

Vagrantfileに下記の`config.vm.provision`の行を追加してください。

    Vagrant.configure("2") do |config|
      config.vm.box = "hashicorp/bionic64"
      config.vm.provision :shell, path: "bootstrap.sh"
    end

これでVagrantはbootstrap.shをシェルプロビジョナーとして使ってくれるようになります。


### Webサーバーをプロビジョニングする

もしまだ仮想マシンを立ち上げていないのであれば`vagrant up`とするだけでVagrantは自動的にbootstrap.shを使ってプロビジョニングしてくれます。

ただ、既に仮想マシンを立ち上げていても下記のようにリロードしてやれば問題なく動いてくれます。
(プロビジョニングは初回の`vagrant up`の時のみしかされないので再度`vagrant up`としてもダメです。)

    $ vagrant reload --provision

ではssh先で`wget`コマンドを使ってHTMLファイルを取得してみましょう！

    $ vagrant ssh
    $ wget -qO- 127.0.0.1
    <!DOCTYPE html>
    <html lang="ja">
    
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Vagrant</title>
    </head>
    
    <body>
      <h1>Vagrant始めてみたンゴ!</h1>
    </body>
    
    </html>


### [補足] wgetコマンドとは

アットマークIT/Linux基本コマンドによればwgetは「URLを指定してファイルをダウンロードしてくれる」コマンドです。
`-q`(--quiet)は「経過のメッセージを出力しない」オプションです
`-O file`(--output-document=file)はダウンロードしたファイルを`file` として指定している先に保存します。(リダイレクトで保存先を指定するのに似ている。)また`-`をfileとして指定するとファイルは標準出力されます。

これが働いてくれているのは既に設定したシェルスクリプトの中で「Apacheのインストール」と「/vagrantディレクトリをApacheのDocumentルートとして設定する」ことを行っているからです。


### [補足] Apacheのドキュメントルート

Apachewebサーバーはディフォルトで/var/wwwディレクトリに自身が管理しWebブラウザへのレスポンスとして返すファイルやデータがあるという風に設定されています。(この管理対象下のディレクトリのことをDocumentルートと読んでいるわけです。)
今回はその/var/wwwが/vagrantのシンボリックリンクとなっているため、/vagrantの中身をいじると当然AapcheのDocumentルート下のファイルに変更が反映されます。

次のチュートリアルではネットワークについて扱います。ゲストマシンに対してポートを投げることでゲストマシンの提供するWebサイトにアクセスしてみましょう。


### プロビジョニングスクリプトがあまりにも複雑になる場合

プロビジョニングスクリプトの場合は、毎回ビルドするのではなく、あらかじめパッケージがインストールされているカスタムVagrantボックスをパッケージ化した方が効率的です。[こちらに詳細があります。](https://learn.hashicorp.com/tutorials/vagrant/getting-started-provisioning)


## [8. Configure the Network](https://learn.hashicorp.com/tutorials/vagrant/getting-started-networking)

ポートフォワーディング(ポート転送)では、ゲストマシン上のポートを指定をし、ホストマシン上のポートを通して(ファイルの)共有をすることが出来ます。

ポートの転送について設定することで、ゲストマシンのApacheWebサーバーにアクセス出来るようになります。Vagrantfileに`config.vm.network`の行を追加して、、


    Vagrant.configure("2") do |config|
      config.vm.box = "hashicorp/bionic64"
      config.vm.provision :shell, path: "bootstrap.sh"
      config.vm.network :forwarded_port, guest: 80, host: 4567
    end

※上記は「ホストOSに対する4567番ポートへのアクセスをゲストOSの80番ポートに転送すること」を意味しています。

リロードしましょう。

    $ vagrant reload

仮想マシンが再起動したら、http://127.0.0.1:4567 にアクセスしてみましょう。


![](https://paper-attachments.dropbox.com/s_82C62801E230BB1B24BDD188DB6080B1E75098764D93B0C78511E96C2A3CC074_1599658229137_+2020-09-09+22.29.59.png)


というわけで無事アクセスできたました！

ちなみに、Vagrantには他にもネットワークの形態があり、ゲストマシンに静的なIPアドレスの割り当を行ったり、既存ネットワークにゲストマシンをブリッジさせたりすることができます。他のネットワーク形態に興味がある方はネットワーキングのページを読んでみてください。


## [9. Share an Environment](https://learn.hashicorp.com/tutorials/vagrant/getting-started-share)

Vagrantでは開発環境を提供するのに加えて、これらの環境上で共有や共同作業を容易にしてくれます。この基本機能のことをVagrant Shareと呼びます。

Vagrant Shareはプラグインです。このプラグインはあなたのVagrant環境をネットを介して世界中の誰であっても共有することを可能にします。Vagrant Shareはインターネットに接続された世界中のあらゆるデバイスから自分のVagrant環境に直接ルーティングするURLを提供してくれます。


### 前提

ngrokをインストールしていること
→ローカル環境で作っているサイトをネット経由で見せたい！って時に使うツール。
※ざっくり概要を掴みたい方は@EsfahanさんのQiita記事、「[ngrokの使い方（windows, mac）](https://qiita.com/Esfahan/items/74e71edfe17d9935d47e)」がオススメです！


### プラグインをインストールする

Vagrant Shareをインストールしましょう

    $ vagrant plugin install vagrant-share


### 環境を共有する

```
    $ vagrant share
```

ウェブブラウザを開いて自分の出力したURLを訪れてみましょう！既に作成したApacheがレスポンスしてくれたページがロードされるはずです！(ファイルを修正してURLを再読み込みすれば当然反映されます！)このページは世界中のあらゆるデバイスからアクセス出来ます！

最後に忘れずにセッションを終了させましょう。

    $ ^C
    ==> default: Halting Vagrant share!

もうURLを再読み込みしてもページが見れなくなっているはずです！

Vagrant Shareについてもっと知りたい方は[こちらを。](https://www.vagrantup.com/docs/share)
次の章では、ティアダウン(teardown)プロセスについて学んでいきましょう！


## [10. Teardown an Environment](https://learn.hashicorp.com/tutorials/vagrant/getting-started-teardown)

ここでは今までの章で構築し、手を加えてきた仮想環境を実際に、

(1)一時停止[休止] `vagrant suspend`
(2)完全停止[シャットダウン] `vagrant halt`
(3)削除 `vagrant destroy` 

させていきましょう。(1)~(3)のどのオプションを用いるかはあなたがどのくらい長く仕事に用いる仮想環境を止めるか、どのくらい素早く仮想環境を再度起動させたいのか、に依ります。
(当然、休止→停止→削除の順に再起動までの時間はかかります。)



まだはVagrantを立ち上げていない方は立ち上げをお願いします。

    $ vagrant up
    $ vagrant status
    ->default                   running (virtualbox)


### (1)仮想マシンを一時停止させてみよう

まずは仮想マシンを`vagrant suspend`を使って一時停止させましょう。

    $ vagrant suspend
    ==> default: Saving VM state and suspending execution...
    $ vagrant status
    ->default                   saved (virtualbox)

`vagrant suspend`コマンドによる仮想マシンの一時停止はVMを素早く休止、再起動させることができます。

VMは`vagrant up`とすることで再度停止前の状態で起動します。

    $ vagrant up
    Bringing machine 'default' up with 'virtualbox' provider...
    ==> default: Checking if box 'hashicorp/bionic64' version '1.0.282' is up to date...
    ==> default: Resuming suspended VM...
    ##... output truncated ...


### (2)仮想マシンを完全停止させてみよう

まずは仮想マシンを`vagrant halt`を使って一時停止させましょう。

    $ vagrant halt
    $ vagrant status
    ->default                   poweroff (virtualbox)

これで安全にゲストマシンのOSはシャットダウンされ、VM自体もパワーダウンしてくれます。ディスクの中身もしっかり保存されています。
では確認のため再起動してみましょう。

    $ vagrant up
    Bringing machine 'default' up with 'virtualbox' provider...
    ==> default: Checking if box 'hashicorp/bionic64' version '1.0.282' is up to date...
    ==> default: Clearing any previously set forwarded ports...
    ==> default: Clearing any previously set network interfaces...
    ==> default: Preparing network interfaces based on configuration...
    ##... output truncated ...

ただし完全停止した仮想マシンの再起動にはコールドブートから起き上がるので幾分時間はかかりますし、停止中もディスクスペースを消費します。


### (3)仮想マシンを削除してみよう

`vagrant destroy`して仮想マシンを削除すると、あなたのローカルのマシンからゲストマシンのすべての痕跡が削除されます。ゲストマシンを停止し、電源を落としすことで(ゲストマシンが消費していた)ディスクスペースとRAMを取り戻しましょう。


    $ vagrant destroy
        default: Are you sure you want to destroy the 'default' VM? [y/N] y
    ==> default: Forcing shutdown of VM...
    ==> default: Destroying VM and associated drives...

上記にあるように`vagrant destroy`コマンドの後のプロンプトには「y」(yes)を記入してください。

ここからでも`vagrant up`と打てば再度仮想マシンは起動させることが出来ます。ただ、起動には時間がかかりますし、以前の状態は破棄されています。



## [11. Rebuild an Environment](https://learn.hashicorp.com/tutorials/vagrant/getting-started-rebuild)

(Vagrantを用いれば)プロジェクトから離れてどれだけ経とうと、すぐに環境をスピンアップ(マシンを起動すること)することが出来ます。

やり方は単純です。

    $ vagrant up

以上です！Vagrant環境はVagrantfileを介して全て設定済みです。ですから開発メンバーはいつでも`vagrant up`コマンドを打つだけで、Vagrantにあなたの作業環境を再現させることが出来るんです。

これでVagrantによる環境構築の一連のライフサイクルは一通り終わりです！

次の最終章ではVirtualBox以外のプロバイダーについても触れておきましょう！


## [12 .Explore other Providers](https://learn.hashicorp.com/tutorials/vagrant/getting-started-providers)


### 新しいプロバイダをインストールする

プロバイダごとの設定について各公式ドキュメントを参照してください！


### 新しいプロバイダで起動する

新しいプロバイダをインストール出来たら下記のコマンドを打つだけで問題ありません。
(Vagrantfileを弄る必要はありません！)

    $ vagrant up --provider=vmware_desktop

一度、上記のように別のプロバイダを指定して`vagrant up`をしてやれば他のVagrantコマンドでも自動的に指定したプロバイダを使ってくれるようになります！

なので例えばSSH接続の準備や仮想マシンの削除の準備が出来たら(これまでの章でやっていたように)普通にコマンドを打つだけで全く問題ありません。

プロバイダについてより詳しく学びたい方は[こちらのページ](https://www.vagrantup.com/docs/providers)(リンク先英文公式ドキュメント)を参照してください。