Serverspecテストコード実例の紹介とコード記述の際のポイント
DB(MySQL)部分のテストコード例
Zabbixの監視結果や監視設定をDBに格納し、正常に監視が実施できるために必要なDBの稼働状態として、以下のような状態をテストします。
正常な稼働状態
- MySQLのパッケージが導入されている
- MySQLのサービスが正常に稼働している
- MySQLのサービスがローカルのネットワークに対してのみTCPの3306番ポートでListenしている
- MySQLにZabbix用のデータベース、テーブルが作成されている
- MySQLが正しいパラメータで稼働している
テストコード
require 'spec_helper' describe package('mysql-server') do it { should be_installed } end describe service('mysqld') do it { should be_enabled } it { should be_running } end ### ポイント: ポートが特定のIPアドレスでListenしているか確認(2.0からの新機能) ### describe port(3306) do it { should be_listening.on('127.0.0.1').with('tcp') } end db_user = "zabbix" db_password = "zabbixpassword" describe command("mysqlshow -u#{db_user} -p#{db_password}") do it { should return_stdout /zabbix/ } end describe command("mysqlshow -u#{db_user} -p#{db_password} zabbix") do it { should return_stdout /hosts/ } end describe command("mysqladmin -u#{db_user} -p#{db_password} variables |grep character_set_server") do it { should return_stdout /utf8/ } end
※上記のテストコードには一部Serverspec2.0系からの新機能を利用した部分があります。1系で利用する場合には該当箇所を変更して利用してください。
【ポイント】
セキュリティ面を考慮すると、ただ単に、どのポートでListenしているかの確認だけでなく、より細かくどのIPアドレスでListenしているのかまで確認すべきケースもあります。2014/8/8時点ではまだβ版ではありますが、今後公開される予定のServerspec 2.0系ではportのMatcherがさらに拡張され、上記のテストコードの例のようにListenIP、Listenポート両方を組み合わせたテストが実行可能となります。Serverspecを利用する際にはバージョンに注意し、そのバージョンでどういったResourceTypeやMatcherに対応しているのかを確認することも重要です。
アプリケーション(PHP)部分のテストコード例
ZabbixのWebGUIを正常に稼働させるためは、以下のようなPHPの設定が必要となります。
正常な稼働状態
- PHPの設定値(memory_limitやdate.timezone等)が正しく設定されていること
テストコード
require 'spec_helper' php_values = [{'max_execution_time' => 300}, {'memory_limit' => '128M'}, {'post_max_size' => '16M'}, {'upload_max_filesize' => '2M'}, {'max_input_time' => 300}, {'date.timezone' => 'Asia/Tokyo'}] describe 'PHP config parameters' do php_values.each do |php_value| context php_config(php_value.keys.first) do its(:value) { should eq php_value[php_value.keys.first] } end end end
【ポイント】
php_configでチェックできる項目は、php.iniやphp.d/*.iniのファイルで定義されたパラメータ情報のみです。Apacheの設定ファイル中で設定されたphp_valueの値の確認はできません。こちらの設定項目もチェックしたい場合には、Apache設定ファイルの中身を確認するなど工夫が必要です。また、php_configのテストは実際には以下のようなコマンドをサーバ内部で実行しています。
sudo php -r 'echo get_cfg_var( "max_execution_time" );'
max_execution_timeなどの項目は内部から実行する場合、必ず無制限を示す0を返す仕様となっているため、実際にブラウザからアクセスした時に適用される設定値と異なる値がテスト結果として報告されることがあります。Serverspecはあくまでサーバ内部から見た時のサーバの状態を確認するツールとなっているため、その点は注意が必要です。
まとめ
第2回では、より具体的なシステム例を題材としてServerspecのテストの記述の方法や記述時の要注意ポイントを紹介しました。Serverspecのコードを記述する際には、そのテストコードを書くことで内部的にどういった処理が走るのかを正しく把握しておくことが重要です。また、Serverspecのテストコードもアプリケーションのコードと同じく、より可読性を高めてシンプルに記述することで長期に渡った運用に活用できるものとなります。
次回は、Serverspecのテストコードをより効果的に書くためのTipsをいくつか紹介します。