OpsWorksで構成するEC2のレシピを事前に確認したい


## 目的
表題そのままです。

## テストのために用意する環境
* chef-solo (11.14.2)
* vagrant (1.4.3)
* kitchen-ec2 (0.8.0)
* kitchen-vargrant (0.15.0)
* test-kitchen (1.2.1)
* serverspec


## 構築環境
* OS X 10.9.4 (Marvericks)
* Mem 8GB
* CPU 2.6GHz Intel Core i5

 
## 前提条件
* rubyがインストール済み
* vagrantが導入済み

### セットアップ
構成としては、chef-repoを用意して、そこで作成したレシピをtest-kitchenで実行したい。
まず、適当なディレクトリをchef-repoとして作成する。

[KitchenCI](http://kitchen.ci/docs/getting-started/)のGuideを例に作成してみる。

```bash
$ mkdir git-cookbooks
$ cd git-cookbooks
```

カレントディレクトリに移動したら、Gemfileを作成する。
knifeとtest-kitchenをインストールします。

```Gemfile
source "https://rubygems.org"

# knife
gem 'knife-solo'

gem 'berkshelf'
gem 'foodcritic'
gem 'rubocop'
gem 'busser'
gem 'serverspec'
gem 'dotenv'

# test-kitchen
gem 'test-kitchen'
gem 'kitchen-vagrant'
gem 'kitchen-ec2'
```

bundleでインストールします。

```bash 
$ bundle install --binstubs=bin --path=vendor/bundle 
```

### Kitchenの初期化とChefリポジトリの初期化
kitchenを初期化してみます。

```bash
$ bundle exec kitchen init
```

これで、.kitchen.ymlファイルが作成されます。
さらに、chef-repoとして、カレントディレクトリも初期化したいと思います。

```bash
$ bundle exec knife solo init .
```
これで、レシピを作成する準備が整いました。

これからは、Getting Started Guideに従って作業を進めてみます。
ただし、gitへのコミットなどは省略してます。

### レシピの作成
metadata.rbファイルをカレントディレクトリへ作成します。

```metadata.rb
name "git"
version "0.1.0"
```

ここでは、レシピは慣例通り、site-cookbooks以下にgitという名前で作成し、レシピファイルを作成する。

```bash
$ bundle exec knife cookbook create git -o site-cookbooks/
$ touch site-cookbooks/git/recipe/default.rb
```

ここで一旦、.kitchen.ymlファイルの編集へ移ります。
このファイルでEC2インスタンスの作成に関する設定を行います。
ファイルの内容については、[kitchen-ec2](https://github.com/test-kitchen/kitchen-ec2)のサイトを参照してください。

```.kitchen.yml
driver:
  name: ec2
  aws_access_key_id: <%= ENV['AWS_ACCESS_KEY'] %>
  aws_secret_access_key: <%= ENV['AWS_SECRET_KEY'] %>
  aws_ssh_key_id: [key pair]
  ssh_key: /path/to/your_ec2.pem
  security_group_ids: ["sg-xxxxxx"]
  region: ap-northeast-1
  availability_zone: [zone name]
  flavor_id: t2.micro
  require_chef_omnibus: true
  ebs_delete_on_termination: true

provisioner:
  name: chef_solo

platforms:
  - name: AmazonLinux-201403
    driver:
      image_id: ami-29dc9228
      username: ec2-user
      tags:
        Name: test-kitchen

suites:
  - name: default
    run_list:
      - recipe[git::default]	# <-- ここをかえてある。
    attributes:
```

ERB形式で置換が行えるので一部環境変数から取得するようにしてあります。
これでEC2インスタンスの作成が行えるようになります。

インスタンスの起動の前に確認

```bash
$ bundle exec kitchen list
Instance                   Driver Provisioner Last Action
default-AmazonLinux-201413 Ec2    ChefSolo    <Not Created>
```
まだ、作成されていないのを確認できました。
で、インスタンスを起動します。

```bash
$ bundle exec kitchen create
----> Starting Kitchen(v1.2.1)
----> (省略)
:
:
----> Kitchen is finished. (1m28.19s)
```
とうい具合にメッセージが表示されれば、インスタンスの起動に成功です。

### レシピの編集
gitを導入するレシピを作成する

```reciepes/default.rb
package 'git'

log "Well, that was too easy"
````

### レシピの実行
テスト用インスタンスへレシピを適用します。

```bash
$ bundle exec kitchen converge
-----> Starting Kitchen(v1.2.1)
-----> Converging <default-AmazonLinux-201403>...
;
:
-----> Kitchen is finished. (2m4.22s)
```
こんな感じでメッセージが表示されればOK。
更に、コマンドで確認してみると

```bash
$ bundle exec kitchen list
Instance                   Driver Provisioner Last Action
default-AmazonLinux-201413 Ec2    ChefSolo    Converged
```
Convergedとなっている。

### サーバで確認
サーバにログインしてみて、実際にレシピが適用されているのを確認。

```bash
$ bundle exec kitchen login default-AmazonLinux-201403

# which git
/usr/bin/git
# git --version
git version 1.7.9.5
```

これで一通りの確認が出来ると思います。
これ以降、ServerSpecなどでサーバのテストを書いていきます。

## 参考リンク
* [Kitchen CI 公式 - GETTING STARTED GUIDE](http://kitchen.ci/docs/getting-started/)
* [test-kitchen + serverspecで行うchef-repoのテスト](http://qiita.com/yshnb/items/854a1770d0d47479ab47)
* [test-kitchenでインフラのTDDに挑戦[Rails/Nginx/MySQL/rbenv]](http://morizyun.github.io/blog/test-kitchen-vagrant-rails-rbenv-chef-serverspec/)