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したりするとよいかと思います。
楽して楽しいテストライフを!