Vagrant と Ansible で Windows でも快適開発

# はじめに

Ruby on Rails の登場以降、アプリ開発者がコマンドラインに触れる機会がとても多くなりました。また、昨今は DevOps 時代などとも言われアプリ開発者にも Linux の知識が求められています。

このため、コマンドラインの使用を前提としたツールや情報がとても増えてきているのですが、これらのほとんどは Windows では動作せず、Cygwin で何とかしようとしても徒労に終わることが少なくありません。

そこで仮想マシン上に開発環境を構築しようと考えるわけですが、これまでは OS のインストールから始まり、ユーザの作成、パッケージのインストール、共有ディレクトリの設定などなど、とても手間が掛かるものでした。また、プロキシサーバの設定につまづいたことがある方も多いかと思います。

今回は Vagrant と Ansible を組み合わせて上記の問題を解決する手順を紹介します。


## 前提

プロキシサーバが存在する企業内 LAN で以下のツールがインストールされた Windows7 を使用しているものとします。

- [Virtualbox](https://www.virtualbox.org/) 4.3.8
- [Vagrant](http://www.vagrantup.com/) 1.5.1
- [msysgit](http://msysgit.github.io/) 1.9.0

また、環境変数 `http_proxy`, `https_proxy` にプロキシサーバの情報が設定されているものとします。


## 手順

### playbook の clone

スタートメニューから Git bash を起動したら、以下のコマンドを実行して適当なディレクトリに Ansible playbook を clone します。

```
bash-3.1$ mkdir -p /c/vagrants
bash-3.1$ cd /c/vagrants/
bash-3.1$ git clone -b short https://github.com/garbagetown/ansible-provision-vagrant.git
```

### プロキシの設定

clone したディレクトリに移動し、プロキシサーバの情報を設定します。

```
bash-3.1$ cd ansible-provision-vagrant/
bash-3.1$ echo 'http_proxy: http://your.proxy.host:9999/' >> ansible/roles/proxy/vars/main.yml
```

`your.proxy.host` と `9999` は自身の環境に読み替えてください。

認証が必要な場合は `http://username:password@your.proxy.host:9999/` のように設定してください。


### 仮想マシンの起動

あとは Vagrant を起動するだけです。`vagrant up` を実行してください。

box をダウンロードしていない場合は、それなりに時間が掛かるのでご注意ください。

```
bash-3.1$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Box 'precise64' could not be found. Attempting to find and install...
    default: Box Provider: virtualbox
    default: Box Version: >= 0
==> default: Adding box 'precise64' (v0) for provider: virtualbox
    default: Downloading: http://files.vagrantup.com/precise64.box
    default: Progress: 100% (Rate: 751k/s, Estimated time remaining: --:--:--)
(snip)
The following NEW packages will be installed:
  ansible libyaml-0-2 python-crypto python-httplib2 python-jinja2
  python-markupsafe python-paramiko python-pkg-resources python-yaml
0 upgraded, 9 newly installed, 0 to remove and 160 not upgraded.
Need to get 2,212 kB of archives.
(snip)
PLAY [127.0.0.1] **************************************************************

GATHERING FACTS ***************************************************************
ok: [127.0.0.1]
(snip)
PLAY RECAP ********************************************************************
127.0.0.1                  : ok=15   changed=14   unreachable=0    failed=0
```

## 環境

Ansible によるプロビジョニングが正常に終了したら、`192.168.33.10` に `vagrant` ユーザでログインすることができます。パスワードも `vagrant` です。

![20140314_001.JPG](https://qiita-image-store.s3.amazonaws.com/0/6755/c5b7555d-0b02-3344-cd45-44ee684acc76.jpeg)

以上の手順で構築される環境は、下記の通り必要最低限のものです。

- Ubuntu 12.04.1 LTS x86_64
- zsh
    - [oh-my-zsh](https://github.com/robbyrussell/oh-my-zsh)
    - [ys-theme](http://blog.ysmood.org/2013/03/my-ys-terminal-theme/)
- vim
- tmux
- git
- tig

必要に応じて playbook に role や task を追加してください。

### grande

Java 7 や Ruby 2.1, Node.js などをインストールする role を追加したブランチを用意しています。これらが必要な方は、以下のようにブランチを切り替えてから `vagrant provision` を実行してください。

build-essential や Ruby 2.1 のインストールにかなり時間が掛かるのでご注意ください。

```
bash-3.1$ git branch -a
* short
  remotes/origin/HEAD -> origin/grande
  remotes/origin/grande
  remotes/origin/short
  remotes/origin/tall

bash-3.1$ git checkout -b grande origin/grande
M       ansible/roles/proxy/vars/main.yml
Branch grande set up to track remote branch grande from origin.
Switched to a new branch 'grande'

bash-3.1$ vagrant provision
==> default: Running provisioner: shell...
(snip)
PLAY RECAP ********************************************************************
127.0.0.1                  : ok=26   changed=19   unreachable=0    failed=0
```

# まとめ

以上のように、とても簡単な手順でプロキシサーバの存在する企業 LAN 内の Windows 上にも快適な開発環境を構築することができました。

これまでも、技術的に長けた方であれば自身でドットファイルやシェルスクリプトを駆使して同様のことを実現されてきたことと思いますし、プロビジョニングツールとしては [Chef](http://www.getchef.com/chef/) のほうが人気があるようにも感じます。

このため、必ずしも Ansible を使う必要はありません。べき等性のあるプロビジョニングスクリプトを適切にバージョン管理し、いつでも、どこでも、誰でも同じ環境を構築できることが肝要です。

また、今後は [Docker](https://www.docker.io/) が主流になっていくかもしれませんが、Docker はコンテナ型仮想化技術であり、Windows 上に直接 Linux 環境を構築することはできないはずなので、業務用端末として Windows を使用せざるを得ない場合は、今後も VirtualBox などの仮想化技術が必要になると考えられます。

一方、業務用端末として Linux や Mac OS X を使用できる場合にも、これらの技術を活用することで常にクリーンな開発環境を構築することができるため、採用を検討する価値はあると思います。


## 謝辞

上記で使用した Vagrantfile や provision.sh は、「[AnsibleをゲストOSに押し込んでVagrant環境構築する - Qiita](http://qiita.com/progre/items/ccc2d8c2ec7ae8a4ed61)」で紹介されている下記リポジトリを fork して利用しました。

- [progre/template-vagrant](https://github.com/progre/template-vagrant)

作者の [progre](http://qiita.com/progre) さんに感謝いたします。