狠狠撸

狠狠撸Share a Scribd company logo
serverspec
hbstudy #45
2013/06/21
Gosuke Miyashita
自己绍介
宮下 剛輔
mizzy.org
@gosukenator
paperboy&co.
テクニカル
マネージャー
理学部情報工学
科の三年生
学割で
GitHub Micro Plan
無料です
Amazon Student
入ってます
hbstudy #8
Puppetのススメ
サーバ
プロビジョニン
グ
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
と
テスト
みなさん
どうやってますか?
Serverspec at hbstudy #45
シェルコマンド叩
く?
シェルスクリプト?
実際にサービスに
アクセスする?
Configuration
Management
Framework
Serverspec at hbstudy #45
Serverspec at hbstudy #45
Serverspec at hbstudy #45
Configuration
Management Framework
と
テスト
これはテスト
どうやってますか?
シェルコマンド叩
く?
シェルスクリプト?
実際にサービスに
アクセスする?
この界隈は様々な
テストツールが存在
?シンタックスチェック
?Foodcritic
?knife cookbook test
?puppet-lint
?ユニットテスト
?Chefspec
?rspec-puppet
?結合テスト
?Minitest Chef Handler
?Cucumber Chef
?Test Kitchen
?rspec-system
?serverspec
Infrastructure as Code
からの自然な流れ
これだけテストツー
ルが存在するのにな
ぜわざわざserverspec
をつくったのか?
既存ツールは機能が
多すぎたり、特定の
ツールに依存してた
りするのがイヤ
Serverspec at hbstudy #45
Serverspec at hbstudy #45
PuppetやChef
使っていてそもそも
serverspecって必要?
そもそも
PuppetやChefに
テストって必要?
一度書いたマニフェス
トやレシピを更新しな
いのであればたぶん不
要
マニフェストやレシ
ピを継続的に更新す
る
なら必要
プログラムのリファ
クタリングと一緒
継続的に更新するな
らテストも継続的に
実行する必要がある
なのでテストを自動
化することが必要
テストコード自体も
メンテナンスが必要
なのでテストコード
の読みやすさや
書きやすさも重要
テストツール自体の
シンプルさも重要
severspec
サーバのテストを簡
潔に書くための仕組
み
サーバのテストを
RSpecで記述
RSpec?
Rubyのテスト
フレームワーク
describe Array, "when empty" do
before do
@empty_array = []
end
it "should be empty" do
@empty_array.should be_empty
end
it "should size 0" do
@empty_array.size.should == 0
end
end
@empty_array.should be_empty
@empty_array.should_not be_empty
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
最近推奨の書き方
expect(file ‘/etc/passwd’).to be_file
非推奨な書き方
file(‘/etc/passwd’).should be_file
Serverspec at hbstudy #45
Serverspec at hbstudy #45
テストコードが簡単に
書けて結果がわかり
やすくても内部が
複雑なら意味がない
serverspecは基本的に
シェルコマンド叩い
て
チェックしてるだけ
テスト対象のサーバ
にSSHで接続して
コマンドを叩く
シェルコマンド実行
によるサーバのテス
トをスマートにやれ
るようにしたのが
serverspec
serverspecの
始め方
# yum install rubygems
# gem install serverspec rake
# serverspec-init
# rake spec
デモ
serverspec
が産まれた経緯
2007年
Puppetを導入する
ことにした
Puppetでサーバ構築
は自動化できた
じゃあテストは
どうしよう?
AssurerというPerl製
のツールを書いた
Serverspec at hbstudy #45
Assurerは
面倒すぎて実用には
耐えなかった
テスト駆動サーバ
構築のことは
しばらく忘れた
2013年
Puppetマニフェスト
の
リファクタリングを
やろうと思った
コードをリファクタ
リングするならテス
ト
必要だろ
rspec-pupetは
モジュールのテスト
にしか使えない
Puppet適用後の
実際のサーバの
状態をテストしたい
@hibomaが何か
やってたそういえば
http://d.hatena.ne.jp/hiboma/20130513/1368411746
それパクろう
そしてgemにしよう
serverspec
誕生
もう少し詳しい
serverspecの話
リソースタイプ
command cron default_gateway
file group host ipfilter ipnat
iptables kernel_module
linux_kernel_parrameter package
port routing_table selinux
service user zfs
http://serverspec.org/resource_types.html
复数翱厂サポート
Debian
Gentoo
Red Hat
Solaris
Darwin
rootユーザじゃない
場合はsudoつけて
コマンド実行
(SSHの場合のみ
Exec ではつけない)
PATHの追加設定
できます
spec/spec_helper.rb で
RSpec.configure do |c|
c.path = ‘/sbin:/usr/sbin:$PATH’
…
end
describe package(‘serverspec') do
let(:path){
‘/usr/local/rbenv/shims:$PATH’
}
it { should be_installed.by(‘gem’) }
end
pre_command
describe package(‘serverspec') do
let(:path){
‘/usr/local/rbenv/shims:$PATH’
}
let(:pre_command) {
‘eval ?$(rbenv init -)?’
}
it { should be_installed.by(‘gem’) }
end
サーバ単位じゃなく
ロール単位でのテス
ト
サーバ固有属性を扱う
詳しくはウェブで
http://mizzy.org/
http://serverspec.org/
インフラの継続的
インテグレーション
Serverspec at hbstudy #45
Serverspec at hbstudy #45
プログラム内部の话
describe file(‘/etc/passwd’) do
it { should be_file }
end
が実行されるとどうなるか
(Exec Backend の場合)
この辺が主に呼ばれる
serverspec/type/file.rb
serverspec/backend/exec.rb
serverspec/commands/redhat.rb
実際にコードを見てみましょう
SSH の場合は?
Backend::Exec の
代わりに Backend::Ssh
が呼ばれる
chain する場合は?
describe package('serverspec') do
it { should be_installed.by('gem') }
end
matchers/be_installed.rb が呼ばれる
serverspec自身のテス
ト
テストコードは2パター
ン
?コマンドのテスト
?リソースマッチャのテ
スト
コマンドのテスト
serverspecがテストのため
に実行するシェルコマン
ドが正しく生成されるか
どうかをチェック
リソースマッチャのテス
ト
テスト用シェルコマンド
が実行されたという「仮
定」の元で、リソースの
テストが想定通りの結果
GitHub でのコントリビュート
1. フォークする
2. ブランチをつくる
git checkout –b my-new-feature
3. コード書いてコミットしてプッ
シュ
git push origin my-new-feature
4. プルリクエストを送る
?プルリクエストは日本語でOK
?途中状態でいったんプルリクしてくれ
てもOK
?あとからまたpushすればいい
?その場合は頭に[WIP]とつけてくだ
さい
?動作確認は自分が使ってるOSだけでOK
?完璧に実装しなくて大丈夫です
?テストコードも書いてもらえるとうれ
しいです
?書き方わからなければお気軽に相談
を
プルリクエストは
お気軽に
まとめ
serverspecは
読みやすい
書きやすい
わかりやすい
要するに
簡潔
简洁さ超重要
ビジネス要件は
絶えず変化する
それに伴いシステム
も変化し複雑に
複雑さと変化に対応
するためには継続的
なテスト重要
テストコード自体も
システムに伴い
変化し複雑になる
なのでできるだけ
簡潔に記述できる
ことが重要
蝉别谤惫别谤蝉辫别肠とは
現実のシステムの
複雑さと変化に
対応するために
システムのあるべき
状態を簡潔に記述し
継続的にテストする
ためのもの
おまけ
Serverspec at hbstudy #45
Serverspec at hbstudy #45
Serverspec at hbstudy #45
おしまい

More Related Content

Serverspec at hbstudy #45