share facebook facebook2 twitter menu hatena pocket slack

2014.06.16 MON

bash で書いたセットアップスクリプトを test-kitchen + kitchen-ec2 + Serverspec でテストする試み

川原 洋平

WRITTEN BY川原 洋平

どうも炎の料理人三ツ星シェルの かっぱこと 川原 洋平@inokara)です。

はじめに

ansible にも test-kitchen のようなテストフレームワークは無いのかなーと探していたら provisioner として shell を指定していた記事を見つけたのでその記事に倣って試してみる。

尚、セットアップする環境は AWSEC2 インスタンスを使いたい為、kitchen-ec2 を利用する。



参考



とりあえず

  • 作業メモ


作業のサマリ

以下のような流れ。

  • test-kitchen の導入
  • テスト用の bash 作成
  • kitchen-ec2 の導入
  • serverspec の spec を作成


実際の作業


試した環境

  • Mac OS X 10.9 Marvericks


test-kitchen の導入

sudo gem install test-kitchen --no-ri --no-rdoc -V


テスト用の bash を用意

mkdir -p test-kitchen/provisioner-shell
cat << EOT > bootstrap.sh
#!/usr/bin/env bash

yum -y install httpd
chkconfig httpd on
service httpd start
EOT

シェルスクリプトの名前は bootstrap.sh で決め打ち。


kitchen-ec2 の導入

cd test-kitchen/provisioner-shell
sudo kitchen init --driver=kitchen-ec2


.kitchen.yml の設定

---
driver:
  name: ec2
  aws_access_key_id: AKxxxxxxxxxxxxxxxxxxxx
  aws_secret_access_key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  aws_ssh_key_id: chef-test
  ssh_key: <%= File.expand_path('~/.ssh/chef-test.pem') %>
  security_group_ids: ["sg-0xxxxxx"]
  region: us-east-1
  availability_zone: us-east-1b
  flavor_id: t1.micro
  require_chef_omnibus: true

provisioner:
  name: shell

platforms:
  - name: centos-6.5
    driver:
      image_id: ami-eb6b0182
      username: root


suites:
  - name: default


servespec の spec ファイルを用意

cd test-kitchen/provisioner-shell
mkdir -p test/integration/default/serverspec
cd test/integration/default/serverspec
vim test_spec.rb

以下のように用意する。

require 'serverspec'

include Serverspec::Helper::Exec
include Serverspec::Helper::DetectOS

RSpec.configure do |c|
  c.before :all do
    c.path = '/sbin:/usr/sbin'
  end
end

%w(httpd).each do |t|
  describe package("#{t}") do
    it { should be_installed }
  end
  describe service("#{t}") do
    it { should be_enabled }
    it { should be_running }
  end
end

これで準備完了。



キッチン

あとはいつものように kitchen test する前にちょっと kitchen create からの kitchen list してみたのが以下の図。

bash-test-kitchen-kitchen-ec2-serverspec_01

ちゃんと ProvisionerShell になっているのが嬉しいよね。


とりあえず kitchen converge

kitchen converge

暫くすると…

bash-test-kitchen-kitchen-ec2-serverspec_02

出来上がり。


kitchen verify

ちょっと残念なところが…順調、順調と思っていたら…

bash-test-kitchen-kitchen-ec2-serverspec_03

ガビーン、ここで Chef 依存(というか Ruby 依存)。ま、もともと Chef 用のテストフレームワークなのでそれは仕方ないですな。と言うことで、以下のように bootstrap.sh の冒頭に Chef をインストールw

#!/usr/bin/env bash

curl -L https://www.opscode.com/chef/install.sh | bash # これ苦肉の策
#
yum -y install httpd
chkconfig httpd on
service httpd start

そして…

kitchen verify

お疲れ様でした。以下のようにテストも通りました。

bash-test-kitchen-kitchen-ec2-serverspec_04


後片付け

ちゃんと落としておきましょうということで…

kitchen destroy

お疲れ様でした。



まとめ


感動

bash で書いた秘伝のタレをテストしたい、テストしたいと思っていたらこの手があったんかと今更に感動した。


ちょっとズコッときたとこ

結局は事前に Chef をインストールしなければ busser がインストール出来ないので注意。これは Chef 入りのインスタンスとかでテストすればよかろーもん。

元記事は、こちら