serverspec at july tech festa 2013

Post on 24-Apr-2015

3.840 Views

Category:

Technology

1 Downloads

Preview:

Click to see full reader

DESCRIPTION

 

TRANSCRIPT

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について

話してます

おしまい

top related