fedora27上のvagrantで開発サーバを立てる

# 背景

共有の開発サーバがない環境にやってきたので、自身のPCに開発環境を用意せねばならない状況になった。
Dockerは試したことがあるが、VMというよりはプロセスを管理する感じで、本当にそれが本番サーバで動くのか不安だったこと、dockerのコマンドを覚えきれなかった。ので途中で使うのをやめた。

VMなvagrantを試してみたいと思う。

# vagrantとは

VMを管理してくれるツール。virtualboxやhyper-v, VMware fusionと組み合わせて利用する。
virtualboxのインスタンスの設定ファイルを共有して、みんなで共有できるぞ。って感じみたい。
Dockerに比べて仮想化な分重い。

# 環境

- ホストマシン
    - fedora27
    - CPU: Intel(R) Core(TM) i7-7600U CPU @ 2.80GHz
    - MEM: 16172360 kB
    - DISK: /dev/mapper/root   230G   18G  212G    8% /

# インストールするもの

VirtualBoxかVMwareか選択できるが、VirtualBoxを使う。(もともと入れてあった)

## VirtualBox

### ダウンロード

https://www.virtualbox.org/

ダウンロードページから`Linux distributions` からrpmとExtension Packをダウンロード。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/136777/e5fa45a1-8054-f8ec-e8c4-7de9001cf9bd.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/136777/b50a9ef8-ca10-83c6-5d54-a1e762d7ecd7.png)


### インストール

DLしたrpmをインストール(Downloadsディレクトリはカタカナかも。)

`$ sudo dnf install ~/Downloads/VirtualBox-5.2-5.2.2_119230_fedora26-1.x86_64.rpm`

一度起動確認して、Extention Packを入れる。

`$ virtualbox /home/murata/Downloads/Oracle_VM_VirtualBox_Extension_Pack-5.2.2-119230.vbox-extpack`

同意の画面が出るのでそのまま入れればおｋ(extention packの場所はフルパスでないと見つけられないエラーが出るかもしれないので注意)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/136777/91a02892-16b9-cdfc-27a0-26595779bd43.png)

- kernel-develが入っていなかったら`$ sudo dnf install kernel-devel`からの`sudo /sbin/vboxconfig`だ！
- BIOS(UEFI)でsecure bootがONになっているとコケることがあるらしいぞ。

終わり。(kernelに変更が入るのでPCの再起動を忘れるな！)


## Vagrant

### ダウンロード

https://www.vagrantup.com/
からcentos用のrpmをDL(fedora用がないので。)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/136777/d9f45214-2d1a-5660-d18b-ae8884e81353.png)

### インストール

そのままDLしたものをインストール

`$ sudo dnf install ~/Downloads/vagrant_2.0.1_x86_64.rpm`


### 設定

基本的にvagrantのセットアップ方法をやっていけばおｋ

https://www.vagrantup.com/intro/getting-started/index.html

rubyを利用するので、入れていない人は`dnf install ruby`をしておく。rbenvを使っている人はglobalをsystemにしておきましょう。

流れとしては
1. 適当にディレクトリ作って `mkdir xxx`
2. 適当なbox(OSイメージ)を拾い`vagrant box add hashicorp/precise64`
2. 初期化して `vagrant init hashicorp/precise64`
3. 立ち上げる `vagrant up`

この時点でVirtualBoxに項目ができている。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/136777/eaf75015-a248-dd95-6457-4214f9818a6d.png)


### SSHで入ろう

`vagrant ssh` 

で入れる。

### 特定のディレクトリをマウントしよう

デフォルトでVM内の`/vagrant`がマウントされているぞ。
追加などしたければプロジェクトディレクトリの`Vagrantfile`の↓を変更しよう。

```
  # Share an additional folder to the guest VM. The first argument is
  # the path on the host to the actual folder. The second argument is
  # the path on the guest to mount the folder. And the optional third
  # argument is a set of non-required options.
  # config.vm.synced_folder "../data", "/vagrant_data"

  config.vm.synced_folder "~/workspace", "/home/vagrant/project"
  
```

### amazon Linuxを使ってみよう

https://qiita.com/iwai/items/0b3ef59ab3eb87dd4646
ここに書いてあった。


# まとめ

DockerやVagrantを使うものよいが、AWSに開発インスタンスをおいたほうが環境依存が少なくなるし、セットアップの手間も減るので、1円もお金を使いたくないでござる！系の人以外はAWSでサーバを構築して、プロジェクトディレクトリを分けて複数人で使うほうがよくないか？
本番がAWSならばもっとそうだ。

ファイルのsyncが辛い？ いやいや、お使いのツールに変更ファイルだけrsyncしてくれる機能あるでしょ？
もしくは ionotifywaitとrsyncを組み合わせて特定のディレクトリ配下に変更があったらrsyncぶっこむってできますよ。

DockerやVagrantになぜここまでニーズがあるか未だにわからん。


# vagrant コマンド

よく使うコマンドをまとめ。


## vagrant global-status

各インスタンスの状態が見れる。

```
$ vagrant global-status            
id       name    provider   state   directory                            
-------------------------------------------------------------------------
c1333e5  default virtualbox running /home/murata/vagrant_getting_started 
```

## vagrant halt [id]

シャットダウン

```
$ vagrant halt c1333e5
==> default: Attempting graceful shutdown of VM...
```

# $ vagrant up [id]

起動

```
$ vagrant up c1333e5   
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Checking if box 'hashicorp/precise64' 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...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
```

# $ vagrant reload [id]

対象の設定ファイル (`Vagrantfile`) を編集したあとに読み込ませる。マウントポイントやポートフォワードを変更したときに行うことが多い。

# $ vagrant package [id] --output [filename]

作ったイメージをファイルにしておくのに使う。filenameは`~/workspace/xxxx.box`って感じ。設定ファイル(`Vagrantfile`)はコピーされないのでご注意。

# vagrant box系

## $ vagrant box list

登録されているインスタンスのリストを表示。

```
╰─$ vagrant box list                
hashicorp/precise64 (virtualbox, 1.1.0)
xxxxxxx             (virtualbox, 0)
mvbcoding/awslinux  (virtualbox, 2017.03.0.20170401)
```

## $ vagrant box add [box名]

vagrantにイメージを登録する。
box名はpackage でローカルにあるファイルの場合はそれを指定。
ネット上のものであればurlを。(https://app.vagrantup.com/boxes/search)