ottoを使ってRailsアプリ開発環境を構築してみる

二番煎じですが、Hashicorp製ツールottoの事始めです。
環境
MacOSX10.11.1 & homebrew
今回Windows, Linuxでの動作確認は行っていません。

## [otto](https://ottoproject.io/)とは？
[otto](https://ottoproject.io/)とは、簡単に言ってしまうと、アプリケーションエンジニアのための、インフラ自動構築ツールです。いわゆるはやりのDevOpsってやつですね。(よくわかってない)
アプリケーションエンジニアは開発に勤しんで、インフラはottoに任せなっ的な意味ですね。
詳しい解説なんかは、ブログとかSlideshareとかにあるので、そっち呼んだほうがわかりやすいと思います。

* 参考URL
	* [HashiCorpの考えるMicroservicesとNomad,Otto slideshare](http://www.slideshare.net/zembutsu/microservices-hashicorp-nomad-and-otto-distribution)

次期バージョンではrubyのバージョンを自動で判別したり、プラグインの作成が可能になるなど、いろいろ期待できます。


## ottoをインストールする
早速やっていきましょう。
Macですとhomebrewでサクッとインストールできます。

```console
$ brew install otto
$ otto -v

Otto v0.1.2

```

formulaマジ感謝:star:

## Railsアプリを作成する
早速開発するRailsアプリをnewします。
今回はデータベースにMySQLを利用します。

```console
$ rails new otto-rails -d mysql
```

**rails new するのが面倒だわって人は、僭越ながら空っぽのアプリをgithubに公開していますのでご利用ください。**
[rails new しただけのアプリ](https://github.com/ikea-dless/otto-rails)
  
  * ssh用クローンURL git@github.com:ikea-dless/otto-rails.git
  * http用クローンURL https://github.com/ikea-dless/otto-rails.git

インストール or クローンできたら

```console
$ cd otto-rails
$ otto compile
==> Loading Appfile...
==> No Appfile found! Detecting project information...
    No Appfile was found. If there is no Appfile, Otto will do its best
    to detect the type of application this is and set reasonable defaults.
    This is a good way to get started with Otto, but over time we recommend
    writing a real Appfile since this will allow more complex customizations,
    the ability to reference dependencies, versioning, and more.
==> Fetching all Appfile dependencies...
==> Compiling...
    Application:    otto-rails (rails)
    Project:        otto-rails
    Infrastructure: aws (simple)

    Compiling infra...
    Compiling foundation: consul
==> Compiling main application...
==> Compilation success!
    This means that Otto is now ready to start a development environment,
    deploy this application, build the supporting infrastructure, and
    more. See the help for more information.

    Supporting files to enable Otto to manage your application from
    development to deployment have been placed in the output directory.
    These files can be manually inspected to determine what Otto will do.
    
$ ls -a | grep otto
.otto_id
.otto/
```

本来ならば、アプリケーションのルートディレクトリ直下にAppfileという名前でファイルを作成して、その中にアプリケーションの情報を記入していくのですが、今回はシンプルになっていますので、必要ありません。

```javascript:Appfileのサンプル
application {
  name = "example"
  type = "ruby"
}

customization "ruby" {
  ruby_version = "2.2"
}
```

Appfileでrubyのバージョンを指定しない場合は基本的に最新版がインストールされます。
ちなみに **rubyのバージョンを細かく指定することはできません。**
brightbox/ruby-ngというppaを使ってインストールしているので、2.1と指定すれば2.1の最新版で、2.2と指定すれば2.2.3がインストールされます。
ここらへんは現状修正される見込みはないので、プラグインなんかを誰か作ってくれるとありがたいなぁ。

```console
$ otto compile
==> Loading Appfile...
==> Fetching all Appfile dependencies...
==> Compiling...
    Application:    example (ruby)
    Project:        otto-rails
    Infrastructure: aws (simple)

    Compiling infra...
    Compiling foundation: consul
==> Compiling main application...
==> Compilation success!
    This means that Otto is now ready to start a development environment,
    deploy this application, build the supporting infrastructure, and
    more. See the help for more information.

    Supporting files to enable Otto to manage your application from
    development to deployment have been placed in the output directory.
    These files can be manually inspected to determine what Otto will do.
```

## 開発環境を作ってみます。
環境構築の準備は整いました。構築はコマンド1発打つだけです。

```console
$ otto dev
==> Creating local development environment with Vagrant if it doesn't exist...
    Raw Vagrant output will begin streaming in below. Otto does
    not create this output. It is mirrored directly from Vagrant
    while the development environment is being created.

Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'hashicorp/precise64'...

.
.
.
```
vagrantのboxはhashicorp/precise64です。Debian系です。
コンパイルされた情報から仮想環境を構築してくれます。
ottoはv0.1.2からgemと依存関係のあるライブラリを自動でインストールしてくれる機能を持っています。
今回の例ですと、mysql2とnokogiriかな？に依存関係のあるライブラリがインストールされます。

```javascript:現状対応している依存関係
Gem: Library
curb: "libcurl3 libcurl3-gnutls libcurl4-openssl-dev"
capybara-webkit: "libqt4-dev"
mysql2: "libmysqlclient-dev"
nokogiri: "zlib1g-dev"
pg: "libpq-dev"
rmagick: "libmagickwand-dev"
sqlite3: "libsqlite3-dev"
libxml-ruby: "libxml-dev"
paperclip: "imagemagick"
```

```console:ottodevの続き
$ otto dev
.
.
.
==> default: Dec  1 08:37:09 precise64 otto: Dec  1 08:37:09 precise64 otto: /ho
me/vagrant/.gem/gems/activerecord-4.2.5/lib/active_record/connection_adapters/my
sql2_adapter.rb:18:in `mysql2_connection'
==> default: Dec  1 08:37:09 precise64 otto: Dec  1 08:37:09 precise64 otto: /h$
me/vagrant/.gem/gems/activerecord-4.2.5/lib/active_record/connection_adapters/a$
stract/connection_pool.rb:438:in `new_connection'
==> default: Dec  1 08:37:09 precise64 otto: Dec  1 08:37:09 precise64 otto: /h$
me/vagrant/.gem/gems/activerecord-4.2.5/lib/active_record/connection_adapters/a$
stract/connection_pool.rb:448:in `checkout_new_connection'
==> default: Dec  1 08:37:09 precise64 otto: Dec  1 08:37:09 precise64 otto: /h$
me/vagrant/.gem/gems/activerecord-4.2.5/lib/active_record/connection_adapters/a$
stract/connection_pool.rb:422:in `acquire_connection'
==> default: Dec  1 08:37:09 precise64 otto: Dec  1 08:37:09 precise64 otto: /ho
me/vagrant/.gem/gems/activerecord-4.2.5/lib/active_record/connection_adapters/ab
stract/connection_pool.rb:349:in `block in checkout'
==> default: Dec  1 08:37:09 precise64 otto: Dec  1 08:37:09 precise64 otto: /ho
me/vagrant/.gem/gems/activerecord-4.2.5/lib/active_record/connection_adapters/ab
stract/connection_pool.rb:348:in `checkout'
```
おっとエラーが出ました。(ottoだけに)
これはrailsのdatabase.ymlにMySQLの接続先をlocalhostに設定しているけど、MySQLServerが見つからないよというエラーです。
リモートのMySQLに繋ぐか、MySQLサーバをインストールすれば回避できるエラーです。

ここまでくればもうほとんどゴールです。
MySQLサーバが必要な人はインストールします。
ピンクの画面でパスワードを聞かれますが、今回は何も入力せずにEnterを押していきます。

```console
$ otto dev ssh

vagrant@precise64:/vagrant$ sudo apt-get install -y mysql-server
vagrant@precise64:/vagrant$ rake db:setup
```
もろもろの設定ができたら動いているか確認します。

```console
$ otto dev address | pbcopy
$ otto dev ssh
vagrant@precise64:/vagrant$ rails s -b 0.0.0.0
```
仮想マシンのipアドレスをクリップボードにコピーしてブラウザからipアドレスを叩いてみます。

![お馴染みの画像](http://mae.chab.in/wp-content/uploads/2013/02/Ruby_on_Rails__Welcome_aboard.png)
Railsのお馴染みの画面が出てきたら、開発環境の構築は終了です。

## 最後に
今回は開発環境の構築だけでしたが、本来はAWSへのデプロイまでをする予定でした。orz
時間ギリギリになってビルドにこけたとき、心が折れてしまいましたが、AWSへのデプロイをする記事もそのうち書きたいと思います。時間管理能力の甘さよ...