koh’s blog

Sys Admin who loves automation

Serverspecに代わるサーバテストツールGossを試してみた

For English

Gossってなに?

Go言語で書かれたYAMLベースのサーバテストツールです。
プロセスやポートの状態等をテストしてくれます。

github.com

Serverspecとの違い

GithubのREADMEにも書いてありますが
Serverspecの代替ツールということで同じテストツールですが当然違いがあります。

Gossの良い点

YAMLでかけるため記述が簡単

テストの定義がYAMLファイル一つで済むため、管理が楽で学習コストほぼゼロ

テストパターンの記述が一瞬でできる

テスト定義作成用のコマンドがあり、シンプルなテストであればすぐに作成可能

ワンバイナリでインストール可能

バイナリ一つなので依存等を気にせず使える

Serverspecの良い点

リモート実行可能

AnsibleやChefの様にローカルや管理サーバにインストールして、SSHでログインして実行できます。

Resourceの量が多い

GossはResourceが20弱に対し、Serverspecは約40で倍あります(2019/3/22時点)

Rubyガリガリかける

Rubyである程度自由に書けるので自由度が高い

実際に使ってみた

環境はVagrant上のCentOS 7.5.1804
Gossのバージョンはv0.3.6です。

インストール

ドキュメントにもありますがインストールスクリプトがあるのでコマンド一発で完了です。
dgossというDockerコンテナ用のコマンドもインストールされますが今回は使用しません。

なお下記のスクリプトは本番環境での使用は推奨されていません。
本番環境ではManual Installの方を実施しましょう。

インストール実行(クリックで展開)

[vagrant@Vag2] ~
% curl -fsSL https://goss.rocks/install | sudo sh
Downloading https://github.com/aelsabbahy/goss/releases/download/v0.3.6/goss-linux-amd64
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   606    0   606    0     0    808      0 --:--:-- --:--:-- --:--:--   809
100 8324k  100 8324k    0     0   236k      0  0:00:35  0:00:35 --:--:--  240k
Goss v0.3.6 has been installed to /usr/local/bin/goss
goss --version
goss version v0.3.6
Downloading https://raw.githubusercontent.com/aelsabbahy/goss/master/extras/dgoss/dgoss
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  3803  100  3803    0     0   9722      0 --:--:-- --:--:-- --:--:--  9726
dgoss master has been installed to /usr/local/bin/dgoss
[vagrant@Vag2] ~
% which goss
/usr/local/bin/goss
[vagrant@Vag2] ~
%

テスト定義作成

Gossには先にも少し紹介しましたがテスト定義を自動で作成してくれるコマンドがあります。
goss autoadd コマンドかgoss add [resource]コマンドでgoss.yamlがカレントディレクトリに作成されます。

今回は試しにHAProxyがインストールされているサーバのテストをしてみます。

autoadd実行(クリックで展開)

[vagrant@Vag2] ~/work
% goss autoadd haproxy
Adding Group to './goss.yaml':

haproxy:
  exists: true
  gid: 188


Adding Package to './goss.yaml':

haproxy:
  installed: true
  versions:
  - 1.5.18


Adding Process to './goss.yaml':

haproxy:
  running: true


Adding Service to './goss.yaml':

haproxy:
  enabled: true
  running: true


Adding User to './goss.yaml':

haproxy:
  exists: true
  uid: 188
  gid: 188
  groups:
  - haproxy
  home: /var/lib/haproxy
  shell: /sbin/nologin


[vagrant@Vag2] ~/work
%

実際に作成されたgoss.yamlの内容が下記

goss.yaml(クリックで展開)

[vagrant@Vag2] ~/work
% ls -l goss.yaml
-rw-r--r-- 1 vagrant vagrant 347 Mar 23 03:55 goss.yaml
[vagrant@Vag2] ~/work
% cat goss.yaml
package:
  haproxy:
    installed: true
    versions:
    - 1.5.18
service:
  haproxy:
    enabled: true
    running: true
user:
  haproxy:
    exists: true
    uid: 188
    gid: 188
    groups:
    - haproxy
    home: /var/lib/haproxy
    shell: /sbin/nologin
group:
  haproxy:
    exists: true
    gid: 188
process:
  haproxy:
    running: true
[vagrant@Vag2] ~/work
%

autoadd一発で下記項目のテスト定義を作成してくれました。
※指定する対象により作成されるテスト項目は異なります。

  • パッケージインストール
  • サービスの起動状態、自動起動設定
  • ユーザ定義
  • グループ定義
  • プロセス状態

autoaddではなくadd [resource]コマンドにするとリソースごとに定義できます。

テスト実行

成功パターン

では実際にテスト実行します。 テスト実行ももちろんコマンド一つ叩くだけです。

テスト実行(クリックで展開)

[vagrant@Vag2] ~/work
% goss validate
.............

Total Duration: 0.033s
Count: 13, Failed: 0, Skipped: 0
[vagrant@Vag2] ~/work
%

.....の点が各テストを表しています。
恐るべき点はその実行速度です。
13項目のテストをわずか0.033秒って。

失敗パターン

ではテストをこけさせてみましょう。 サービスを落としてみます。

[vagrant@Vag2] ~/work
% sudo systemctl stop haproxy
[vagrant@Vag2] ~/work
% sudo systemctl is-active haproxy
inactive
zsh: exit 3     sudo systemctl is-active haproxy
[vagrant@Vag2] ~/work
%

そして再テスト

テスト実行(クリックで展開)

[vagrant@Vag2] ~/work
% goss validate
..F.........F

Failures/Skipped:

Process: haproxy: running:
Expected
    <bool>: false
to equal
    <bool>: true

Service: haproxy: running:
Expected
    <bool>: false
to equal
    <bool>: true

Total Duration: 0.051s
Count: 13, Failed: 2, Skipped: 0
zsh: exit 1     goss validate
[vagrant@Vag2] ~/work
%

きちんとサービス、プロセスのcheckがFailになっています。

表示形式変更

ちなみに表示形式もいくつかあります。
JSON等もありますが、tapが見やすいですね。

tapでテスト実行(クリックで展開)

[vagrant@Vag2] ~/work
% goss validate --format tap
1..13
ok 1 - Group: haproxy: exists: matches expectation: [true]
ok 2 - Group: haproxy: gid: matches expectation: [188]
not ok 3 - Process: haproxy: running: doesn't match, expect: [true] found: [false]
ok 4 - User: haproxy: exists: matches expectation: [true]
ok 5 - User: haproxy: uid: matches expectation: [188]
ok 6 - User: haproxy: gid: matches expectation: [188]
ok 7 - User: haproxy: home: matches expectation: ["/var/lib/haproxy"]
ok 8 - User: haproxy: groups: matches expectation: [["haproxy"]]
ok 9 - User: haproxy: shell: matches expectation: ["/sbin/nologin"]
ok 10 - Package: haproxy: installed: matches expectation: [true]
ok 11 - Package: haproxy: version: matches expectation: [["1.5.18"]]
ok 12 - Service: haproxy: enabled: matches expectation: [true]
not ok 13 - Service: haproxy: running: doesn't match, expect: [true] found: [false]
zsh: exit 1     goss validate --format tap
[vagrant@Vag2] ~/work
%

httpでのcheck

またhttpで起動してhealthcheck的な使い方もできます。

httpでテスト実行(クリックで展開)

[vagrant@Vag2] ~/work
% goss serve &
2019/03/23 04:00:20 Starting to listen on: :8080

[vagrant@Vag2] ~/work
% curl localhost:8080/healthz
2019/03/23 04:00:23 [::1]:48704: requesting health probe
2019/03/23 04:00:23 [::1]:48704: Stale cache, running tests
..F.........F

Failures/Skipped:

Process: haproxy: running:
Expected
    <bool>: false
to equal
    <bool>: true

Service: haproxy: running:
Expected
    <bool>: false
to equal
    <bool>: true

Total Duration: 0.044s
Count: 13, Failed: 2, Skipped: 0
[vagrant@Vag2] ~/work
%

まとめ

実際試してみて、1分足らずでテスト作成から実施まで完了できるのはこれまでには無い凄さだと思います。
今回は簡単なテストのみでしたが、もちろん自分でテスト定義を作り込めるので本格運用も十分可能ですね。

本格運用するのであればAnsibleでバイナリとgoss.yamlをばらまいて、Ansibleでそのままテストするのが簡単でいいなと。
もしくはhealthcheck機能を利用して監視でも活用できたら面白そうです。