「初老丸の独り Advent calendar 2015」の二十日目の記事です。
tl;dr
以前に Ansible の Playbook を test-kitchen と Serverspec を使ってテストしたことがあった。
今回、復習するつもりで同じことしようと思ったけど、せっかくなので kitchen-verifier-shell を使ってみようと思ったのでメモ。(教材の README と同じ内容)
メモ
kitchen-verifier-shell について
以下の二つの記事が参考にさせて頂いた。有難うございます。
ざっくりとした自分の認識としては...
- test-kitchen の verify ステップで利用出来るツールを任意に指定出来るようになった(test-kitchen 1.4 から)
- verify のステップでシェルを利用出来るようにしたもの
上記の参考記事では infrataster を実行していることから、kitchen-verifier-shell を利用すれば Serverspec をはじめ任意のコマンドも実行出来そう。
教材
今回の教材。
準備
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 でテストを実行するよりも若干複雑で所要時間も掛かる。
上記の記事が参考になった。有難うございます。
ちなみに、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 の書き方を学ばねば...
以上。