wordpress の chef-repo 確認しつつ試験の検討
標題変える。とりあえず何をしてるのかが分からないと試験は書けないし。
当初は apache2 とか言ってましたが規模が小さめなものから確認していかないとどうにもならないということで build-essential から確認します。でびあん限定で。
recipes/default.rb
記述が以下。
begin include_recipe "build-essential::#{node['platform_family']}" rescue Chef::Exceptions::RecipeNotFound Chef::Log.warn "A build-essential recipe does not exist for the platform_family: #{node['platform_family']}" end
でびあん系限定で言うと begin の下は以下になるはず
include_recipe "build-essential::debian"
こちら、recipe/debian.rb というファイルがあるのでこちらを、という形になるはず。ざっくりベースで見ると
- apt-get update
- パケジの導入
という形になっている模様。最初のブロックが以下で apt-get update です。
execute "apt-get-update-build-essentials" do command "apt-get update" action :nothing # tip: to suppress this running every time, just use the apt cookbook not_if do ::File.exists?('/var/lib/apt/periodic/update-success-stamp') && ::File.mtime('/var/lib/apt/periodic/update-success-stamp') > Time.now - 86400*2 end end.run_action(:run) if node['build_essential']['compiletime']
ブロックの中では action は :nothing という形になってて、update-success-stamp というファイルが存在しないか、タイムスタンプが一定時間以前であれば、最後の end.run_action が、という形なのか。しかも変数の値が false なら実行されません。
あと、update-success-stamp な条件が偽の場合は end.run_action も、という事になるんですかね。これはなかなかアレゲな仕掛け。
ちなみに node['build_essential']['compiletime'] は build-essential な recipe の attributes/default.rb で以下な形になっていて
# おそらくデフォは false ね、という事かと
default['build_essential']['compiletime'] = false
wordpress なレシピ (cookbook?) 全体を grep してみると以下で true をセットしてました。
find . -type f -print0 | "xargs" -0 -e grep -nH -e compiletime ./cookbooks/mysql/recipes/ruby.rb:28:node.set['build_essential']['compiletime'] = true ./cookbooks/xml/recipes/ruby.rb:27:node.set['build_essential']['compiletime'] = true
次のブロックですが定義が以下。
%w{ autoconf binutils-doc bison build-essential flex }.each do |pkg| r = package pkg do action( node['build_essential']['compiletime'] ? :nothing : :install ) end r.run_action(:install) if node['build_essential']['compiletime'] end
これ、変数の値がどちらでも導入、って理解で良いのかな。
これを踏まえると
試験で確認すべきなのは以下のパケジが導入されていること、ということかな。
serverspec の中を確認してみるに、be_installed というソレがありますね。試験を書いてみて確認してみます。手順確認しながら、なので長くなるかも。
再開
box add から、ということで以下。
$ vagrant box add test http://files.vagrantup.com/precise32.box
あら、~/.vagrant.d/boxes の中身をコピーすれば良いのかな。ヤッてみよ。
$ cp ~/.vagrant.d/boxes/precise32 ~/.vagrant.d/boxes/test
で、ディレクトリを掘って
$ mkdir test $ cd test
vagrant init で Vagrantfile ができるので
$ vagrant init
以下を盛り込み。
Vagrant.configure("2") do |config| config.vm.box = "precise32" config.vm.network :private_network, ip: "192.168.33.10" config.vm.provider :virtualbox do |vb| # Don't boot with headless mode vb.gui = true # Use VBoxManage to customize the VM. For example to change memory: vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"] vb.customize ["modifyvm", :id, "--natdnsproxy1", "on"] #vb.customize ["modifyvm", :id, "--memory", "1024"] end end
で、vagrant up 実行。
$ vagrant up
どうなるか。って言ってる間に割り込みを済ませていたら起動していた。確認してみたら build-essential は入っていないようだったのでとりあえずレシピを作ります。
knife
ええと、初期化が以下か。
$ knife kitchen chef-repo WARNING: `knife kitchen` is deprecated! Please use: knife solo init DIRECTORY Creating kitchen... Creating knife.rb in kitchen... Creating cupboards...
で、
$ knife solo prepare 192.168.33.10 Bootstrapping Chef... --2013-05-09 10:54:08-- https://www.opscode.com/chef/install.sh Resolving www.opscode.com (www.opscode.com)... 184.106.28.83 Connecting to www.opscode.com (www.opscode.com)|184.106.28.83|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 6510 (6.4K) [application/x-sh] Saving to: `install.sh' 100%[======================================>] 6,510 --.-K/s in 0s 2013-05-09 10:54:10 (870 MB/s) - `install.sh' saved [6510/6510] Downloading Chef 11.4.4 for ubuntu... Installing Chef 11.4.4 Selecting previously unselected package chef. (Reading database ... 29361 files and directories currently installed.) Unpacking chef (from .../chef_11.4.4_i386.deb) ... Setting up chef (11.4.4-2.ubuntu.11.04) ... Thank you for installing Chef! Generating node config 'nodes/192.168.33.10.json'... ERROR: Errno::ENOENT: No such file or directory - nodes/192.168.33.10.json
このアクションでリモホに Chef を云々してるのかな。つうかこれって chef-repo で、でした。とほほ、と言いつつリトライ。
$ cd chef-repo $ knife solo prepare 192.168.33.10
今度は正常終了。リモノへの導入云々はリトライされている模様。nodes/192.168.33.10.json は作られてますね。
次に cookbook ディレクトリで以下を実行して
$ cd cookbooks $ git clone git://github.com/opscode-cookbooks/build-essential.git
で、nodes/192.168.33.10.json を以下にしとけば準備完了なのかどうか。
{"run_list":["build-essential"]}
とりあえず、次は serverspec の用意。
serverspec
ひとまず、以下を実行。
$ serverspec-init
実行するのは仮想ホストの定義なルートで、Vagrantfile があるディレクトリ。
$ ls chef-repo Vagrantfile $ serverspec-init Select a backend type: 1) SSH 2) Exec (local) 3) Puppet providers (local) Select number: 1 Input target host name: 192.168.33.10 + spec/ + spec/192.168.33.10/ + spec/192.168.33.10/httpd_spec.rb + spec/spec_helper.rb + Rakefile
とりあえず httpd_spec.rb を修正します。
require 'spec_helper' describe 'autoconf' do it { should be_installed } end describe 'binutils-doc' do it { should be_installed } end describe 'bison' do it { should be_installed } end describe 'build-essential' do it { should be_installed } end describe 'flex' do it { should be_installed } end
rake spec 実行。
$ rake spec Finished in 1.08 seconds 5 examples, 5 failures Failed examples: rspec ./spec/192.168.33.10/httpd_spec.rb:4 # autoconf rspec ./spec/192.168.33.10/httpd_spec.rb:8 # binutils-doc rspec ./spec/192.168.33.10/httpd_spec.rb:12 # bison rspec ./spec/192.168.33.10/httpd_spec.rb:16 # build-essential rspec ./spec/192.168.33.10/httpd_spec.rb:20 # flex rake aborted!
一部略してます。失敗を確認した所で、knife solo で導入なのか。
$ cd chef-repo $ knife solo cook 192.168.33.10 Running Chef on 192.168.33.10... Checking Chef version... Uploading the kitchen... Generating solo config... Running Chef... Starting Chef Client, version 11.4.4 Compiling Cookbooks... Converging 5 resources Recipe: build-essential::debian * package[autoconf] action install - install version 2.68-1ubuntu2 of package autoconf * package[binutils-doc] action install - install version 2.22-6ubuntu1 of package binutils-doc * package[bison] action install - install version 1:2.5.dfsg-2.1 of package bison * package[build-essential] action install - install version 11.5ubuntu2.1 of package build-essential * package[flex] action install - install version 2.5.35-10ubuntu3 of package flex Chef Client finished, 5 resources updated
導入完了な模様。続いて試験を再度実行。
$ cd .. $ rake spec Finished in 0.25856 seconds 5 examples, 0 failures
成程。すばらです。そういった意味ではでびあん限定になってしまいますが、build-essential なレシピ (?) の試験は上で引用したものになるのか。