【Mac OS X限定】バックエンド開発環境の構築をこうするとよさそうだ

**社内共有用**

# 開発環境の構築方法

バックエンドの開発環境の構築は、
インストールするソフトウェアのあれこれがあって複雑だ。

wikiに手順をドキュメント化して、
プロダクトが出てくるたびにwikiに書いた
手順をコピペするのがだるいので、以下の感じで環境を整える流れを作りたい。

1. ホスト側(Mac OS Xマシン)でhomebrew環境を構築する
2. ホスト側でansibleを利用するため、ansibleをインストールしておく
3. [packer](http://www.packer.io/)を利用し、[Vagrant](http://www.vagrantup.com/)用のVirtualboxゲストマシンを作成する　
4. ansible playbookを作成し、マシンの環境を構築する
5. Vagrantの[ansible provisioner](http://docs.vagrantup.com/v2/provisioning/ansible.html)を利用し、ansible playbookを使いミドルウェアの設定を行う

# Mac OS X以外の人

がんばって。といってもhomebrewのような
パッケージシステムを利用すればなんとかなるのだろう。

# 事前準備は何が必要か

[homebrew](http://brew.sh/)のセットアップ。
※ [Xcode](https://developer.apple.com/jp/technologies/tools/)をインストールしておく必要がある。

# サンプルとなるansible playbookを作成した

[サンプルとなるansible playbook](https://github.com/futoase/playbook-wordpress)を用意した。

```bash
.
├── Brewfile
├── README.md
├── Vagrantfile
├── group_vars
│   └── vagrant.box
├── packer
│   ├── builds
│   ├── http
│   │   └── ks.cfg
│   ├── scripts
│   │   ├── base.sh
│   │   ├── cleanup.sh
│   └── template.json
├── roles
│   ├── common
│   │   └── tasks
│   │       ├── base.yml
│   │       └── main.yml
│   ├── mysql
│   │   └── tasks
│   │       ├── install.yml
│   │       ├── main.yml
│   │       ├── repo.yml
│   │       └── setup-the-root.yml
│   ├── nginx
│   │   ├── handlers
│   │   │   └── main.yml
│   │   ├── tasks
│   │   │   ├── copy-file-in-server.yml
│   │   │   ├── create-of-log-dir-for-wordpress.yml
│   │   │   ├── install.yml
│   │   │   ├── main.yml
│   │   │   └── repo.yml
│   │   └── templates
│   │       ├── conf.d
│   │       │   └── wordpress.conf
│   │       ├── nginx.conf
│   │       └── nginx.repo
│   ├── php
│   │   └── tasks
│   │       ├── install.yml
│   │       ├── main.yml
│   │       └── start-of-php-fpm.yml
│   └── wordpress
│       ├── files
│       │   └── wp-config.php
│       └── tasks
│           ├── install.yml
│           ├── main.yml
│           └── mysql.yml
├── site.yml
└── vagrant.box
```

## playbook-wordpress

Brewfile, packerのテンプレート,Vagrantfile, ansibleのplaybook
それぞれを同梱することで、あんま考えずすぐに開発環境を構築できるようにしている。

このplaybookは[nginx](http://nginx.org/), [mysql](http://dev.mysql.com/), [php](http://php.net/), [wordpress](http://wordpress.org/)のインストールを行う。

# ホストで実行すべきコマンド

すでにhomebrewをインストールしているのであれば、
以下のコマンドを続けて叩けば終わる。

```bash
> brew bundle
> vagrant up --provision
> open http://vagrant.192.168.33.123.xip.io/
```

Brewfileにより、homebrewでセットアップ可能な
ソフトウェアがマシンにインストールされる。便利。

![スクリーンショット 2014-03-10 10.48.29.png](https://qiita-image-store.s3.amazonaws.com/0/3985/6d830811-ae78-cc43-696b-5c41ade1313c.png)

packerやらvagrantやらがインストールされる。

```vagrant up --provision``` を実行すると、
packerによりVagrant向けのマシンイメージが作成され、
続けてansible-playbookが実行される。

一回packerでマシンイメージを作成しとけば **~/.box** 以下に
Vagrant boxイメージが置かれるようにした。
ただ、vagrant destory時に~/.boxの状態が変わるとpackerが再度buildするのがアレ感ある

![setup-centos65.png](https://qiita-image-store.s3.amazonaws.com/0/3985/6f0b0e37-0d03-073c-3ef1-e21503c19075.png)

ansible-playbookによるplaybookのゲストマシンへの適用後、
**http://vagrant.192.168.33.123.xip.io/**にアクセスすると、
wordpressの初設定画面が表示される。

![スクリーンショット 2014-03-10 10.39.34.png](https://qiita-image-store.s3.amazonaws.com/0/3985/2685653d-20fe-f477-b100-cc701b7d7c60.png)


ゲストマシンで起動するwordpressへの書き込みが行える状態になる。

![スクリーンショット 2014-03-09 15.35.04.png](https://qiita-image-store.s3.amazonaws.com/0/3985/6c96c2b3-7805-1001-c537-cde8535e97b5.png)

![スクリーンショット 2014-03-09 15.35.24.png](https://qiita-image-store.s3.amazonaws.com/0/3985/2bc4b53e-1217-de4f-c781-a1169cd7478c.png)

# ホスト側のディレクトリをゲストから使いたい...

Vagrantは、デフォルトで```/vagrant``` ディレクトリに対し、
Vagrantfileがあるディレクトリをマウントしている。

rails sをしてゲストマシン上でRailsアプリの立ちあげを実行したい場合は
以下のようにすれば良い。

```
> cd /vagrant
> rails s
```

コードを書くのは常にホスト側で良い。

# 今後の方針

1. packer, vagrantの組み合わせは利用していきたい
2. ミドルウェアのインストールについて、chefを利用してもよいのだけど、簡便なansibleなplaybookを作る方向で頑張りたい
3. localhostへのアクセスは[xip.io](http://xip.io/)(か、[xipd](https://github.com/sstephenson/xipd))を利用してアクセスするようにすればDNSサーバが...(/etc/hosts)の問題はなんとかなるのかな、ホスト名違うからSSL証明書問題(まあ厳密にしなければいいのかな)がありそうだけど...

3ヶ月後にはまた変わってそうだけど。

# 開発環境構築を簡略化する意味

1. 伝えるのが3行で済むので、連絡ミスやオペミスは発生しなさそう
2. マシンを作成するレシピはgithubに上がっているので取り違えたりすることはないだろう
3. マシンを構築する手順がレシピ化(playbook)されているので、レビューが可能なのが良い。
4. wikiに開発環境手順を逐一順序立てて書いていく必要がなくなるので負担が減る

# 参考

## packer templateのレシピ

https://github.com/hnakamur/my-packer-template-files

## brew cask

[みんなhomebrew-caskって知ってるか？](http://qiita.com/ryurock/items/1432578d364985f6cb06)