仮想開発環境Vagrantのインストール

当ページにて、 仮想開発環境構築ツールの1つである Vagrantを紹介し、 そのインストール手順および活用例を示します。 この記事を読むことで、 データ解析の業務処理速度を向上させる ヒントを得ることができます。

見出し

当ページの議題を示します。 記事の全体的な流れは、 Vagrantの概要および利用意義を述べたのち、 インストール手順および利用例を詳述します。

  1. 記事を読むにあたって
  2. 仮想開発環境とは?
  3. Vagrantとは?
  4. Vagrantを利用することで解消される課題
  5. Vagrantが利用可能になるまでの手順
  6. Vagrantによる仮想マシンの構築

記事を読むにあたって

この章では、 本ページで紹介する内容を追体験するために 要求される技術水準をお持ちであるかどうかを確認します。 コマンドライン操作をご存じの人は、 この章を読み飛ばしてください。

「コマンドライン操作って?」と思われた人にご説明します。 まず、コマンドライン操作とは、 コマンドプロンプト等のアプリケーション上で、 キーボードから打ち込んだコマンド(文字列としての命令) によってコンピュータを働かせることです。 そして、Vagrantはコマンドラインから操作するため、 本ページでは多くのコマンドを紹介します。 そのため、極端な例ですが、 コマンドライン操作に免疫がない人にとっては、 本ページ内で出てきたコマンドを不可解に感じ、 何をどうすれば良いかわからないはずです。

コマンドライン操作に自信がない人は、内容を読み進める前に、 以下のリンク先にある記事をご覧いただくことをおすすめしています。

初心者でもこれは使いこなしたい!Linuxコマンドまとめ: コマンドライン操作といえばLinux。 Linuxコマンドの解説記事を読むことで、 コマンドライン操作の感覚をつかんでいただくことを期待します。


仮想開発環境とは?

仮想開発環境とは何でしょう? その説明のため、開発環境、本番環境、仮想開発環境の順で 用語解説してゆきます。

まず、開発環境とは、 エディタや開発支援ツールを使用するマシン環境 (すなわちローカルマシン)を指します。 対して本番環境とは、 解析コードを実際に走らせるためのマシン環境 (ほとんどがリモートマシン)を指します。 そして、仮想開発環境とは、 開発環境(ローカルマシン)上にテストラン用の仮想マシン (以降、テストラン環境と表現する)を構築するとき、 開発環境とテストラン環境をひっくるめたものを指します。 場面によっては、単に、 開発環境上の仮想マシンを指して 仮想開発環境と呼ぶこともあります。 いずれにせよ用語のニュアンスとして重要なのは、 開発環境上にテストラン環境があることです。


Vagrantとは?

Vagrantは、 VirtualBoxやVMWareなどの 仮想化ソフトウェアの運用を手助けすることで、 仮想開発環境の構築を支援するツールです。

Vagrantを語る上で重要なポイントは次の3点です。

  1. 仮想化ソフトウェアをコマンドラインから簡便に制御するコマンドラインツールを提供している点
  2. (テストラン環境などの)仮想マシン設定をファイルに記述し管理する手段を提供している点
  3. 仮想マシン設定を反映したテストラン環境の作成を代行する点

つまりVagrantによって、 仮想マシン構築・制御・管理処理をコード化する ことで、 それらの処理の 自動化 を達成できます。

更に、仮想マシン構築・制御・管理処理を自動化することで、 従来これらのタスクに回していた労力を減らすとともに、 仮想マシン設定をグループ内で一元化することが容易になります。


Vagrantを利用することで解消される課題

この章では、具体的な例とともに、 データ解析業務上でVagrantを利用する意義を議論します。

まず議論の背景を確認します。

データサイエンスにおける解析は一般に、 ローカルマシンで行いたい処理(例えば図表の作成)と、 リモートマシン(クラスタマシン等)で行いたい処理 (可視化に用いる次元削減モデルの構築)があります。

そのとき、リモートマシンで走らせたい解析コードを どこでどのように作成・デバッグしますか?

もし上記の作業を、 従来のローカルマシンで行うならば、 デバッグが煩雑になります。 なぜなら、ローカルマシンとリモートマシンはマシン環境が異なるため、 ローカルマシンでデバッグした解析コードが リモートマシンでも問題なく走る確証はありません。 デバッグのために、複数回、ローカルマシンとリモートマシンとの間で ファイルのやり取りを行う必要が出てきます。 また、リモートマシンで上記の作業を行う場合、 今まで使い慣れた編集・開発補助機能を使うことはできません。 編集・開発補助機能を整えようにも、 リモートマシンの管理者に要望を伝え 対応してもらう必要が出てきます。

ならば、リモートマシンで走らせたい解析コードを どこで作成・デバッグすると良いでしょうか? その答えの1つは、 リモートマシンのマシン環境に似せたテストラン環境を ローカルマシン上に再現した環境、 すなわち、仮想開発環境です! 仮想開発環境を構築することで、

  1. 開発環境の使い慣れた編集・開発補助機能
  2. 本番環境に近いテストラン環境

が利用可能になります。

しかし、Vagrantなどの補助ツールを使わずに仮想開発環境で作業する場合、 仮想化ソフトウェア自体の操作を行う必要が現れます。 例えば、仮想化ソフトウェアのGUIから 仮想マシンを構築・設定変更する際や、 仮想マシンの起動・終了を行う際です。 これらは何度も行う操作であるため、 解析コード作成に回すべき労力と時間を減らす原因となります。

まとめると、データ解析における課題は次の通りになります。

以上が議論の背景の確認です。

では本題、 Vagrantを使うことで、上述のデータ解析における課題を解消できます。 なぜならVagrantによって、

が利用可能となるためです。

つまり、Vagrantを利用することで、 解析コード作成・編集・デバッグに関する 人間的な業務処理スピードを落とさずに、 仮想開発環境自体を運営するための業務量を 減らすことができ、

なんと素晴らしいことでしょうか! よって、vargantは、 データ解析業務内で使用する意義があるといえます。


Vagrantが利用可能になるまでの手順

この章では、Vagrantのインストール手順を説明します。

Windowsマシンで言うところのメモ帳やmicrosoft edgeのように、 いきなりVagrantが使えるわけではありません。 Vagrantを使うためのソフトウェアを調達しましょう。

ここでは、Windowsマシン上で、 Vagrantによりvirtualboxを操作する場合を考えます。 手順は次の通りです。

  1. VirtualBoxをインストールし、セットアップウィザードを実行する
  2. Vagrantをインストールし、virtualBoxの セットアップ後 にVagrantのセットアップウィザードを実行する
  3. sshコマンドが利用できるようにする(Git for WindowsのGit bashを推奨)

sshコマンドって? と思われるかたは、 インフラエンジニアじゃなくても押さえておきたいSSHの基礎知識 をご覧ください。 理解しやすい記事です。

なお、Git bashを推奨する理由は、作業の取り掛かりが早くなるためです。 というのも、Git bashの利用は、次の2点で優れているからです。

もちろん、ssh時にtera term等を利用されても、 Vagrantの操作に支障はありません。 tera term等のgui系sshクライアントを使用する場合は、 以下の記事を参考に設備を整えることをおすすめします。

上記ソフトウェアセットアップがすべて終了すれば、 Vagrantを利用する条件を整えたことになります。 お疲れ様でした。


Vagrantによる仮想マシンの構築

この章では、Vagrantの運用例を紹介します。 一人で完結する内容なので、 Vagrantの真価をお見せできませんが、 それでもVagrantの利便性をお示しできると思います。

Vagrantをインストールした後は、 Vagrantを使って仮想開発環境を構築しましょう。 この章では、Vagrantで構築した仮想マシン上に jupyter notebookサーバーを立てるまでの 道筋を紹介します。

手順のあらましは次の通りです。

  1. (初回時のみ)Boxファイルを入手する
  2. (初回時のみ)Vagrantfileを生成する
  3. 仮想マシンを立ち上げる
  4. 仮想マシンに接続する
  5. (初回時のみ)任意のバージョンのpythonおよびjupyterを使用可能にする
  6. Jupyter notebookのサーバーを立ち上げる

(初回時のみ)Boxファイルを入手する

まず、仮想マシンのテンプレートを調達します。 調達の際、以下のサイトがよく利用されます。

お好きなOSのboxファイルを選択してくたさい。 その際、 ProviderVirtualBox となっているものを選択してください。

ここで例として、chef謹製のbento/ubuntu-16.04を入手する場合の流れを示します。 bento/ubuntu16.04をチョイスした理由は、 ubuntu16.04は筆者が日頃お世話になっている 本番環境(クラスタマシン)のOSであるため、 bentoシリーズは 必要最小限の要素が簡潔に詰め込まれており ファイル容量も小さいためです。 (ちなみにbentoは弁当です。)

Vagrantのコマンドラインツールおよびインターネットアクセスが利用可能な状態で Git bashを開き、次のコマンドを実行してください。 コマンドは次の通りです。 Usage: vagrant box add [options] <name, url, or path> 今回はインストールの途中で、 入力を受け付ける(仮想化ソフトウェアを選択するところ)部分が あるので注意してください。

$ vagrant box add bento/ubuntu-16.04
==> box: Loading metadata for box 'bento/ubuntu-16.04'
box: URL: https://atlas.hashicorp.com/bento/ubuntu-16.04
This box can work with multiple providers! The providers that it
can work with are listed below. Please review the list and choose
the provider you will be working with.

1) parallels
2) virtualbox
3) vmware_desktop

Enter your choice: 2  # virtualboxを利用しているので、2を打鍵しEnterする
==> box: Adding box 'bento/ubuntu-16.04' (v201708.22.0) for provider: virtualbox
box: Downloading: https://vagrantcloud.com/bento/boxes/ubuntu-16.04/versions/201708.22.0/providers/virtualbox.box
box: Progress: 0% (Rate: 477k/s, Estimated time remaining: 0:26:23)

vagrant box addが正常終了すれば(下記に正常終了時の出力例)、 boxファイルをもとに仮想マシンを展開することができます。

==> box: Successfully added box 'bento/ubuntu-16.04' (v201708.22.0) for 'virtualbox'!

Vagrantが認知しているboxファイルを表示させることで、 そのファイルが入手できたかどうかを確認しましょう。 コマンドは次の通りです。 Usage: vagrant box list [options]

$ vagrant box list
bento/ubuntu-16.04   (virtualbox, 201708.22.0)
puphpet/centos65-x64 (virtualbox, 20161102)
ubuntu/trusty32      (virtualbox, 20170619.0.0)

bento/ubuntu-16.04が加わっているのを確認できました! 同様に、puphpet/centos65-x64およびubuntu/trusty32が表示されています。 これらは、今回の説明に沿った操作で入手することはありません。

(初回時のみ)Vagrantfileを生成する

次に、仮想マシンの設定ファイルである Vagrantfileを生成します。 早速、次のコマンドを走らせましょう。 Usage: vagrant init [options] [name [url]]

$ mkdir ~/vagrant_practice && cd ~/vagrant_practice  # 作業ディレクトリの作成および移動
$ vagrant init bento/ubuntu-16.04
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.

Vagrantfileが出現したことを確認します。

$ pwd
/c/Users/yourname/vagrant_practice
$ ls -ltra  # windowsならdirコマンド
drwxr-xr-x 1 yourname 197610    0 9月  15 18:00 ../
drwxr-xr-x 1 yourname 197610    0 9月  15 18:00 ./
-rw-r--r-- 1 yourname 197610 3093 9月  15 18:00 Vagrantfile

これで仮想マシンの立ち上げが可能となりました。 新たに作業ディレクトリを設ける理由は、 設定ファイル類を明示的に分けることで、 複数の仮想マシンをVagrantで管理しやすくするためです。 その際、仮想環境を作成した理由に基づく、 わかりやすいディレクトリ名を与えると吉です。 というのも、virtualBox上で仮想マシンの管理をするときに、 判別しやすいからです。

Vagrantfileには、共有フォルダの指定等、 仮想マシンの設定を記述することができます。 詳しくは、次のリンク先の記事をご覧ください。

仮想マシンを立ち上げる

Vagrantfileの設定をもとに、 仮想マシンを立ち上げます。 早速、次のコマンドを走らせましょう。 Usage: vagrant up [options] [name|id]

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'bento/ubuntu-16.04'...
==> default: Matching MAC address for NAT networking...
==> default: Checking if box 'bento/ubuntu-16.04' is up to date...
==> default: Setting the name of the VM: vagrant_practice_default_1505466960478_7607
(略)

vagrant upで仮想マシンが立ち上がったことを確認しましょう。 仮想マシンの状態を見ます。コマンドは次の通りです。 Usage: vagrant status [name|id]

$ vagrant status
Current machine states:

default                   running (virtualbox)

The VM is running. To stop this VM, you can run `vagrant halt` to
shut it down forcefully, or you can run `vagrant suspend` to simply
suspend the virtual machine. In either case, to restart it again,
simply run `vagrant up`.

Vagrantfile中にvb.nameの記述がなければ、 defaultという名前の仮想マシンが生成します。 今回は’vagrant init’で生成したVagrantfileを そのまま使用しているので、 defaultという名前の仮想マシンが作成されています。 defaultの状態が”running(virtualbox)”となっているため、 仮想マシンが立ち上がったことを確認しました。

仮想マシンに接続する

立ち上げた仮想マシン内に操作を移動します。 そのためのコマンドは次の通りです。 Usage: vagrant ssh [options] [name|id] [-- extra ssh args] なお、vagrant sshは、sshの引数も利用できます。 その際、--の後に引数を続けましょう。

$ vagrant ssh -- -L 8888:localhost:8888
Welcome to Ubuntu 16.04.3 LTS (GNU/Linux 4.4.0-92-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

0 packages can be updated.
0 updates are security updates.

これにより、ubuntu環境の仮想マシンに操作が移ります。 今回はただ単にsshするだけでなく、 ホストマシン(開発環境)から ポート8888番を通じて ゲスト(仮想マシン)にアクセスできるよう処置を施しました。

この処置は、仮想マシン上に立てた jupyter notebookサーバーを、 ローカルマシン(開発環境)のブラウザから 閲覧するために必要です。 しかし普通は、-L 8888:localhost:8888等の ポートフォワーディングの設定をいちいちタイプせず、 Vagrantfileに記述します。例: Vagrant + VirtualBoxで仮想環境側のポートをあける

また、仮想マシンからの退出は、 exitのコマンドもしくは、 ctrl + d打鍵で可能です。

(初回時のみ)任意のバージョンのpythonおよびjupyterを使用可能にする

Jupyterを準備します。 具体的には、 pyenv(pythonのバージョン管理ツール)と pip(pythonのライブラリ管理ツール)を 利用する手立てを整えます。

まず、apt-getのライブラリデータを更新しましょう。

$ sudo apt-get update
Get:1 http://security.ubuntu.com/ubuntu xenial-security InRelease [102 kB]
Hit:2 http://archive.ubuntu.com/ubuntu xenial InRelease
(略)

次に、apt-getでライブラリをインストールしましょう(pythonのライブラリではありません)。初回はかなり時間がかかります。 参考: pyenv wiki::Common build problems

$ sudo apt-get install -y git make build-essential libssl-dev \
   zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev \
   wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev
Reading package lists... Done
Building dependency tree
Reading state information... Done
libreadline-dev is already the newest version (6.3-8ubuntu2).
(略)

続けて、Github上のpyenvを持ってきましょう。 この操作の詳細は、Python環境の構築 において解説されています。 ご参照ください。

$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
Cloning into '/home/vagrant/.pyenv'...
remote: Counting objects: 15449, done.
remote: Compressing objects: 100% (47/47), done.
remote: Total 15449 (delta 30), reused 48 (delta 18), pack-reused 15381
Receiving objects: 100% (15449/15449), 2.77 MiB | 346.00 KiB/s, done.
Resolving deltas: 100% (10555/10555), done.
Checking connectivity... done.

現在のユーザーはvagrantであるはずなので、 /home/vagrant内に.pyenvのディレクトリが生成され、 pyenvの内容物はその中に格納されました。

更に、pyenvのコマンドを利用可能にしましょう。 .bashrc(もしくは.profile、.bash_profile)に環境設定を書き込みます。 以下のコマンドを愚直に実行してください。 (コピー&ペーストしやすいように$を外しています)

echo '# pyenv settings'  # .bashrcにコメント行を追加します(書かなくても良いです)
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc  # PYENV_ROOTとして.pyenv/のパスを設定します
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc  # 一時的に.pyenv/内のbin/へパスを通します
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.bashrc  # pyenvのコマンドがコマンドとして利用できるかチェックします、利用でない場合、pyenvのコマンを利用可能にするコマンドを走らせます

もちろんvi等で.bashrcを編集していただいても構いません。

確認のため、pyenvコマンドが使えるようになったことを示します。

$ source ~/.bashrc  # .bashrcの反映
$ pyenv  # コマンドが使えるようになったことを確認
pyenv 1.1.3-37-g2ebab02
Usage: pyenv <command> [<args>]

Some useful pyenv commands are:
   commands    List all available pyenv commands
   local       Set or show the local application-specific Python version
   global      Set or show the global Python version
   shell       Set or show the shell-specific Python version
   install     Install a Python version using python-build
   uninstall   Uninstall a specific Python version
   rehash      Rehash pyenv shims (run this after installing executables)
   version     Show the current Python version and its origin
   versions    List all Python versions available to pyenv
   which       Display the full path to an executable
   whence      List all Python versions that contain the given executable

See `pyenv help <command>' for information on a specific command.
For full documentation, see: https://github.com/pyenv/pyenv#readme

pyenvコマンドが使えるようになったら、 任意のpythonをインストールしましょう。 ここでは、python 3.5.2をインストールしてみます。

$ pyenv install 3.5.2
Downloading Python-3.5.2.tar.xz...
-> https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tar.xz
Installing Python-3.5.2...
patching file Lib/venv/scripts/posix/activate.fish
Installed Python-3.5.2 to /home/vagrant/.pyenv/versions/3.5.2

お待ちかね、python3.5.2のpipを用いて、 jupyterをインストールしましょう。

$ pyenv global 3.5.2  # python3.5.2を使用する指示
$ pip install -U pip  # pipの更新
Collecting pip
  Downloading pip-9.0.1-py2.py3-none-any.whl (1.3MB)
    100% |████████████████████████████████| 1.3MB 690kB/s
Installing collected packages: pip
(略)
$ pip install jupyter
Collecting jupyter
  Downloading jupyter-1.0.0-py2.py3-none-any.whl
Collecting ipykernel (from jupyter)
  Downloading ipykernel-4.6.1-py3-none-any.whl (104kB)
    100% |████████████████████████████████| 112kB 1.6MB/s
(略)

最後に、jupyter notebookサーバーの個人設定をしましょう。 設定ファイルのテンプレートを調達します。

$ jupyter notebook --generate-config
Writing default config to: /home/vagrant/.jupyter/jupyter_notebook_config.py

生成したjupyter_notebook_config.pyに、 書き込みを加えましょう。 参考: Jupyter Notebook::Config file and command line optionsおよびJupyter事始め

echo "c.NotebookApp.ip = '*'" >> ~/.jupyter/jupyter_notebook_config.py
echo "c.NotebookApp.port = 8888" >> ~/.jupyter/jupyter_notebook_config.py
echo "c.NotebookApp.open_browser = False" >> ~/.jupyter/jupyter_notebook_config.py
echo "c.NotebookApp.token = ''" >> ~/.jupyter/jupyter_notebook_config.py

上記の設定の場合、 jupyter notebookサーバーにアクセスし放題なのと、 アクセスの際パスワードが求められないことにご注意ください。

Jupyter notebookのサーバーを立ち上げる

ローカルマシン上でその他の仮想マシンが 起動していないことを確認したのち、 準備を進めた仮想マシン上で 次のコマンドを実行してください。

$ jupyter notebook

そして、ローカルマシンのブラウザから、 localhost:8888にアクセスしてください。

Jupyterが閲覧できれば成功です! お疲れ様でした。

参考までに、 Jupyter notebookサーバーの終了は、 コンソール上で ctrl + cです。 また、仮想マシンからの退出は、 exitのコマンドもしくは、 ctrl + d打鍵で可能です。

まとめ

本ページでは、Vagrantを紹介し その概説および利用例を述べました。 Vagrantによって、 ものの数行のコマンドで ローカルマシン上にテスト環境を 導入し管理することができます。 また、データサイエンティストが クラスタマシン等を利用する場合と似た形で、 Vagrantのサービスを使用できるため、 コードのデバッグおよび本番環境での解析を スムーズに行うことができます。

皆さんがVagrantを使う一助となれば幸いです。