itamaeとvagrantでやるテスト駆動--その1-Apache,PHP編
rake specを実行しつつItamaeで構築
hostとwebというサーバをたてて
hostにserverspecとItamaeをインストールし、
webを構築して、テストをしていきます。
mkdir serverspec_test
cd serverspec_test
Vagrantfileを作成します。
vagrant init bento/centos-6.7
vi Vagrantfile
以下のように編集
# config.vm.box = "bento/centos-6.7" #コメントアウトする
## 以下の設定を追記して hostとwebにIPアドレス割り振る
config.vm.define "host" do |node|
node.vm.box = "bento/centos-6.7"
node.vm.hostname = "host"
node.vm.network :private_network, ip: "192.168.33.10"
end
config.vm.define "web" do |node|
node.vm.box = "bento/centos-6.7"
node.vm.hostname = "web"
node.vm.network :private_network, ip: "192.168.33.11"
end
vagrantを立ち上げてログインをします
$ vagrant up
$ vagrant status
$ vagrant ssh host
ホストからWEBへssh接続できるようにします。
[vagrant@host ~]$ ssh-keygen -N "" -f ~/.ssh/id_rsa
[vagrant@host ~]$ cat << FIN >> ~/.ssh/config
> Host web
> HostName 192.168.33.11
> FIN
[vagrant@host ~]$ chmod 600 .ssh/config
[vagrant@host ~]$ ssh-copy-id web
[vagrant@host ~]$ ssh web
[email protected]'s password:
[vagrant@web ~]$ uname -n
web
環境構築をしていきます。 dotinstallのgitからミドル一式をインストールして、 gemでitamaeとserverspecをインストールします。
git clone https://github.com/dotinstallres/centos65.git
$ cd centos65
$ ./run.sh
$ exec $SHELL -l
$ gem list
$ gem install itamae serverspec
$ gem list
作業ディレクトリを任意の場所に作っておきます。 また、Itamaeで使用するファイルも予め作っておきます。
$ mkdir myproject
$ cd myproject/
$ mkdir cookbooks
$ cd cookbooks/
$ touch recipe.rb
serverspec-initでテスト対象への
OSや接続方法、ホスト名などを入力します。
$ serverspec-init
Select OS type:
1) UN*X
2) Windows
Select number: 1
Select a backend type:
1) SSH
2) Exec (local)
Select number: 1
Vagrant instance y/n: n
Input target host name: web
+ spec/
+ spec/web/
+ spec/web/sample_spec.rb
+ spec/spec_helper.rb
+ Rakefile
+ .rspec
サンプルのテストファイルは削除し、 位置から空のテストファイルを作成していきましょう。
$ cd spec/
$ cd web/
$ rm sample_spec.rb
$ touch httpd_spec.rb
httpd_spec.rbにApacheのテストを書きます。
$ vi httpd_spec.rb
require 'spec_helper'
describe package('httpd') do
it { should be_installed }
end
ここでテストを実行してテストが正常に失敗することを確認します。
$ rake spec
テストが通るように、
recipe.rbにApacheインストールの記述をします。
$ vi cookbooks/recipe.rb
package 'httpd'
itamaeを実行してテストが通ることを確認します。
$ itamae ssh -h web cookbooks/recipe.rb -n
$ itamae ssh -h web cookbooks/recipe.rb
$ rake spec
テストの際,Rspecの記法として ResourceとMatcherが出てきました。 これらの種類は公式サイトのRESOUCE TYPEから確認できます。
Resource
- 何をテストするのか
- httpdのpackage
Matcher
- どういう状態
- be_installed
まずはhttpdが自動起動していて、80番ポートでLISTENしているかテストを書きます。
be_enableで自動起動の設定で、be_runningがスタートしているかです。
require 'spec_helper'
describe service('httpd') do
it { should be_enabled }
it { should be_running }
end
describe port(80) do
it { should be_listening }
end
それではhttpdを自動起動させます。
:enable :startで自動起動させます。
デフォルトで80番ポートでLISTENします。
package 'httpd'
service 'httpd' do
action [:enable, :start]
end
rake speckを実行してテストが成功することを確認
ファイルを転送して、中身のテストをしていきます。
index.htmlが存在して、中身がHello Worldという文字列が含まれているか
テストを書きます。
オーナとグループがapacheであることも確認します。
describe file('/var/www/html/index.html') do
it { should be_file }
it { should be_owned_by 'apache' }
it { should be_grouped_into 'apache' }
its(:content) { should match /Hello World/ }
end
filesフォルダを作り、 そこに転送用のindex.htmlを書きます。
$ mkdir cookbooks/files
$ vi cookbooks/files/index.html
<html>
Hello World
</html>
Itamaeではオーナとグループがapacheのindex.html
/var/www/html/配下に転送させます。
remote_file '/var/www/html/index.html' do
owner 'apache'
group 'apache'
end
rake specを実行し、テストが成功することを確認
パッケージをまとめてインストールさせて、テストを実施する
phpのテストを書いてみます。
新しくテストファイルを書きます。
eachメソッドを使いパッケージをインストールします。
php、php-devel、php-mbstring、php-gdが入っていることを確認します。
require 'spec_helper'
%w(php php-devel php-mbstring php-gd).each do |pkg|
describe package(pkg) do
it { should be_installed }
end
end
Itamaeのレシピには以下を追加してパッケージをインストールさせます。
%w(php php-devel php-mbstring php-gd).each do |pkg|
package pkg
end
rake speqを実行して、 PHPがインストールしたことを確認します。
PHPがインストールされたことを確認したら、 設定ファイルの中身を確認します。
php_configというリソースを使っていきます。
タイムゾーンがAsia/Tokyoであることを確認してみる
設定項目はdata.timezode
値を確認するにはits(:value)を使います。
shouldで文字列が同じでないといけないと書きます。
describe php_config('date.timezone') do
its(:value) { should eq 'Asia/Tokyo' }
end
Itamaeではレシピに以下を追記
/etc/php.iniをaction :editで編集
blockを使い|content|で破壊的メソッドで置換をします。
コメントアウトになっているdate.timezoneを
'date.timezone = Asia/Tokyo'に置換
file '/etc/php.ini' do
action :edit
block do |content|
content.gsub!(';date.timezone =', 'date.timezone = Asia/Tokyo')
end
end
rake specを実行し、 ファイルが編集されていることを確認します。
次に、ディレクトリが存在するかテストしてみます。
ファイルやディレクトリを確認するテストファイルを作成します。
file()リソースを使い、Matcherでbe_directoryを使えばテストできますが、
commandリソースでコマンドを実行させて確認することもできる
今回ならlsコマンドを実行して、その結果をテストする
its(:stdout)で標準出力をテストできます。
今回は空白とディレクトリ名と行末の正規表現でテストします。
require 'spec_helper'
# describe file('/home/vagrant/myapp') do
# it { should be_directory }
# end
describe command('ls -la /home/vagrant') do
its(:stdout) { should match /\smyapp$/ }
end
Itamaeのレシピではディレクトリを作成するレシピを追記します
directory '/home/vagrant/myapp'
