MacOSにVagrantとPyenvとpyenv-virtualenv使ってUbuntu16.04、Python3系の仮想環境を構築

## はじめに
Ubuntu16.04を使ってpython3系を書きながら開発をしていく方に向けて、この記事を見ながら進めていけば構築ができるようにまとめました。
僕自身も会社で上記の環境で開発をしていますが、試しに自宅にあるMacを使ってトライしましたが、1から構築して環境を作ることができました。
ところどころ画像も取り入れながらまとめてあるので、ぜひ参考にして見てください。

### 環境
* MacOS Sierra (10.12.4)

### 仕様
* MacにVagrantを使ってUbuntu16.04の仮想環境を構築する
* python 3.6.1(任意で変更可能)
* vagrant Version: 1.9.5

### アジェンダ
* (1)必要なものをインストール
* (2)vagrantで仮想環境のセットアップ
* (3)pyenvと

* (4)ホストOSのエディタを使ってゲストOSのファイルを編集したい場合

# 構築方法
## (1)必要なものをインストール

* Vagrantをインストール(Mac OS X を選択)➡︎
https://www.vagrantup.com/downloads.html

![install-vagrant.png](https://qiita-image-store.s3.amazonaws.com/0/146952/b7497ec7-19e1-cf82-df08-73622f6e09db.png)


↑クリックして開く

<img width="609" alt="50162b730d1cd5a47ea434f02665a3e4.png" src="https://qiita-image-store.s3.amazonaws.com/0/146952/61c6e6c6-6c38-9d06-0d06-63495744389a.png">

↑vagrant.pkgをダブルクリックし、インストール

* VirtualBoxをインストール(Mac OS を選択)➡︎
https://www.virtualbox.org/wiki/Downloads

![e4b1f1a7896cb3efb28bf94d3c1f65dc.png](https://qiita-image-store.s3.amazonaws.com/0/146952/0d949bbc-ad50-d493-1318-b23899285b37.png)



↑クリック

<img width="669" alt="6aa5dbcad19393cd401651f76a240786.png" src="https://qiita-image-store.s3.amazonaws.com/0/146952/cc63ada7-6c96-bcfb-987d-3f9bdd457a12.png">

↑virtualBox.pkgをダブルクリック


* ubuntuのboxが入ったVagrantを取ってくる(少し時間がかかる)

```bash
$ vagrant box add ubuntu16.04 https://atlas.hashicorp.com/bento/boxes/ubuntu-16.04/versions/2.3.0/providers/virtualbox.box 
```

* boxが追加されているか確認する

```bash
$ vagrant box list
=> bento/ubuntu1604 (virtualbox, 0)
```
* 仮想環境を置くディレクトリを作る

```bash
$ mkdir vagrant_env(任意の名前)
$ cd vagrant_env(任意の名前)
```

## (2)vagrantで仮想環境のセットアップ

* 仮想環境を作る

```bash
$ vagrant init bento/ubuntu1604
```
* Vagrantfileが作られているか確認

```bash
$ ls
=> Vagrantfile
```
* 仮想マシンを起動

```bash
$ vagrant up
```
* 仮想マシンにssh接続

```bash
$ vagrant ssh
vagrant@vagrant:~$
```
#### (参考)vagrantコマンド一覧

| 1 | 2 |
|----|----|
| vagrant box add {VM名} {boxファイルダウンロードURL} |  box追加|
| vagrant box list |利用可能box一覧確認  |
| vagrant box remove {box名} | boxの削除 |
| vagrant init |  vagrant 初期化(Vagrantfileの作成)|
|  vagrant up| vagrant 起動 |
| vagrant ssh |vagrant ログイン  |
| vagrant halt |vagrant 終了  |
| vagrant reload | vagrant リロード(halt + up) |
| vagrant destroy | vagrant 破棄 |

[vagrantコマンド一覧](http://qiita.com/oreo3@github/items/4054a4120ccc249676d9)


## (3)pyenvとpyenv-virtualenvで環境を整理する

* パッケージをアップデートする

```bash
vagrant@vagrant:~$ sudo apt-get update
```

* pyenv をcloneする

```bash
vagrant@vagrant:~$ git clone git://github.com/yyuu/pyenv.git ~/.pyenv
```
* pyenv-virtualenvをcloneする

```bash
vagrant@vagrant:~$ git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv
```
* 環境変数を設定する

```bash
vagrant@vagrant:~$ vim ~/.profile
```
(以下を追記)

```bash
export PYENV_ROOT=$HOME/.pyenv
export PATH=$PYENV_ROOT/bin:$PATH
eval "$(pyenv init -)"
```
* .profileを読み込む

```bash
vagrant@vagrant:~$ source ~/.profile
```
* インストール可能なpythonのバージョンを確認

```bash
vagrant@vagrant:~$ pyenv install -l
```
* 目的のバージョンをインストール(今回は3.6.1)

```bash
vagrant@vagrant:~$ pyenv install 3.6.1
```
### pyenv-virtualenv活用

* 同じバージョンをコピーしてpyenv-virtualenvで環境を作る

```bash
vagrant@vagrant:~$ pyenv virtualenv 3.6.1 venv_3.6.1(任意の名前)
```
pyenv-virtualenvの環境に入る

```bash
vagrant@vagrant:~$ source /home/vagrant/.pyenv/versions/venv_3.6.1/bin/activate
(venv_3.6.1) vagrant@vagrant:~$
```
* バージョンの確認

```bash
(venv_3.6.1) vagrant@vagrant:~$python -V
=>3.6.1
```
* 環境の停止

```bash
(venv_3.6.1) vagrant@vagrant:~$ deactivate
vagrant@vagrant:~$ 
```

## (4)ホストOSのエディタを使ってゲストOSのファイルを編集したい場合

* 仮想環境から出る

```bash
vagrant@vagrant:~$ exit
```
* Vagrantfileを編集

```bash
$ vi Vagrantfile
```

以下の部分のコメントアウトを外し、編集

```bash
  config.vm.synced_folder "(共有したいホストOSのディレクトリ)", "共有したいホストOSのディレクトリ",
    create: true, owner: "vagrant", group: "vagrant"
(例)
  config.vm.synced_folder "../vagrant_env", "/home/vagrant"・・・
```

* vagrantfileを再読み込み

```bash
$ vagrant reload
```

## 最後に
これで環境は構築できたと思います。このあとは` それぞれの環境で` 必要なライブラリをインストールして、「この環境はこのプロジェクト専用」を意識してpyenvやpyenv-virtualenvをうまく利用して開発していきましょう。
ひととおりコマンドの羅列となってしまいましたが、コマンドの説明なども交えて記事を編集していきます。