Help us understand the problem. What is going on with this article?

serverspec-runnerを使って複数のホストのテストレポートを作る

More than 5 years have passed since last update.

インフラの状態をテストするフレームワークserverspecをいつでも気軽に使えて、わかりやすい結果を表示するツールを作ってみました。

serverspec-runner

なにができるか

下記のような複数のsshログイン環境・serverspecレシピが混在した状況でyamlファイル1つで一括で実行できます。
(OSの差分吸収はserverspecに依存します)

sr_01.png

また、テスト結果表示に下記のようなわかりやすいテーブルフォーマットやCSVを出力することができます

sr_02.png
コンソールASCII Art風テーブルフォーマット

description result
nginx@anyhost-01(127.0.0.1)
nginx
起動を確認
Process "nginx"
should be running OK
File "/etc/logrotate.d/nginx"
should be file OK
should contain "rotate 14" NG
mysql@anyhost-02(127.0.0.1)
mysql
起動を確認
Process "mysqld"
should be running OK
Port "3306"
should be listening OK
hiracyユーザがあるかどうかの確認
Command "echo 'select * from mysql.user where user="hiracy" \G;' | mysql --user=hiracy --password=usopass" NG

markdownフォーマット(qiitaによりテーブル表示に変換されています)

使用方法

スケルトンの生成

まずは以下のコマンドでソースコード・設定雛形を生成します。

# ここでは自分のホームディレクトリのtestディレクトリを指定
serverspec-runner -r ~/test

# yを入力
want to create spec-tree to /var/tmp/test/spec? (y/n): y

# 以下の様なディレクトリが作られます

./test/
|-- scenario.yml
|-- spec
|   |-- example
|   |   `-- default.rb
|   `-- spec_helper.rb
`-- ssh_options_default.yml

scenario.ymlの作り方

実行する複数のserverspecレシピ、対象ホストを1つのyamlファイルで定義することができます
例えばwebサーバ(nginx)とdbサーバ(mysql)をテストするシナリオは以下のように自動生成されたscenario.ymlファイルを編集します

scenario.yml
service-hoge            # serverspecレシピのあるディレクトリ階層。yaml-hashで同じ階層表現にすること
  web
    - hoge-web-01       # service-hoge/web/***.rb を実行する対象のホスト名(---以下同名のシンボルで詳細を定義すること)
    - hoge-web-02       # ちなみにIPアドレス、名前解決できるホスト名直接書けば"---"以下のシンボルを省略可能
  db
    - hoge-db-01
---
hoge-web-01:            # シンボル実体 
  host: 192.168.0.11    # シンボルにアクセスするためのIPアドレス又は名前解決できるホスト名
hoge-web-02:
  host: 192.168.0.11
hoge-db-01:
  ssh_opts:             # ssh option define (not required)
    port: 2222          # ssh port option   (not required)
    user: "ssh-hiracy"  # ssh user option   (not required)
  dbuser: "db-hiracy"   # host attributes for mysql user.

尚、このようにホスト毎にNet::SSHで定義されているsshオプションが使用できますが、scenario.ymlで定義しない場合は自動生成されたssh_options_default.ymlにて同様にsshオプションを記載することでデフォルト設定として使用することができます

serverspecレシピ作成

serverspecのレシピについては(本家様)[http://serverspec.org/resource_types.html]と同じように作成して下さい。

mkdir -p ~/test/spec/service-hoge/web/
vim ~/test/spec/service-hoge/web/default.rb
~/test/spec/service-hoge/web/default.rb
require 'spec_helper'

describe "nginx" do

  describe "起動を確認" do
    describe process('nginx') do
      it { should be_running }
    end
  end

  describe file('/etc/logrotate.d/nginx') do
    it { should be_file }
    it { should contain "rotate 14" }
  end
end

結果出力のオプション

結果表示は以下の4つのパターンから選択できます

ASCII Art

serverspec-runner -t aa
+------------------------------------------------+
|description                            | result |
+------------------------------------------------+
|service-hoge-web@anyhost-01(127.0.0.1) |        |
|  nginx                                |        |
|    起動を確認                          |        |
|      Process "nginx"                  |        |
|        should be running              |   OK   |
|    File "/etc/logrotate.d/nginx"      |        |
|      should be file                   |   OK   |
|      should contain "rotate 14"       |   NG   |
+------------------------------------------------+

Markdown Table

serverspec-runner -t mkd
|description                            | result |
|:--------------------------------------|:------:|
|service-hoge-web@anyhost-01(127.0.0.1) |        |
|  nginx                                |        |
|    起動を確認                          |        |
|      Process "nginx"                  |        |
|        should be running              |   OK   |
|    File "/etc/logrotate.d/nginx"      |        |
|      should be file                   |   OK   |
|      should contain "rotate 14"       |   NG   |

CSV

Excelに読ませて、即試験項目書

serverspec-runner -t csv
description,,,,,result
service-hoge-web@anyhost-01(127.0.0.1),,,,,
,nginx,,,,
,,起動を確認,,,
,,,Process "nginx",,
,,,,should be running,OK
,,File "/etc/logrotate.d/nginx",,,
,,,should be file,,OK
,,,should contain "rotate 14",,NG

Boolean

scenario.yml全部成功すれば'ok'それ以外は'ng'を返すので監視用スクリプトとかに使えるかも

serverspec-runner -t bool
ng

尚、全てサンプルはcd ~/testにてディレクトリ移動後に実行していますが、オプションscenario.ymlやserverspecレシピのある親ディレクトリを指定できます。

まとめ

ということでserverspecを簡単に上司や顧客や出向先に見せやすいようにできるので使ったり提案してみてはどうでしょうか
改善案や不具合があったら是非ここやgithubまで

hiracy
インフラ系で主にRuby・Golang・Pythonでツール作ったりもしてます。
http://hiracy.hateblo.jp
drecom-inc
Drecom with entertainment として発明を産み続け、人々の期待を超えるサービスを提供することを目的とした会社です。
https://www.drecom.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした