Skip to content

Instantly share code, notes, and snippets.

@Mahito
Last active December 18, 2015 21:38
Show Gist options
  • Select an option

  • Save Mahito/5848297 to your computer and use it in GitHub Desktop.

Select an option

Save Mahito/5848297 to your computer and use it in GitHub Desktop.

イベント名

hbstudy#45-serverspecが開いたServerテストの世界-

開催日時

2013年6月21日(金) 19:00 - 21:30

主催

株式会社ハートビーツ

場所

ハロー会議室 新宿 C+D(東京都新宿区西新宿1丁目5-11 新宿三葉ビル6F)

紹介ページ

http://connpass.com/event/2580/

資料ページ

http://www.slideshare.net/mizzy/serverspec-hbstudy45

総論・所感:

昨今のベンチャー企業やクラウドサービス利用者の中では、 "Infrastructure as code"や"DevOps"などと呼ばれる、 下回りの構築・設定・テスト自動化やオペレーションと開発の融合が注目されている。

serverspecはサーバの設定・状態を確認(テスト)するための自動試験ツールとして、 Twitterをはじめ、Webの世界で最近話題に上がっている新しいツールである。

serverspecはRubyで実装され、Rubyのテストフレームワークを用いて、 "パッケージがインストールされているか"、"ポートが開いているか"など、 サーバの各種設定の確認を自動的に行う。

serverspecを用いた設定確認が自動化されることで、 構築や設定変更に対しての確認のコストが低くなるために、 継続的なインフラの構築や・設定変更が可能になるとされていた。

紹介やデモを見る限り使いやすいツールになっていると感じたため、 大量のサーバを抱え構築・確認を継続的に行っていく会社では、 こうした自動試験ツールを用いることで確認漏れの解消や、 確認にかかる人員削減によるコストカットができる有用なツールであると感じた。

概要

講演者情報

氏名:宮下剛介

所属:株式会社paperboy&co.(レンタルサーバ「ロリポップ!」の会社)

備考:serverspecの開発者(過去にhbstudy#8 「Puppetのススメ」でも講演)

サーバプロビジョニングとは

Velocity 2010で語られたProvisioning Toolchainの資料を見ると、プロビジョニングの領域は以下の3つに分けられる 資料:http://www.slideshare.net/dev2ops/velocity-online-provisioningtoolchainkey

領域 - Provisioning Tool

  • Orchestration(AP層)         - Capistrano/Fabric
  • Configuration (システムの設定)    - Puppet/Chef
  • Bootstrapping (OSインストール/VM操作) - EC2/OpenStack

サーバープロビジョニングとテスト

「監視とは継続的なテストである」 by @kazuho

領域 - Provisioning Test Tool

  • Orchestration(AP層)         - Nagios/Zabbix

  • Configuration (システムの設定)    - Serverspec

  • Bootstrapping (OSインストール/VM操作) - ???

  • Zabbix/NagiosによるApacheのテスト

    • httpdプロセスが動いているか
    • 80番ポートで動いているか
    • 80番ポートが正しいレスポンスを返すか
  • ServerspecによるApacheのテスト

    • httpdプロセスが動いているか
    • 80番ポートがListenしているか
    • httpdパッケージが入っているか
  • 以下Nagios/Zabbixでやらないテスト

    • 自動起動するようになっているか
    • 設定ファイルが存在するか
    • 正しい設定がされているか

Nagios/ZabbixがあればServerspecはいらないのではとよく言われるが、テスト対象が違っているので不要とは言い切れない。 また、設定を確認するためだけにZabbixやNagiosを構築するのは大げさで大変。

Configurationとテスト

以前まではシェルスクリプトやコンソールを叩いたり実際にアクセスして確認?

  • Configuration Management Framework
    • Puppet/Chefの登場

PuppetやChefをProvisioning Toolという人も多いが、Provisioningという意味は先のProvisioning Toolchainの図を見てもわかるように範囲が広い。 PuppetやChefはConfiguration Management Frameworkと名乗っている

Configuration Management Frameworkとテスト

Puppetを使っているのであれば、マニフェスト(自動化手順)を作って1回確認出来ればあとはPuppet任せでも可能

様々なテストツール

  • シンタックスチェック
    • Foodcritic
    • knife cookbook test
    • puppet-lint
  • ユニットテスト
    • Chefspec
    • rspec-puppet

ChefやPuppetのテストが必要かといわれると疑問

  • × 単純な自動化手順の場合設定と確認内容が変わらないので手間になる

  • ○ 複雑な設定をされたOSが複数あったりパラメータが違う場合は効果的

  • 結合テスト

    • Minitest Chef Handler
    • Cucumber Chef
    • Test Kitchen
    • rspec-system
    • serverspec

テストツールが多く出回っているのはInfrastructure as codeからの自然な流れ。

これだけテストツールがあるのにわざわざserverspecを作ったのか?

  • 既存のツールは機能が多すぎる
    • ツールの問題かテストの問題かがわからなくなるのを避けるためにもツール(serverspec)事体は簡単なものにした
  • ツール(Puppet/Chef)に依存しないほうがいい
    • ツールを変更することは稀かもしれないが、特定のツールに依存するのは避けたかった

PuppetやChef使っていてserverspecは必要か?そもそもPuppetやChefにテストは必要か?

  • 一度書いた自動化手順を更新しないのであれば多分不要でツールに任せる
  • マニフェストやレシピを継続的に更新するなら必要
    • プログラムのリファクタリングと同様にテストを自動化することが必要
    • 継続的に更新するのであればテストも継続的に実行する必要がある
    • 自動化されていないものを継続的に実行するのは難しい * テストコードもメンテナンスが必要なのでテストコードの読み/書きやすさも重要 * テストツール自体のシンプルさも重要

Serverspec

serverのテストを簡潔書くための仕組み

-> サーバのテストをRSpecで書く

RSpec

Rubyのテストフレームワーク

RSpecのサンプル

describe Array, "wehn 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 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は裏側でシェルコマンドを叩いてチェックしているだけ
  • やり方は2種類->ローカルとリモート
    • リモートはテスト対象のサーバにSSHで接続してコマンドを叩く
    • リモート先にRubyが入ってなくても動く

シェルコマンドを叩くテストをもう少しスマートにしたのがserverspec

・serverspec誕生の経緯

2007年

  • Puppetを導入
  • テストのためにAssurerというツールを開発
  • Assurerは面倒すぎて実用に耐えなかった

2013年

  • Puppetのマニフェストのリファクタリングをしよう
  • リファクタリングにテストが必要
    • rspec-puppetに機能が足りない
    • Puppet適用後のサーバの状態をテストしたい
  • serverspec開発

serverspecの機能

対応するリソース(http://serverspec.org/resource_types.html)

  • command
  • cron
  • default_gateway
  • file
  • port
  • routing
  • ...etc

複数のOSサポート

  • Debian
  • Gentoo
  • Red Hat
  • Solaris
  • Darwin

その他の機能

  • rootユーザでない場合はsudoをつけてコマンド実行
  • PATHの追加設定可能
  • コマンド実行前の設定も可能
  • サーバ単位ではなくロール単位でのテスト
  • サーバ固有の属性を扱うことが可能

serverspecを用いることでインフラの継続的インテグレーションが可能になる

デモと実装解説については割愛(詳細は資料で)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment