狠狠撸

狠狠撸Share a Scribd company logo
July Tech Festa 2013
2013/07/14
Gosuke Miyashita
サーバ
プロビジョニン
グ
Cloud or VM
Image
Launch
OS
Install
System
Configuration
Provisioning Toolchain by Lee Thompson at Velocity 2010
Application Service
Orchestration
Bootstrapping
Configuration
Orchestration
Capistrano
Fabric
Puppet
Chef
EC2
OpenStack
サーバ
プロビジョニン
グ
とテスト
監視とは継続的
なテストである
by @kazuho
Cloud or VM
Image
Launch
OS
Install
System
Configuration
Application Service
Orchestration
Bootstrapping
Configuration
Orchestration
Nagios
Zabbix
serverspec
???
Zabbix/NagiosによるApacheの
テスト(監視)
?httpdプロセスが動いているか
?80番ポートに外からアクセスでき
るか
?80番ポートが正しいレスポンスを
返すか
serverspecによるApacheのテス
ト
?httpdプロセスが動いているか
?80番ポートをListenしているか
?httpdパッケージが入っているか
?自動起動するようになっているか
?設定ファイルが存在するか
?正しい設定がされているか
?Orchestration領域のテス
ト
?Zabbix
?Nagios
?Configuration領域のテス
ト
?serverspec
Configuration領域に
おけるテスト
みなさん
どうやってますか?
シェルコマンド叩
く?
シェルスクリプト?
実際にサービスに
アクセスする?
Configuration
Management
Framework
Serverspec at July Tech Festa 2013
Serverspec at July Tech Festa 2013
Serverspec at July Tech Festa 2013
Configuration
Management Framework
とテスト
これはテスト
どうやってますか?
シェルコマンド叩
く?
シェルスクリプト?
実際にサービスに
アクセスする?
この界隈は様々な
テストツールが存在
?シンタックスチェック
?Foodcritic
?knife cookbook test
?puppet-lint
?ユニットテスト
?Chefspec
?rspec-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'
end
end
?結合テスト
?Minitest Chef Handler
?Cucumber Chef
?Test Kitchen
?rspec-system
?serverspec
class TestNginx < MiniTest::Chef::TestCase
def test_package_is_installed
assert_installed package("nginx")
end
def test_service_is_running
assert_running service("nginx")
end
end
Infrastructure as Code
からの自然な流れ
サーバの状態を
コードで記述
↓
状態のテストも
コードで記述
serverspecは
この流れの中で
生まれたもの
蝉别惫别谤蝉辫别肠とは
サーバの状態を簡潔な
コードで記述して
テストするための仕組
み
サーバの状態を
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
end
end
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
Serverspec at July Tech Festa 2013
Serverspec at July Tech Festa 2013
基本的に
シェルコマンド叩い
て
チェックしてるだけ
テスト対象のサーバ
にSSHで接続して
コマンドを叩く
シェルコマンド実行
によるサーバのテス
トをスマートにやれ
るようにしたのが
serverspec
serverspecの
始め方
# yum install rubygems
# gem install serverspec rake
# serverspec-init
# rake spec
デモ
詳細は
http://serverspec.org/
serverspec
をつくった理由
PuppetやChef
使っていてそもそも
serverspecって必要?
そもそも
PuppetやChefに
テストって必要?
レシピやマニフェスト
が正しく書けたかどう
か
必ずテストしますよ
ね?
一度書いたマニフェス
トやレシピを更新しな
いのであればそれほど
必要ではないかも
マニフェストやレシ
ピを継続的に更新す
る
なら必要性が高まる
プログラムの
リファクタリングと
一緒
様々なテストツール
が存在するのになぜ
わざわざserverspecを
つくったのか?
既存ツールは機能が
多すぎたり、特定の
ツールに依存してた
りするのがイヤ
蝉别谤惫别谤蝉辫别肠の特徴
マニフェストを継続
的に更新するなら
テストコードも
継続的な更新が必要
なのでテストコード
の読みやすさや
書きやすさも重要
テストツール自体の
シンプルさも重要
ChefやPuppetに
依存しない
テスト対象のサーバ
にエージェント不要
テスト対象のサーバ
にRubyすら不要
テスト以外の余計な
機能がない
利用のための
敷居が低い
テストはシェルコマ
ンドを実行してるだ
け
問題が起きたときに
調査しやすい
蝉别谤惫别谤蝉辫别肠の応用
サーバ構築の継続的
インテグレーション
Puppetマニフェストを
更新したら自動でマニ
フェスト適用と
serverspecによるテス
トを実行
Serverspec at July Tech Festa 2013
Serverspec at July Tech Festa 2013
まとめ
シェルコマンド実行
によるサーバのテス
トをスマートにやれ
るようにしたのが
serverspec
読みやすい
書きやすい
わかりやすい
要するに
簡潔
简洁さ超重要
ビジネス要件は
絶えず変化する
それに伴いシステム
も変化し複雑に
複雑さと変化に対応
するためには継続的
なテスト重要
テストコード自体も
システムに伴い
変化し複雑になる
なのでできるだけ
簡潔に記述しテスト
できることが重要
蝉别谤惫别谤蝉辫别肠とは
現実のシステムの
複雑さと変化に
対応するために
システムのあるべき
状態を簡潔に記述し
継続的にテストする
ためのもの
おまけ
miyagawa podcast ep14
でserverspecについて
話してます
Serverspec at July Tech Festa 2013
Serverspec at July Tech Festa 2013
Serverspec at July Tech Festa 2013
おしまい

More Related Content

Serverspec at July Tech Festa 2013