vagrant + CentOS7で開発環境を作る

#まえがき

##CentOS7のvagrant boxはネットワークがおかしい

vagrant環境でローカルに開発環境を立ち上げることも珍しくない昨今。ホスティング各社のVPSにもCentOS7が出揃ってきているので開発環境もCentOS7にしようとvagrant boxを検索。

ググってトップに出てくるのは`Vagrantbox.es`。しかも上から2番めにCentOS7のboxが載っている(2015-06-30現在)。

CentOS6の時には何も気にせずboxから起動していて特に問題なかったのだが、CentOS7のboxを設定して起動すると、networkが起動失敗している。

さらにググってvagrantにパッチを当てなければいけないという記事が多いので、[vStone/vagrant-centos7_fix](https://github.com/vStone/vagrant-centos7_fix)のパッチを当ててみた。

##パッチだめじゃん
ググった時から、記事のvagrantのバージョンが古いことはわかっていた。

1.6.4では問題があり、1.6.5では解消されていることも、自分のMacにインストールされているvagrantが1.7.2であることも、実はわかっていたのです。もちろん自分の問題にしているネットワーク関連の問題も解消しないことも。

でも、なんか、淡い期待で入れたパッチも効果はなし。ま、「解消された」と書いてあるんだからそうでしょう。

##いっそCentOS7のvagrant boxを作ってみる

vagrantで立ち上げているCentOS7のネットワーク周りをそれなりにいじくってみたのだが、**CentOS7に慣れていない**のと、**vagrantをそんなにしっかり勉強していない**のが相まって全くわからない。
特にCentOS7は6からネットワーク周りが見た目けっこう変わっている。

VirtualBoxで普通にCentOS7立ち上げて作業すればいいじゃん、と思った。しかし、vagrantでの作業はみんなが勧めるんだから、きっとスゴいはずだ。スゴさが全くわかっていないけど、でも、きっとスゴいんだ。と自分を騙してvagrant boxを作成してみることにした。

#VirtualBoxにCemtOS7を構築する
まずは、VirtualBoxにCentOS7を構築する。Web開発環境なので、とりあえず最小構成で問題ない。**CentOS-7-x86_64-Minimal-1503-01.iso**をダウンロード。場所は本家の[centos.org](https://www.centos.org/)が良いと思う。

VirtualBox4.3.26では、いきなり新規作成。**centos7**とか、それらしい名前を付けると勝手にタイプとバージョンを選んでくれる。くれぐれも名前を先に入力する。あとは適当に進んで一気に仮想領域を作ってしまう。

すると、電源オフの仮想環境(まだ領域だけしかない)ができるので、左のペインで選択し設定を押す。立ち上がった設定の**ストレージ**でコントローラ:IDEにディスク追加。ディスクに**+**マークが付いているのをクリック。ディスクを選択のボタンを押し、先ほどの**CentOS-7-x86_64-Minimal-1503-01.iso**を選択して**起動！**

ま、vagrant扱う人であれば、CentOS7のインストールくらいできすはず、少なくともググればできるはず。ということで、インストール自体は割愛。
インストールはGUIなので非常に簡単。だと思う、個人的には。インストールに日本語も選べる。英語キーボードを使っている人は少し注意が必要だけど最悪、USBで日本語キーボードつなげばいいでしょう。

まず最初に確認すべきは、vagrant boxで立ち上げた際におかしかったnetwork。

```
# systemctl status network
```

ちゃんと起動していることを確認。
本当は

```
# systemctl status network.service
```

とか打たないといけないのかもしれない。

余談だが、CentOS7はサービスの確認、起動停止のコマンドが変わっているので要注意。とはいえ、serviceと打ってもコマンドを変換してくれる親切ぶり。きっと最初だけだと思うけど。その他、ifconfigがなかったりするが、これはまぁ、随分前から非推奨のコマンドだった気がする。

#vagrant boxを作るための準備。
## yum update

```
# yum update
# yum install gcc kernel-devel perl bzip2
# reboot
```

そういえば、`shutdown -r now`とかってまだあるのか確認したら、ちゃんと再起動しました。。

##ユーザ作成
[hao's work log: CentOS7.0をvagrant用にbox化するメモ](http://hao03.github.io/blog/2014/07/12/CentOS7-vagrant/)あたりが参考になる。

vagrantでは起動時に、いろいろな設定を行うことができるのだがその際にゲストOSにログインするユーザが必要なので作成する。アカウントは`vagrant`でパスワードもvagrant。いわゆるJoe Account。

パスワードなしで`sudo`ができるようにvisudoで`sudoers`を編集。

```
# visudo
```

```:sudoers
...
vagrant ALL=(ALL)       NOPASSWD:ALL
...
```

さらに、vagrantでVirtualBOX起動後に鍵認証できるように鍵を設定する。

```
# su - vagrant
$ mkdir ~/.ssh
$ chmod 700 ~/.ssh
$ curl -L -o ~/.ssh/authorized_keys  https://raw.githubusercontent.com/mitchellh/vagrant/master/keys/vagrant.pub
$ chmod 600 ~/.ssh/authorized_keys
```

##grubの設定変更
yumでカーネルがアップデートされると、grubでどのカーネルから起動するか確認される。CentOS6の時には聞かれたっけ？記憶に無い。多分なかったような…。で、多少でも起動が遅くなってしまうので待ち時間を0に修正する。
なお、旧カーネルで起動しないよう注意する。

```config:/ets/default/grub
GRUB_DEFAULT=1
GRUB_TIMEOUT=0
GRUB_HIDDEN_TIMEOUT=0
...
```
`GRUB_DEFAULT`は、起動したいOSにが何番目にあるかの数字で、0から始まっている。
ほかに、起動したいOSのラベルを書いてもいいらしいがこちらは未検証。

変更した設定を反映。

```command:
$sudo grub-mkconfig -o /boot/grub/grub.cfg
```

起動時にメニューが表示されなくなればとりあえずOK。

##ネットワーク周りの設定を消しておく
とりあえず、VirtualBox上でパブリックネットワークとプライベートネットワークの構築を試してみて、networkが無事起動していることを確認。

そして、この確認の時に設定された動作済みのネットワーク設定があると、vagrant box化した時にnetworkがこけてしまう。vagrantは自力でネットワーク設定をする(らしい)ので、設定がコンフリクトする。
少なくとも**ifcfg-enp0s3**とか**ifcfg-enp0s8**とかは削除する。退避でもいい。

さらに、**udevルール**も削除しておく。

```
# rm /etc/udev/rules.d/70-persistent-ipoib.rules
```

#VirtualBox Guest Additionsのインストール
[hao's work log: CentOS7.0をvagrant用にbox化するメモ](http://hao03.github.io/blog/2014/07/12/CentOS7-vagrant/)
やはりこちらの記事が参考になる。
作業は`VirtualBOX`側での作業と仮想環境での作業が必要。

VuetualBOXで、メニューから`Devices`をクリックし、`Insert Guest Additions CD image`を選択。
あとは、仮想環境側でインストールを行うのだが、この時にyum updateした時にカーネルがアップデートされていてかつ、GRUB2の設定でデフォルトの起動OSバージョンがupdateされたものに書き換わっていない場合にはエラーが出る。エラーメッセージが親切に出るのでその他のエラーでもメッセージを確認しながら行えば問題ないはず。

#vagrant boxの作成
こんどはホスト側での作業で新規に作成した仮想環境をvagrant用に保存するようなイメージ。

```
$ vagrant package --base CentOS7.0 --output vagrant.box
==> CentOS7.0: Exporting VM...
==> CentOS7.0: Compressing package to: /Path/to/VirtualBox VMs/CentOS7.0/vagrant.box
```
`--base`の後は仮想環境の名前によって異なります。

#vagrantで起動してみる
あとは、普通にネット上に公開されているboxを登録して起動するのとほぼ同じで`vagrant init`後に`vagrant up`でCentOS7が起動できるはず。

#あとがき
なんか、足りない気がするので後で追検証してみる。