Serverspecに代わるサーバテストツールGossを試してみた
Gossってなに?
Go言語で書かれたYAMLベースのサーバテストツールです。
プロセスやポートの状態等をテストしてくれます。
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機能を利用して監視でも活用できたら面白そうです。