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 なレシピ (?) の試験は上で引用したものになるのか。

マルチな配布系対応

については別途確認の方向にて。
あと、wordpress な cookbooks てきには

  • apt
  • logrotate
  • openssl
  • xml

あたりが基本的なパケジで、その上に

が乗った上で wordpress なパケジが、という形なのかどうか。下から確認の方向です。