share facebook facebook2 twitter menu hatena pocket slack

2016.02.29 MON

(ショロカレ 20 日目)test-kitchen + kitchen-vagrant + kitchen-verifier-shell で Ansible の Playbook を Serverspec でテストするメモ

川原 洋平

WRITTEN BY川原 洋平

「初老丸の独り Advent calendar 2015」の二十日目の記事です。

tl;dr

以前に Ansible の Playbook を test-kitchen と Serverspec を使ってテストしたことがあった。

boot2docker と test-kitchen で ansible の Playbook をテストする(3)〜 Serverspec でテストする 〜 - ようへいの日々精進XP
ども、かっぱです。やっとここまで辿り着いた...前回の続き。 サンプル ダラダラ文章よりもサンプルをこさえた。 sample-prj-20150305 サンプルの使い方は README.md を...(誰か英語教えて...)。 以下、サンプルをベースに記載。 Serverspec でテストする準備 spec...

inokara.hateblo.jp

メモ

kitchen-verifier-shell について


github.com

以下の二つの記事が参考にさせて頂いた。有難うございます。

Test-KitchenでServerspecやInfratasterをShell-Verifierから実行 - Qiita
サーバのプロビジョニングをテストする(https://github.com/test-kitchen/test-kitchen)が、v1.4でテストのステップ(verify)を追加しやすい変更をいれてきま...

qiita.com

ざっくりとした自分の認識としては…

  • test-kitchen の verify ステップで利用出来るツールを任意に指定出来るようになった(test-kitchen 1.4 から)
  • verify のステップでシェルを利用出来るようにしたもの

上記の参考記事では infrataster を実行していることから、kitchen-verifier-shell を利用すれば Serverspec をはじめ任意のコマンドも実行出来そう。

教材

今回の教材。

inokappa/oreno-ansible
Contribute to oreno-ansible development by creating an account on GitHub.

github.com

準備

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

gem "test-kitchen"
gem "kitchen-ansible"
gem "serverspec"
gem "kitchen-vagrant"
gem "kitchen-verifier-shell"
  • bundle install
$ bundle install
  • kitchen init
$ kitchen init --driver=kitchen-vagrant --provisioner=ansible-playbook

.kitchen.local.yaml

.kitchen.local.yaml を以下のように作成する。

driver:  name: vagrant

provisioner:
  name: ansible_playbook
  roles_path: roles

platforms:
  - name: oreno-ubuntu-14.04
    driver_plugin: vagrant
    driver_config:
      box: ubuntu-14.04
      box_url: https://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box

suites:
  - name: default
    provisioner:
      playbook: default.yml
      hosts: default

verifier:
  name: shell
  command: rspec -c -f d -I serverspec serverspec/common_spec.rb

roles/common/tasks/main.yml

ファイルを touch するだけ。

- file: path=/tmp/sample.txt state=touch mode=0644

Serverspec 関連ファイル

こちら の記事を参考にさせて頂いて以下のように作成した。

$ pwd
sample-prj-20151220
$ mkdir serverspec

#
# kitchen-verifier-shell が KITCHEN_HOSTNAME 等の環境変数をセットしてくれるので利用する(コレ便利!)
#
$ cat spec_helper.rb
require 'serverspec'
set :backend, :ssh

options = Net::SSH::Config.for(host)
options[:host_name] = ENV['KITCHEN_HOSTNAME']
options[:user]      = ENV['KITCHEN_USERNAME']
options[:port]      = ENV['KITCHEN_PORT']
options[:keys]      = ENV['KITCHEN_SSH_KEY']

set :host,        options[:host_name]
set :ssh_options, options
set :env, :LANG => 'C', :LC_ALL => 'C'

#
# ファイルが存在しているかをテストする
#
$ cat common_spec.rb
require 'spec_helper'

describe file('/tmp/sample.txt') do
  it { should be_file }
end

kitchen verify

$ kitchen verify

(snip)

       PLAY [all] ********************************************************************

       GATHERING FACTS ***************************************************************
       ok: [localhost]

       TASK: [common | file path=/tmp/sample.txt state=touch mode=0644] **************
       changed: [localhost]
              PLAY RECAP ********************************************************************        localhost                  : ok=2    changed=1    unreachable=0    failed=0                 Finished converging <default-oreno-ubuntu-1404> (1m39.27s).
-----> Setting up <default-oreno-ubuntu-1404>...
       Finished setting up <default-oreno-ubuntu-1404> (0m0.00s).
-----> Verifying <default-oreno-ubuntu-1404>...
       [Shell] Verify on instance=#<Kitchen::Instance:0x007fdfc446e528> with state={:hostname=>"127.0.0.1", :port=>"2222", :username=>"vagrant", :ssh_key=>"/path/to/private_key", :last_action=>"setup"}


File "/tmp/sample.txt"
  should be file

Finished in 0.68362 seconds (files took 0.97434 seconds to load)
1 example, 0 failures

       Finished verifying <default-oreno-ubuntu-1404> (0m1.78s).
-----> Kitchen is finished. (2m26.89s)
zlib(finalizer): the stream was freed prematurely.

ということで

kitchen-verifier-shell を使えば

  • ディレクトリ構造をシンプルにすることが出来た(従来は test/integration/default/serverspec/ とかディレクトリを作成する必要があった)
  • kitchen-verifier-shell が KITCHEN_HOSTNAME 等の環境変数をセットしてくれるのが嬉しい!

busser-serverspec について

基本的に test-kitchen では busser というツールを介して Serverspec や Cucumber のテストツールを実行しているが、対象のホストに busser や Serverspec をインストールする必要があったりするので kitchen-verifier-shell でテストを実行するよりも若干複雑で所要時間も掛かる。

Test Kitchen の Shell Verifier で Serverspec による Cookbook テストを行う #getchef #serverspec - クリエーションライン株式会社
Chef, CL LAB|2015年12月現在、Test Kitchen で Chef Cookbook のテストを行うのは busser-serverspec を媒介とした Serverspec がデファクトスタンダードとなっています(RubyGems.org 調べ: busser-serverspec:132万DL, busser

www.creationline.com

上記の記事が参考になった。有難うございます。

ちなみに、busser-serverspec と使った場合と kitchen-verifier-shell に Serverspec を実行させた場合の処理時間の差は以下の通り。

  • busser-serverspec を使った場合
$ kitchen verify

(snip)
-----> Kitchen is finished. (0m21.63s)
  • kitchen-verifier-shell を使った場合
$ kitchen verify

(snip)
-----> Kitchen is finished. (0m2.44s)

俄然、kitchen-verifier-shell 経由の方が速い。

でも…

  • Chef のレシピや Anaible の Playbook の書き方を学ばねば…

以上。

元記事はこちら

(ショロカレ 20 日目)test-kitchen + kitchen-vagrant + kitchen-verifier-shell で Ansible の Playbook を Serverspec でテストするメモ