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 vagrant@192.168.33.11'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'