ツナワタリマイライフ

日常ネタから技術ネタ、音楽ネタまで何でも書きます。

Serverspecでサーバの健康管理する

はじめに

最近仕事でcapistranoを触っています。

take-she12.hatenablog.com

take-she12.hatenablog.com

take-she12.hatenablog.com

リモートサーバへの処理を自動化するツール作りとしてcapistranoを使っていましたが、今後はInfrastructure as a Codeの考えを用いて、サーバのデプロイ、メンテ、テストも全部コードでやりましょうよということで、Serverspecの話題が出たので触ってみました。

Serverspecの導入

Serverspecはインフラのテストツールです。

gem install serverspecでいれて、任意のディレクトリでserverspec-initを実行すれば雛形ができます。作者も言っている通り敷居の低さはいいですね。

Serverspecの本

この本随分前に購入していて、ぱらーっと読んだだけで実践していない状態でした。やっぱり目的がないと技術ってダメですね。今回仕事で目的が出来たのでもう一度読みなおしました。理解も全然違う。

Serverspec

Serverspec

作者本人が書いているから、設計思想がふんだんに盛り込まれていて良いです。

今回深く読んだのは以下の部分。

  • 1章 Serverspecの紹介
  • 3章 Serverspecの本格利用
  • 付録A リソースタイプリファレンス

会社でやるって決まって対象サーバの必要サービスが動いているか?のテストまでは本を読み返す前に実装していたので、今後どういったテストを書くべきかという思想と、そのリファレンスが必要だったのでこの部分を読み込みました。他の部分も目は通しています。必要になったときにまた読めばいいかなと。

リソースタイプ

じゃあどんなテストができるの?といった質問に答えるにはリソースタイプを知らなければなりません。今後各サーバの担当者に「サーバのあるべき姿」を保つためにはどのような設定が必須ですか?という質問をする際に「じゃあどんなことがテストできますか?」と聞かれるはずです。ヒアリングの前に知っておく必要がありますね。

Command

任意のコマンドを実行して、その標準出力、標準エラー出力、終了コードをテストすることができます。Serverspecに実装されていないリソースのテストをする際にかならず使うことになるでしょう。

Cron

エントリーがあるかをテスト。いいですね。

file

be_fileやbe_directoryでファイルであるか、ディレクトリであるかのテストっていうけど、存在確認のテストだと思えばいいですかね。それに加えてcontentで設定ファイルの中身をテストしたりできますね。

あとはbe_mountedでマウントされているか、md5sumやsha256sumでファイルが置き換えられてないかのチェックも使えそうです。

host

テスト対象ホストから別のホストへ名前解決ができるか、tcp/udpで通信可能か、といったことをテストできます。これはあんまり使いドコロがないように思えるし、著者が言っているように振る舞いのテストなので将来的に廃止する可能性もあるとか。

interface

対象にインタフェイスにipアドレスが割り当てられているかどうか。VMだと突然eth0消滅とかありかねないので、必要でしょう。

package

パッケージがインストールされているかどうか。構成ツールが信頼できていれば入っているはずですが、レシピを書くひとが書き忘れる可能性もあるため、必要でしょう。このあたりのテストをどこまで書くかの考え方は3章の後半で説明されています。

port

あるportがlisten状態かどうかのテスト。これも必要ですね。

selinux

これも単純ですが、必要です。selinux_moduleも同様。

service

もっとも最初に思いつくのがこれ、該当サービスの自動起動状態と、起動状態の確認。サービスが落ちていたらどうしようもない。

公式サイト

Resource Type

リソースタイプの最新はこちらにあるとのこと。見てみる。

serverspec.org

まずbondとbridgeが追加されてます。そしてmysql_config!これはmysql使ってるので助かりますね。

ついでですので公式サイトの他のページにも目を通しましょう。

Advanced Tips

  • sshパスワードログインの方法
  • テストコードを複数のホストで共有する方法

これはロールの考え方を採用してますね。ロールでフォルダを作り、ホストはロール+名前という命名規則であれば、spec_helperにこういう風に書けば適用できるよと。このあたりはカスタマイズが柔軟にできる代わりにユーザが頭を使わないといけない部分。

  • rspecのshared_exampleの使い方
  • ホストにプロパティを持たせる方法
  • 環境変数の渡し方
  • 事前にコマンドを実施させる方法
  • sudoまわりの扱い方
  • OS情報の取得

多分、全部本に記載されている内容ですね。

Host Inventory

This is one of the features of Specinfra precisely, not Serverspec. But you can use this feature from Serverspec. Serverspecが内包しているSpecinfraの機能。ホストの情報、取れすぎ、すごい。

おわりに

今の仕事は1年ぐらいやるので、puppetやansible、itamaeといった構成管理ツールと、Serverspecを使ったテストコードをゴリゴリ書いて環境安定に寄与したい。5月いっぱいで基本的なテストコードは書いてしまおうっと。

構成管理はpuppetを今まで使っていて、今後何を使うかは未定の状態なので、今後はエージェントレスのansible/itamaeを早い段階で試して使ってみたいと思う。