Vagrant + Berkshelf で環境に優しくないソフトウェアを試す

色々なものを入れる必要のあるソフト試すしたいけど、既存環境は嫌なので、Vagrant + Chef で仮想環境で試してみました。

試してみるのは [Tiny Tiny RSS][tt-rss] （以下 tt-rss）ですが、他でも使いまわせるようにメモしたい。

「知らんがな、tt-rss 試してみたいだけだよ」って人は [kui/ttrss-test](https://github.com/kui/ttrss-test) の README 読んで使ってみてください。

**注意**: ちゃんとした Cookbook を作成するなら、`chefspec` や `serverspec` や `foodcritic` も必要です

動機: 既存環境汚したくないけど試したい
------------------------------

tt-rss は自前サーバにインストールするタイプのフィードリーダーなんですが、MySQL 使ったり、PHP 使ったりと、今の環境から色々なものを入れないといけないみたいで二の足を踏んでいたら、Google Reader 死んでしまったので、Vagrant と Chef で環境構築してさくっと作って試しに使ってみる事にしました。


[tt-rss]: http://tt-rss.org/redmine/projects/tt-rss/wiki

準備する
------------

Berkshelf と Vagrant の便利プラグインをインストールする:

```sh:端末
# box に chef を自動でインストール・更新してくれるプラグイン
vagrant plugin install vagrant-omnibus
# berkshelf と連携してくれる
vagrant plugin install vagrant-berkshelf
gem install berkshelf --no-ri --no-rdoc
```

Vagrant 自体のインストールは公式サイト見てください。

Cookbook
----------------------

まずはじめに、Cookbook と Vagrant 設定の雛形を作成する: 

```sh:端末
berks cookbook ttrss-test
cd ttrss-test
```

ここで作成されたものを改変したり追加したりして、cookbook を作る。

今回は、たまたま tt-rss をインストールするための cookbook を作成している方がいたので、それを使います。

* wtreur/tt-rss https://github.com/wtreur/tt-rss

**超大事**: cookbook の `README` はよく読みましょう。当たり前ですが。

先ほど作成した trss-test が、この tt-rss に依存する旨を `metadata.rb` の末尾に記述する:

```rb:metadata.rb
 ...
depends 'tt-rss'
```

[Opscode Community][] に登録されてるクックブックならこれだけでいいのですが、この tt-rss は登録されてないので、github から取ってくるように `Berksfile` の末尾に書きます:

[Opscode Community]: http://community.opscode.com/

```rb:Berksfile
 ...
cookbook 'tt-rss', git: 'https://github.com/wtreur/tt-rss.git'
```

依存関係について記述したら `Berksfile` の依存関係を解決してみる:

```sh:端末
berks install
```

エラー等でなければ Vagrant の設定をする。


Vagrant の設定
----------------------

[tt-rss の README][ttrss-readme] 曰く:

> Requirements
> ============
> ## Platforms
> * Debian, Ubuntu

という事なので、Berkshelf が用意してくれた CentOS の box の設定破棄して、`Vagrantfile` をこんな感じに書く:

```rb:Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.hostname = "ttrss-berkshelf"

  # see https://github.com/opscode/bento
  config.vm.box = "opscode_ubuntu-12.04"
  config.vm.box_url = 'https://opscode-vm-bento.s3.amazonaws.com/vagrant/opscode_ubuntu-12.04_provisionerless.box'

  # tt-rss が動く web サーバにアクセスするために必要。
  # 8080 以外でも空いてるホストOSのポート番号を指定すればOK
  config.vm.network :forwarded_port, guest: 80, host: 8080

  # require `vagrant plugin install vagrant-berkshelf`
  config.berkshelf.enabled = true

  # require `vagrant plugin install vagrant-omnibus`
  config.omnibus.chef_version = :latest

  config.vm.provision :chef_solo do |chef|
    chef.json = {
      :mysql => {
        :server_root_password => 'rootpass',
        :server_debian_password => 'debpass',
        :server_repl_password => 'replpass'
      }
    }

    chef.run_list = [
        "recipe[ttrss::default]"
    ]
  end
end
```

[ttrss-readme]: https://github.com/wtreur/tt-rss/blob/master/README.md


実行してみる
-----------------

端末で:

```sh:端末
vagrant up
# 時間かかる
echo 'my-tinyrss.com 127.0.0.1' | sudo tee -a /etc/hosts
```

初回は、box のインストールがあるので十数分程度かかります。成功しているのを確認できたら次へ。

ログイン
-----------

<http://my-tinyrss.com:8080/> にアクセスして、ユーザ名: `admin`、パスワード: `password` でログインできます。


注意
-------------

Berkshelf が作る `LICENSE` ファイルは:

> All rights reserved - Do Not Redistribute

になってるので、気になる人は適当に修正しましょう。


終わり
-------------

出来上がった奴がこちらになります: 

* [kui/ttrss-test](https://github.com/kui/ttrss-test) 

ただ、最新版の tt-rss 使えるように、上記したものから少し手を加えています。

これと同じ方法で [munin][] も使ってみたかったけれど、これ、chef-solo だと動かない Cookbook なんですね。。。

[munin]: https://github.com/opscode-cookbooks/munin