YAMLで記述できるサーバ自動テストツール「Goss」を試してみた

森永です。

サーバの自動テストツールといえば「Serverspec」が有名です。
「Serverspec」ではテストを記述するためにRuby(RSpec)の記法を使用しますが、YAMLで記述することが出来る「Goss」というツールを見つけたので試してみます。

aelsabbahy/goss: Quick and Easy server testing/validation

Gossとは

Goss is a YAML based serverspec alternative tool for validating a server’s configuration. It eases the process of writing tests by allowing the user to generate tests from the current system state. Once the test suite is written they can be executed, waited-on, or served as a health endpoint.

公式ドキュメントから引用

上記に記載がある通り「Serverspec」の代替として作られたYAMLでテストを記述するサーバの自動テストツールです。
言語はgolangで書かれています。

Dockerをテストするための「Goss」ラッパーである「dgoss」というツールも公開されていますので、Dockerコンテナでも使用することが出来ます。

「Serverspec」との大きな違いとして、現状はローカル環境のテストのみサポートしている点があります。
そのため、バイナリファイルもLinux用のものしか用意されていません。

試してみる

作業するMac環境は以下の通りです。

$ cat /etc/system-release
Amazon Linux AMI release 2017.03
$ go version
go version go1.7.5 linux/amd64

インストール

READMEを見てぱぱっとインストールしちゃいましょう。
先述したようにローカルでのテストのみ出来ますので、テストをするサーバにSSHしてから作業をしましょう。

$ curl -fsSL https://goss.rocks/install | sudo sh
Downloading https://github.com/aelsabbahy/goss/releases/download/v0.3.2/goss-linux-amd64
...略...
Goss v0.3.2 has been installed to /usr/local/bin/goss
goss --version
goss version v0.3.2
Downloading https://raw.githubusercontent.com/aelsabbahy/goss/master/extras/dgoss/dgoss
...略...
dgoss master has been installed to /usr/local/bin/dgoss

上記のようにエラーが出なければインストール完了です。

テスト

では、早速テストしてみましょう。 今回はhttpd用のテストを作成し、実行してみます。

autoaddを使用することで自動的に存在するリソースの現在の状況の基づいてテストを作成することが出来ます。
正常テストであれば、こちらを使用することで簡単にテスト作成が可能です。
autoaddを使用するにはrootの権限が必要ですので、sudoをつけて実行します。

$ sudo service httpd status
httpd (pid  1234) is running... # httpdが実行されていることを確認
$ chkconfig --list httpd
httpd       0:off 1:off 2:on 3:on 4:on 5:on 6:off # httpdの起動設定を確認

$ sudo goss autoadd httpd
sudo: goss: command not found

初期値ではsudoした際にPATHがリセットされ/usr/local/binにPATHが通っていないことが原因のようです。
(参考:sudo「コマンドが見つかりません」PATHが初期化されているときの対処法 – シングスブログ
ひとまず上書きされるPATHに/usr/local/binを追加することで回避します。

$ sudo visudo
...
Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
↓
Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
...

改めて実行してみます。

$ sudo goss autoadd httpd
Adding Process to './goss.yaml':

httpd:
  running: true


Adding Port to './goss.yaml':

tcp6:80:
  listening: true
  ip:
  - '::'


Adding Service to './goss.yaml':

httpd:
  enabled: true
  running: true

今度はうまくいきました。
ひとつひとつ意味合いを見ていきましょう。

まず、最初にプロセスについての記述です。
httpdプロセスがrunningであることを確認できます。

Adding Process to './goss.yaml':

httpd:
  running: true

次に、ポートについての記述です。
IPv6のTCP80番ポートが空いていることを確認できます。

Adding Port to './goss.yaml':

tcp6:80:
  listening: true
  ip:
  - '::'

最後に、サービスについての記述です。
サービスが自動起動するか、実行されているかを確認できます。

Adding Service to './goss.yaml':

httpd:
  enabled: true
  running: true

実際に作成されたファイルは以下のようになっています。
初見でも非常に分かりやすいテストファイルになっていますね。(個人の感想です)

$ vi goss.yaml
port:
  tcp6:80:
    listening: true
    ip:
    - '::'
service:
  httpd:
    enabled: true
    running: true
process:
  httpd:
    running: true

ではテストを実行してみましょう。
テストするにはgoss validateを使用します。

$ sudo goss validate
.....

Total Duration: 0.026s
Count: 5, Failed: 0, Skipped: 0

Failedがでることなく無事テストが完了しました。
では、httpdのサービスを止めて再度テストしてみましょう。

$ sudo service httpd stop
Stopping httpd:                                            [  OK  ]

$ sudo goss validate

Failures/Skipped:

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

Port: tcp6:80: listening:
Expected
    <bool>: false
to equal
    <bool>: true
Port: tcp6:80: ip: skipped

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

Total Duration: 0.025s
Count: 5, Failed: 3, Skipped: 1

サービスを停止したため、プロセスが止まり、ポートも空いていないためFailedだらけになりました。

さいごに

他にもいろいろな機能がありますので、試してブログを書きたいと思います。
まだまだ開発途中のツールで、頻繁にアップデートも行われていますので要望を上げたり、PRしたりするとよいかと思います。

楽して楽しいテストライフを!