gossを使ってFreeBSDサーバの設定をテストする

2021年10月16日 初稿

  1. gossの概要
  2. gossをFreeBSDにインストールする
  3. gossによるテスト例
    1. 簡単な例
    2. ヘルスチェックエンドポイントとして待ち受ける
  4. より詳細な情報のために

gossの概要

gossはサーバの設定をテストするツールです。YAML形式でテストコードを書き、gossを実行したホストがそのテスト通りに設定されているかを確認できます。

実装言語はGo言語でライセンスはApache-2.0です。2015年10月3日にv0.0.1がリリースされ、2020年12月19日にリリースされたv0.3.16が初稿時点での最新バージョンです。

同じくサーバの設定をテストするツールにServerspecがあります。gossと比べてサポートされているプラットフォームはServerspecのほうが多様かつリリース頻度も高めです。初稿時点では、Serverspecの最新バージョンは2021年6月24日のv2.41.8です。

よりメンテナンスされているほうを選ぶならServerspecですが、テストコードをYAMLで書いて手早くテストしたいときやgossの機能だけで要求を満たせられるならgossも有力な選択肢となるでしょう。

gossをFreeBSDにインストールする

gossのビルドにはGNU makeとGoが必要です。

pkg install gmake go

初稿時点ではgossはFreeBSDをサポートしていません。FreeBSDである程度使えるように直したブランチがあるので、それをgit cloneしてビルドします。

git clone -b develop/support-freebsd-build https://github.com/user340/goss.git
cd goss
gmake build
./release-build.sh alpha-darwin-amd64
./release-build.sh linux-386
./release-build.sh linux-amd64
./release-build.sh linux-arm
./release-build.sh alpha-windows-amd64
./release-build.sh freebsd-amd64

releaseディレクトリにgoss-freebsd-amd64が生成されています。これがgossの実行バイナリです。実際にサーバの設定をテストするときは、テスト対象のホストにこのバイナリとYAMLのテストコードを転送しテスト対象側で実行します。

gossによるテスト例

ApacheがインストールされWebサーバとして運用されているFreeBSDサーバがあるとします。gossの実行バイナリはrootユーザのホームディレクトリに配置されています。ここで、Apacheのパッケージがインストールされており、サービスが意図どおりに動いているかをテストします。YAMLのテストコードは次のようになります。


package:
  apache24:
    installed: true
    versions:
      - 2.4.51
    skip: false

service:
  apache24:
    enabled: true
    running: true

このコードをテスト対象のホストに転送するか、あるいはテスト対象のホストで直接書くなどして用意します。名前はgoss.yamlにしてください。

簡単な例

上で用意したgoss.yamlが存在するディレクトリでgoss-freebsd-amd64 validateを実行します。もっとも簡単かつ一般的な使い方です。

./goss-freebsd-amd64 validate
....

Total Duration: 0.006s
Count: 4, Failed: 0, Skipped: 0

テストはすべて通りました。

ヘルスチェックエンドポイントとして待ち受ける

gossテストの実行をサーバとして待ち受けることも可能です。gossサーバがヘルスチェックエンドポイントとしてのHTTPサーバを建て、クライアントがアクセスするとgossによるテスト結果が返ってくるようにできます。

goss.yamlが存在するディレクトリでgoss-freebsd-amd64 serveを実行します。

./goss-freebsd-amd64 serve
2021/10/16 10:22:43 Starting to listen on: :8080

別ターミナル等からホストへのIPかドメイン:8080/healthzにアクセスします。

curl 192.0.2.1:8080/healthz
....

Total Duration: 0.005s
Count: 4, Failed: 0, Skipped: 0

さきほど手動実行したときと同じ出力がHTTPクライアントから返ってきました。

このように、gossサーバを常時稼働させておき、パッケージアップデートやデプロイ後にヘルスチェックエンドポイントを叩いてテストする……といった運用も可能です。

より詳細な情報のために

gossの完全なドキュメントはmanual.mdを、プラットフォームごとの機能の制限などについてはplatform-feature-parity.md参照してください。これらのドキュメントはアップストリームのものではなくFreeBSD対応版のものです。