【触ってみたシリーズ】Vegrant

Vegrantとは何かの記事を読み漁り、実際に手を動かしてみた記録です。ただ、備忘録的な記事なのでパッと見わかりにくいかもしれませんので、今後修正してちゃんとした記事にしていければと思っています。

インストールからbox導入・仮想環境作成や起動についての備忘録です。

# 基本手順：
```
$ vagrant box add [ボックス名] [URL]
$ vagrant init [ボックス名]
$ vagrant up
```

# １．VirtualBoxインストール
```
$ brew search virtualbox
$ brew cask install virtualbox
```
:::note warn
エラーになった場合
セキュリティとプライバシーの一般に「許可」ボタンが表示されているので、
「許可」ボタンを選択し以下のコマンドで上書き再インストール
:::
```
$ brew cask reinstall --force virtualbox
```

# ２．Vagrantインストール
```
$ brew search vagrant
$ brew cask install vagrant
$ vagrant plugin install vagrant-vbguest
```

# ３．box（テンプレート）取得
```
$ vagrant box add centos/7
$ vagrant box list
```
:::note info
他にも非公式のboxは多数存在しています。
https://app.vagrantup.com/boxes/search?provider=virtualbox&q=centos&sort=downloads&utf8=%E2%9C%93
追加されたboxは以下の場所に配置されている。
:::
```
$ cd ~/.vagrant.d/boxes
```

※vagrant boxの削除
```
$ vagrant box list
$ find . -name 'Vagrantfile' | xargs grep [box名] ←このbox使っているか確認
$ vagrant box remove [box名]
```

# ４．仮想マシンの作成（初期化）
```
$ mkdir (vagrant用ディレクトリ作成)
$ cd (vagrant用ディレクトリ作成)
$ vagrant init centos/7
```
Vagrantfileが作成されたことを確認

:::note warn
ただし、自分でVagrantfileを作成するのであれば不要
:::
# ５．仮想マシンを起動
```
$ vagrant up
```
※vagrant用ディレクトリで実行する

※「boxの取得」から「仮想マシンの起動」までを自動化
```
$ mkdir [vagrantフォルダ]
$ cd [vagrantフォルダ]
$ vi Vagrantfile
```
```:Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"
end
```
```
$ vagrant up
```

# ６．VirtualBoxで確認
VirtualBoxを起動するとvagrant用ディレクトリで起動されていることが確認できます。

# ７．コマンド
```
$ vagrant status：状態確認
$ vagrant suspend：一時停止
$ vagrant resume : 再実行
$ vagrant halt : 停止
$ vagrant up : 起動
$ vagrant reload : 停止起動（halt→up）
$ vagrant destroy : 削除（仮想マシンからも削除）
```
vagrant作成環境フォルダの以下フォルダ内が空になります。
.vagrant/machines/default/virtualbox
参照：https://qiita.com/oreo3@github/items/4054a4120ccc249676d9

# ８．Vagrantへの接続
```
$ vagrant ssh
```

# ９．wwwサーバの構築
#### 時間設定（タイムゾーンの設定）
```
$ sudo timedatectl set-timezone Asia/Tokyo
```
#### httpインストール
```
$ sudo yum -y install httpd
```
#### httpd起動
```
$ sudo systemctl start httpd.service
```
#### httpd自動起動（再起動しても自動起動させる）
```
$ sudo systemctl enable httpd.service
```
#### ファイアウォール停止
```
$ firewall-cmd —status
```
これで、`not running`と表示されれば停止、もし起動していたら、以下のコマンドを入力します。
```
$ systemctl stop firewalld
```
#### ファイアウォール自動起動確認
```
$ systemctl is-enabled firewalld
```
ONはenabled、OFFはdisabledであり、ONになっていたら以下のコマンドで自動起動停止します。
```
$ systemctl disable firewalld
```
#### webページ表示
```
$ cd /var/www/html
$ sudo vi index.html ←中身は適当に
$ exit
$ vi Vagrantfile
```
config.vm.network "private_network", ip: "192.168.33.10”のコメントアウトを外します。
```
$ vagrant reload ←再起動
```
ブラウザから192.168.33.10を表示すると、index.htmlで書かれたhtmlの内容が表示されます。

# １０．共有フォルダ
:::note warn
うまく共有されない（リアルタイムに更新されない）
:::

Vagrantfileがあるフォルダとvagrantにログインしたときの/vagrantがリンクしている。
```
$ vagrant ssh
$ cd /vagrant
$ ls
```
すると、Vagrantfileが表示されます。
Vagrant上の、/vagrantをwwwのドキュメントルートに設定するとmac側からindex.htmlとかを修正できます。

やってみたこと。`（ダメだったけど...）`
```
$ vi Vagrantfile
```
以下を追加
```:Vagrantfile
config.vm.synced_folder "./", "/vagrant"
```
```
$ vagrant plugin install vagrant-vbguest
$ vagrant reload
```
さらにやってみたこと
https://qiita.com/sudachi808/items/edc304b3ee6c1436b0fd
に書いてあることを一通りやったが、多分以下で大丈夫
Vagrantfileに以下の行を追加する
```:Vegrantfile
config.vm.synced_folder ".", "/vagrant", type:"virtualbox"
```

# １１．Provisioning
Provisioningとは、Vagrant upされた時に自動的に実行される一連の処理のことです。
Webサーバ（httpd）のインストールやファイアーウォールの停止などを自動的実行させたりします。
Vagrantfileに以下のコマンドを追加します。
```:Vegramnt
config.vm.provision :shell, :path => "provision.sh"
```
provision.shファイルを作成し以下のコマンドを追加します。
```zsh:provision.sh
sudo yum -y install httpd # Webサーバ（httpd）
sudo systemctl start httpd.service # httpdサービス起動
sudo systemctl enable httpd.service # httpdサービス自動起動
```
provision.shファイルはVagrantfileと同一フォルダに保存します。
Vagrantが起動している場合
```
$ vagrant provision
```
Vagrantが起動していない場合
```
$ vagrant up
```
vagrant provisionをすることでprovisionだけを読み込みます。
vagrant provisionの実行タイミング
```zsh
$ vagrant up … 初回実行時のみ
$ vagrant up --provision ... 起動時に行う
$ vagrant provision ... 起動中の仮想マシンで行う
$ vagrant reload --provision ... 再起動し行う
```

# １２．boxの作成
現在の仮想の状態をboxにするには以下のコマンドを入力します。
```zsh
$ vagrant package
```
そうするとVagrantfileのあるフォルダにpackage.boxというboxファイルが作成されます。
この作成したboxをシステムに追加したい場合は、以下のコマンドを入力します。
```zsh
$ vagrant box add my_box package.box
```
これで、現在の環境を使い回すことができます。

:::note warn
Vagrantfileに対して行なった、プライベートネットワークや共有フォルダの設定は反映されていないのでもう一度設定する必要があります。
:::

# １３．プラグイン
Vegrantには、様々なプラグインが存在します。
プラグインをインストールには以下のコマンドを入力します。
```zsh
$ vagrant plugin install [プラグイン名]
```
以下のコマンドでヘルプを参照することができます。
```zsh
$ vagrant plugin ーh
```

:::note warn
インストールしたプラグインは仮想環境ごとではなく、Vagarnt自体にたいしてインストールされるので注意が必要です。
:::

## プラグイン（sahara）について
サンドボックスモードをオンにしてくれます。
仮想マシンになんらかのプログラムをインストールすると変更を加えた後に破棄したい場合、使える機能です。
```zsh
$ vagrant sandbox on # これでサンドボックスモードとなる
```
この後に変更を加えます。
```zsh
$ vagrant sandbox rollbak # これで上で行なった変更が全て無効になる
```
この後に変更を加えます。
```zsh
$ vagrant sandbox commit # これで上で行なった変更が確定される
```
当然ながらcommitするとrollbakがしても戻りません。特にcommitをしなくてもsanbox offして変更が戻る事はありません。仮想環境を起動したままだとcommitは遅いので、vagrant suspendなどで一時停止するのが良いと思います。

:::note info
箇条書きとなりましたが、今後もう一度動作させてみて不適切やわかりにくい部分については修正していこうと思います。
:::