Serverspecテストコード実例の紹介とコード記述の際のポイント

2014年8月22日(金)
池田 大輔

DB(MySQL)部分のテストコード例

Zabbixの監視結果や監視設定をDBに格納し、正常に監視が実施できるために必要なDBの稼働状態として、以下のような状態をテストします。

正常な稼働状態

  • MySQLのパッケージが導入されている
  • MySQLのサービスが正常に稼働している
  • MySQLのサービスがローカルのネットワークに対してのみTCPの3306番ポートでListenしている
  • MySQLにZabbix用のデータベース、テーブルが作成されている
  • MySQLが正しいパラメータで稼働している

テストコード

spec/server-01/mysql_spec.rb

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をいくつか紹介します。

TIS株式会社

Twitter : @ike_dai
TIS株式会社OSS推進室所属。社内向けシステムの保守運用業務を経験後、クラウド時代の効率的な統合運用管理をテーマに活動中。特に、OSSを駆使した運用のエコシステム実現を目指し、Zabbix,fluentd,Serverspec,Ansibleなどの導入や検証に取り組む。技術検証成果などを技術ブログ『Tech-Sketch』にて発信中。著書:『Zabbix統合監視徹底活用 - 複雑化・大規模化するインフラの一元管理』

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています