目的
表題そのままです。
テストのために用意する環境
- 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のGuideを例に作成してみる。
$ mkdir git-cookbooks
$ cd git-cookbooks
カレントディレクトリに移動したら、Gemfileを作成する。
knifeとtest-kitchenをインストールします。
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でインストールします。
$ bundle install --binstubs=bin --path=vendor/bundle
Kitchenの初期化とChefリポジトリの初期化
kitchenを初期化してみます。
$ bundle exec kitchen init
これで、.kitchen.ymlファイルが作成されます。
さらに、chef-repoとして、カレントディレクトリも初期化したいと思います。
$ bundle exec knife solo init .
これで、レシピを作成する準備が整いました。
これからは、Getting Started Guideに従って作業を進めてみます。
ただし、gitへのコミットなどは省略してます。
レシピの作成
metadata.rbファイルをカレントディレクトリへ作成します。
name "git"
version "0.1.0"
ここでは、レシピは慣例通り、site-cookbooks以下にgitという名前で作成し、レシピファイルを作成する。
$ bundle exec knife cookbook create git -o site-cookbooks/
$ touch site-cookbooks/git/recipe/default.rb
ここで一旦、.kitchen.ymlファイルの編集へ移ります。
このファイルでEC2インスタンスの作成に関する設定を行います。
ファイルの内容については、kitchen-ec2のサイトを参照してください。
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インスタンスの作成が行えるようになります。
インスタンスの起動の前に確認
$ bundle exec kitchen list
Instance Driver Provisioner Last Action
default-AmazonLinux-201413 Ec2 ChefSolo <Not Created>
まだ、作成されていないのを確認できました。
で、インスタンスを起動します。
$ bundle exec kitchen create
----> Starting Kitchen(v1.2.1)
----> (省略)
:
:
----> Kitchen is finished. (1m28.19s)
とうい具合にメッセージが表示されれば、インスタンスの起動に成功です。
レシピの編集
gitを導入するレシピを作成する
package 'git'
log "Well, that was too easy"
レシピの実行
テスト用インスタンスへレシピを適用します。
$ bundle exec kitchen converge
-----> Starting Kitchen(v1.2.1)
-----> Converging <default-AmazonLinux-201403>...
;
:
-----> Kitchen is finished. (2m4.22s)
こんな感じでメッセージが表示されればOK。
更に、コマンドで確認してみると
$ bundle exec kitchen list
Instance Driver Provisioner Last Action
default-AmazonLinux-201413 Ec2 ChefSolo Converged
Convergedとなっている。
サーバで確認
サーバにログインしてみて、実際にレシピが適用されているのを確認。
$ bundle exec kitchen login default-AmazonLinux-201403
# which git
/usr/bin/git
# git --version
git version 1.7.9.5
これで一通りの確認が出来ると思います。
これ以降、ServerSpecなどでサーバのテストを書いていきます。