Serverspec でファイルシステムのテスト(EC2 にアタッチした ELB に対して resize2fs が実行されているかを確認するテスト)を書こうと思っていて,最初は df
+ sed
+ awk
で頑張って書こうと思っていたけど,よくよく調べたら Serverspec には Host Inventory と呼ばれる機能があって,サクッと解決することができた.
ebs_spec.rb
デバイスパスは適宜変えてもらうとして,host_inventory['filesystem']['/dev/xvde']['kb_size']
で割り当てられてるサイズ (KB) を取得することができた.また df
を実行するとわかる通り,実際に表示されるサイズは少し小さくなっていて,今回は 2% を誤差の閾値として考慮するテストにした.
あと運用上使っているテストは複数ホストを対象にしているため,host_inventory['hostname']
からホスト名を取得して,別途 { ホスト名: 期待値 }
を定義したハッシュから期待値を取得するようにしている.ホスト名じゃなくてロール名の場合も基本的には同じかと.
require 'spec_helper' describe 'Check filesystem size' do # 期待値となるサイズを KB 単位で取得する expected_size_kb = 50 * 1024 * 1024 # 期待値と実測値の差を KB 単位で取得する size_difference_kb = expected_size_kb - host_inventory['filesystem']['/dev/xvde']['kb_size'].to_i # 実測値は EBS の指定値より少なくなるため、期待値の 2% を誤差として判断する it { expect(size_difference_kb).to be <= (expected_size_kb * 0.02).to_i } end
実行結果
$ bundle exec rake spec:xxx Check filesystem size should be <= 1048576 1 examples, 0 failures
Host Inventory
今回は
host_inventory['filesystem']
host_inventory['hostname']
を使ったけど,他にも様々な Host Inventory も取得できて,自由度高く Serverspec が書けるなと驚いた.
host_inventory['cpu']
host_inventory['memory']
host_inventory['ec2']