vagrant + centos7 + Python3.71 の環境を作成した。

# vagrantでpython用の開発環境を作った

書いてる人はWindows環境で仮想環境動かす用の設定をいじってる状態で始めてるので
そこでエラー出た場合は、自身の環境でエラー原因とかググってもらえるとありがたいです。

## きっかけ
現場で初めてVagrant環境構築して結構お手軽感あったので、試してみたかった。

# 完成するもの
vagrant+centos7+Python3.71の環境。


# 作成過程

## インストールするもの

### vartulbox
まずは以下のサイトからVirtulBox6.1.2をインストールします。
https://www.virtualbox.org/wiki/Downloads
と思いましたが、後でめんどくさい自体に巻き込まれるので
アーカイブから6.0.0のバージョンのvirtulaboxを利用します。
https://www.virtualbox.org/wiki/Download_Old_Builds_6_0
急にバージョン挙げられても嫌なので、とりあえずvirtualboxの自動更新は切っときました。

適当にYes押してインストール終わらせます。
virtualboxはとりあえずインストールするだけで終わりになります。

ちなみに最新のバージョンだと実行出来なかったです。
https://qiita.com/shuu1222/items/7a6d04172363be44025c
ここの記事に書いてあるようなエラーが出ました。
ここに書いてある内容で対処が可能なようですが、
めんどくさいのでvirtualboxのバージョンを下げることで対応しました。

### vagrant
vagrantはここのサイト参考にしてインストールしました。
https://eng-entrance.com/linux-vagrant-install

ざっくりvagrantのインストーラー拾ってきてインストールするくらいなので上のサイト確認しながら勧めてください。
とりあえずインストールしたら終わりで大丈夫です。

ここから主にVagrantをいじっていくことになります。

とりあえず一通りインストールが終わったら再起動した後に
コマンドプロンプトを立ち上げて

```
vagrant --version
```

を入力。問題なければインストールしたVagrantのバージョンが表示されるはず。
されなければインストール手順とか見直しかな？

virtualboxと違ってこっちは最新のバージョン入れておけば大丈夫です。

## vagrantfileの作成と編集
※ここから下の編集は

```
Vagrant.configure("2") do |config|
  # ここの間に追記をしていく
end
```
上記の用な感じで追加していく必要があります。

### Centos7のBox調達
https://app.vagrantup.com/boxes/search

このサイトでcentos7を検索
今回はcentos7で検索して一番上に出てきた。以下のファイルを利用します。
https://app.vagrantup.com/centos/boxes/7

適当なフォルダを作ってもらってそこにさっきのファイルをインストールします。
正確には`Vagrantfile`っていうファイルがインストールされるだけ。

```
G:\>vagrant init centos/7
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.

```
こんな感じでコマンドを打ったら作られる。

このコマンドはBOXのページのnewとか言うタブのところに書いてある。
`vagrant up`のコマンドも書いてあるけど、これはまだやらなくて大丈夫。

これからは今初期化したファイル(Vagrantfile)を編集していきます。 

### Disc容量を上げる。
下のコマンドを打っておくことでvagrantで建てたディスクサイズを上げるためのvagrantのプラグインを入れる。

```
vagrant plugin install vagrant-disksize
```

上のコマンドでディスクサイズ変更出来るようになったので、
以下のコマンドで追加する。

```
config.disksize.size = '30GB'
```
今回はディレクトリの共有をして、ソースコードとか管理しようかと思っているので、あまり必要では無い気がする・・・

### ネットワークの設定
```
config.vm.network "private_network", ip: "192.168.33.10"
```
これを追加。
ひっそりとIP固定していますが、他に先約があるならこれ以外でもなんでもよいです。

後でteratarmとかでssh接続したりしたいので、設定しておきます。

### 一回起動をしてみる
とりあえずこの状態で一回起動してみます。
Vagrantfileが置いてある階層で以下のコマンドを実行

```
vagrant up
```
最初はちょっと時間かかるかもしれないです。

次は以下のコマンドで接続出来るかテストします。

```
vagrant ssh
```
接続出来たら`Ctrl+D`でログアウトします。

```
vagrant halt
```
で現在立ち上げてるCentosの環境を落とします。

#### なんかエラーメッセージみたいなの出た場合
vagrantの環境とvirtalboxのバージョンが噛み合わないと

```
mount: unknown filesystem type 'vboxsf'
```

こんな感じのエラーが出ると思います。
なので以下のサイトを参考に`vagrant-vbguest`をインストールしようと思います。
https://tulist.club/technology/dev-env/2017/11/12/137

コマンド的には以下のような感じ

```
vagrant plugin install vagrant-vbguest
vagrant vbguest
```
以下は`Vagrantfile`に追記する。

```
config.vbguest.auto_update = false
```

### SSH接続の準備

次は個人的にプロンプトでsshで接続するのが嫌なので、
teratarmとかでログイン出来るようにしていきます。 
endの行の一つ上の行に以下を追加します。

```
config.vm.provision "shell", inline: <<-SHELL
  sed -i 's/PasswordAuthentication no/PasswordAuthentication yes/g' /etc/ssh/sshd_config
  systemctl restart sshd.service
SHELL
```

`config.vm.provision "shell", inline: <<-SHELL` これの下に書いたコマンドはOS立ち上げ時にシェルを実行してくれる。
他にも似たようなコマンドがあるので後で紹介します。というより使います。

### 作業ディレクトリのローカルとの共有
windows上のディレクトリとcneots上のホームディレクトリをシンクロさせます。

```
config.vm.synced_folder "../vagrant", "/home/vagrant/work"
```
左がローカル環境で右がサーバ無いのホームディレクトリに作成される場所
ローカル側を`./`で指定するとダメらしい。(理由はよく知らない。)
一応ググると原因とか出て来た気がする。

これでローカルで色々する分には十分な環境が出来たかと思う。

### Python3.7の環境を整える

正直ここが一番めんどくさかった

あとPython3.7の実行環境を追加する必要があるので、下記の様に編集をしていく。
3.65とかだったらyumで簡単に設定出来る。(パス通す設定とかは別だったはず。)

```
config.vm.provision "shell", :path => "setup.sh"
```
これだとルートで`setup.sh`を最初に実行してくれる。

```
config.vm.provision "shell", :path => "setup.sh" path: privileged false
```
試してないからわからないけど、これでvagrantユーザでシェルを実行してくれるらしい。
今回はrootで実行したいので使わないよ。

Vagrantfileと同階層にsetup.shのファイルを作成します。
中身は以下のようなファイルを作成。

```
#!/usr/bin/bash

sudo yum install -y gcc openssl-devel bzip2-devel libffi-devel
sudo yum install -y wget
sudo wget https://www.python.org/ftp/python/3.7.1/Python-3.7.1.tgz
sudo mkdir -p /usr/local/src/Python-3.7.1
sudo tar xzf Python-3.7.1.tgz -C /usr/local/src/Python-3.7.1
cd /usr/local/src/Python-3.7.1
sudo mkdir -p /usr/local/Python3.7/Python-3.7.2rc1
sudo ln -s /usr/local/Python3.7/Python-3.7.2rc1 /usr/local/Python3.7/latest
sudo ln -s /usr/local/Python3.7/latest /usr/local/Python3.7/default
cd /usr/local/src/Python-3.7.1/Python-3.7.1
./configure --enable-optimizations --prefix=/usr/local/Python3.7/default
make
make altinstall
sudo echo "export PATH="/usr/local/Python3.7/default/bin:$PATH"" >> /etc/profile
ln -s /usr/local/Python3.7/default/bin/pip3.7 /usr/local/Python3.7/default/bin/pip
ln -s /usr/local/Python3.7/default/bin/python3.7 /usr/local/Python3.7/default/bin/python
ln -s /usr/local/Python3.7/default/bin/python /usr/local/bin/python
ln -s /usr/local/Python3.7/default/bin/python /usr/local/bin/python3
```
makeが要るのかわからないけど一応解説のページ見たら書いてあったので入れてます。
いい子は中身をちゃんと読もうね。

そしたらもう一度`vagrant up`をします。
多分先程作ったシェルも読み込まれるはず。
大体完了するのに20分くらいかかる。と思う。makeですごい時間使う。  
##### error: Details: code E_FAIL (0x80004005)こんな感じのエラーが出たらさっき一度起動したVMの構成情報が残っているので、以下の手順で削除する必要がある。
1, `vagrant global-status`このコマンドで出てきたIDを控える。
2, `vagrant destroy {1で控えたID}` {から}まで1で控えたIDを入力  
これでもう一度起動したらうまくいくはず。
※ この作業以外でもVagrantを使っているのであれば、先程自分が作成したVMを特定必要あり。

現状ですが、1回目はシェルまで実行しないんだけど、2回目はシェルを実行してくれる。
ここらへんの原因がよくわからない。。。
※原因がわかったら原因のコマンドを修正しておきます。

# 作成した感想
vagrantを立ち上げるだけだったらくっそ楽だった。
Dockerと比べるとかなり入門しやすい感じ。
※Dockerも便利だよ！
ただ今回はWindows上で動かしたいのでこの方法を選択しました。

あと、この環境はこれから知識ない人用へPythonのレクチャーを想定に作成したので、
特に何も考えずにgitからpullしてvagrant upだけで環境構築出来ることが望ましかった。

なのでこれからPythonの初歩的なのをこの環境使って
復習がてらPythonの使い方の記事書いていこうかと思います。

そういうことなので、今回作った環境の中でDocker動かしてDBとかJupyterとか追加していくかも・・・

# 参考にしたサイト

今回は主に以下のサイトを参考にして作成しました。

インストールから基本設定ぐらいまでは以下のページを参考。
https://qiita.com/ozawan/items/160728f7c6b10c73b97e

ネットワークの設定は以下のページを参考
https://qiita.com/centipede/items/64e8f7360d2086f4764f

Pythonの導入に関して、3.7を入れたいため。
https://qiita.com/Sakieda/items/07e060b25420d642159d