share facebook facebook2 twitter menu hatena pocket slack

2014.10.23 THU

typo してもちょっと安心…sensu-client の定義を infrataster でテストするの巻

川原 洋平

WRITTEN BY川原 洋平

どうも、かっぱ@inokara)です。

はじめに

sensu の設定を chef を利用してナウでヤングな感じで済ませた後で気付く間違いとかに凹んだので定義をテスト出来ないか考えてみたら infrataster で出来そうなので試してみました。

今回は sensu-client の name と address が一致するかどうかを確認してみます。


Infrataster について

詳細は割愛させて頂きますが、Web サーバーや Web アプリケーションのレスポンスをテストするのに使ったりしています。

Infrataster のセットアップについても割愛させて頂きます。すいません。


やったこと

参考

うれしいこと

sensu には sensu-api というネ申がいます。この sensu-api を叩くことで設定の内容を JSON で確認することが出来ます。例えば、以下のように実行すると…

curl -s http://${sensu-api}:4567/clients/localhost | jq .

以下のように出力されます。

{
  "timestamp": 1411509176,
  "version": "0.13.1",
  "subscriptions": [
    "test"
  ],
  "address": "127.0.0.1",
  "name": "localhost"
}

今回はこれを利用します。

spec_helper.rb

まずは spec_helper.rb に以下を追加します。

require 'json'

(中略)

Infrataster::Server.define(
  :sensu_api,
  '${sensu-api}'
)

あとは…

テストを書きます。以下のように書きました。

spec/sensu_spec.rb
require 'spec_helper'

hosts = {
  "localhost" => "127.0.0.1">,
  "19e6ca206925.ec2.internal" => "172.17.0.1",
  "3a089cfcdf6d.ec2.internal" => "172.17.0.2",
}

hosts.each_pair do |k,v|
  describe server(:sensu_api) do
    describe http("http://${sensu-api}:4567/clients/#{k}"
    ) do
      it "#{k} の IP アドレスは #{v} ですたい" do
        json = JSON.parse(response.body)
        expect(json['address']).to eq("#{v}")
      end
    end
 end
end

私的ポイントは response.bodyJSON.parse して json に突っ込んでいるところで、これが無いと当然、次の行で jsonNo method error の起因となってしまいます(暫くハマりました…orz)。ちなみに、上記の例だと監視クライアント毎に API アクセスしているので非効率間は否めませんがとりあえず目的達成を優先しました。

テスト実行!

infrataster で sensu-client をテストする: 実行結果(誤りがない場合)

ちゃんと設定がされているようですたい。

例えば、定義に誤りがあった場合には…

infrataster で sensu-client をテストする: 実行結果(誤りがある場合)

ご指摘有難うでごわす。


最後に

設定を適用する前に serverspec でテストというのもアリかなと思っていますが、そもそも間違えないようにしましょうってことで…気をつけましょう。

監視定義をテストと言うとそれっぽい感じですが、そもそも API レスポンスのテストですね…

元記事はこちらです。
typo してもちょっと安心…sensu-client の定義を infrataster でテストするの巻