Post on 24-Apr-2015
description
July Tech Festa 20132013/07/14
Gosuke Miyashita
サーバプロビジョニン
グ
Cloud or VMImage Launch
OSInstall
SystemConfiguration
Provisioning Toolchain by Lee Thompson at Velocity 2010
Application ServiceOrchestration
Bootstrapping
Configuration
OrchestrationCapistranoFabric
PuppetChef
EC2OpenStack
サーバプロビジョニン
グとテスト
監視とは継続的なテストである
by @kazuho
Cloud or VMImage Launch
OSInstall
SystemConfiguration
Application ServiceOrchestration
Bootstrapping
Configuration
Orchestration NagiosZabbix
serverspec
???
Zabbix/Nagiosによる Apacheのテスト(監視)
httpdプロセスが動いているか80番ポートに外からアクセスできるか80番ポートが正しいレスポンスを返すか
serverspecによる Apacheのテスト
httpdプロセスが動いているか80番ポートを Listenしているかhttpdパッケージが入っているか自動起動するようになっているか設定ファイルが存在するか正しい設定がされているか
Orchestration領域のテストZabbixNagiosConfiguration領域のテストserverspec
Configuration領域におけるテスト
みなさんどうやってますか?
シェルコマンド叩く?
シェルスクリプト?実際にサービスにアクセスする?
ConfigurationManagementFramework
ConfigurationManagement Framework
とテスト
これはテストどうやってますか?
シェルコマンド叩く?
シェルスクリプト?実際にサービスにアクセスする?
この界隈は様々なテストツールが存在
シンタックスチェックFoodcriticknife cookbook testpuppet-lint
ユニットテストChefspecrspec-puppet
require 'chefspec'
describe 'http_server::default' do let (:chef_run) { ChefSpec::ChefRunner.new.converge 'http_server::default‘ } it 'should install nginx' do expect(chef_run).to install_package 'nginx' end
it 'should start nginx' do expect(chef_run).to start_service 'nginx' endend
結合テストMinitest Chef HandlerCucumber ChefTest Kitchenrspec-systemserverspec
class TestNginx < MiniTest::Chef::TestCase def test_package_is_installed assert_installed package("nginx") end
def test_service_is_running assert_running service("nginx") endend
Infrastructure as Codeからの自然な流れ
サーバの状態をコードで記述
↓状態のテストもコードで記述
serverspecはこの流れの中で生まれたもの
severspecとは
サーバの状態を簡潔なコードで記述して
テストするための仕組み
サーバの状態をRSpecで記述
RSpec?
Rubyのテストフレームワーク
describe Array, "when empty" do before do @empty_array = [] end
it "should be empty" do expect(@empty_array).to be_empty end
it "should size 0" do expect(@empty_array.size).to eq 0 endend
serverspecによるテスト
describe package('httpd') do it { should be_installed }end
describe service('httpd') do it { should be_enabled } it { should be_running }end
describe port(80) do it { should be_listening }end
基本的にシェルコマンド叩い
てチェックしてるだけ
テスト対象のサーバに SSHで接続してコマンドを叩く
シェルコマンド実行によるサーバのテストをスマートにやれるようにしたのが
serverspec
serverspecの始め方
# yum install rubygems# gem install serverspec rake# serverspec-init# rake spec
デモ
詳細はhttp://serverspec.org/
serverspecをつくった理由
Puppetや Chef使っていてそもそも
serverspecって必要?
そもそもPuppetや Chefにテストって必要?
レシピやマニフェストが正しく書けたかどう
か必ずテストしますよ
ね?
一度書いたマニフェストやレシピを更新しないのであればそれほど必要ではないかも
マニフェストやレシピを継続的に更新す
るなら必要性が高まる
プログラムのリファクタリングと
一緒
様々なテストツールが存在するのになぜわざわざ serverspecをつくったのか?
既存ツールは機能が多すぎたり、特定のツールに依存してたりするのがイヤ
serverspecの特徴
マニフェストを継続的に更新するならテストコードも継続的な更新が必要
なのでテストコードの読みやすさや書きやすさも重要
テストツール自体のシンプルさも重要
Chefや Puppetに依存しない
テスト対象のサーバにエージェント不要
テスト対象のサーバに Rubyすら不要
テスト以外の余計な機能がない
利用のための敷居が低い
テストはシェルコマンドを実行してるだ
け
問題が起きたときに調査しやすい
serverspecの応用
サーバ構築の継続的インテグレーション
Puppetマニフェストを更新したら自動でマニフェスト適用と
serverspecによるテストを実行
まとめ
シェルコマンド実行によるサーバのテストをスマートにやれるようにしたのが
serverspec
読みやすい書きやすいわかりやすい
要するに簡潔
簡潔さ超重要
ビジネス要件は絶えず変化する
それに伴いシステムも変化し複雑に
複雑さと変化に対応するためには継続的なテスト重要
テストコード自体もシステムに伴い変化し複雑になる
なのでできるだけ簡潔に記述しテストできることが重要
serverspecとは
現実のシステムの複雑さと変化に対応するために
システムのあるべき状態を簡潔に記述し継続的にテストするためのもの
おまけ
miyagawa podcast ep14で serverspecについて
話してます
おしまい