Goss 入門 迅速かつ簡単なサーバー検証ツールの使い方

Serverspecとは

サーバーの状態をコードにより自動的にテストするためのツールであり、 Ruby製のテストフレームワークであるRSpecをベースにしています. なので、Server + RSpec = Serverspec という名前なのです.

以下の目的で使うサーバーテストツールです。

  1. テスト駆動によるインフラコード開発
  2. サーバ構築後の確認作業の自動化
  3. 稼働しているサーバの監視
  4. サーバの再起動後の状態確認
  5. サーバのあるべき状態の抽象化

また、Chef, Puppet, Ansibleなどのインフラ構成ツールと合わせて使うとテスト駆動なインフラコード開発が可能になります.

テスト駆動インフラの流れ

  1. これから書くインフラコードに対するテストコードを記述する
  2. インフラコード適用前のVMに対してテストを実施し失敗することを確認する
  3. 目的のインフラコードを書く
  4. インフラコードをVMに適用し、テストが成功することを確認する
  5. インフラコード適用前の状態にVMロールバックする
  6. インフラコードをリファクトリングする
  7. リファクタリングしたインフラコードをVMに適用し、テストが成功することを確認する
  8. 1 ~ 7 を繰り返す

Serverspecはサーバー構成管理ツールが複雑であったから生まれたツールです 複雑なサーバー構成管理ツールが不要になるとServerspecも不要になるでしょう しかし、手動でインフラを構築する場合はこれからも有益なツールであるといえます

Gossとは

Goss is EASY! Goss is FAST! Goss is SMALL!

github.com

Gossとは、サーバーの構成を検証するためのYAMLベースのServerspecの代替ツールです。 現在のシステム状態からテストを生成できるようにすることもでき、テストを書くプロセスをより簡単に行うことができます。 インストールが簡単でGoさえ動けば基本的にどこでも動かせる。 バイナリとして10MBぐらいの大きさ Dockerへの対応やモジュールが割と充実している。

Serverspecとの違い

メリット

  • Ruby(もしくはGo)に精通してなくてもサーバーが正しく構成されているかどうかを確認することができる インストールが簡単
  • gemなどの環境に悩まされることがない

デメリット

  • プラグインが少ないので少しはみだしたことをしようとするとどうしても、自分で記述する為のGoの知識が必要になる

How to Goss

Goss インストール

自動インストール

curl -fsSL https://goss.rocks/install | sh

手動インストール

curl -L https://github.com/aelsabbahy/goss/releases/download/_VERSION_/goss-linux-amd64 -o /usr/local/bin/goss
chmod +rx /usr/local/bin/goss

簡単に使うよ

公式ドキュメントに45秒で使えるよ!とあるので書いただけでも、なれると本当に高速に行うことができる。 使用するコマンドだけ確認する

# goss add package openssh-server
# goss add service sshd 

この2行で現在のOpenssh-serverのパッケージの情報とsshdのサービスの状態を記録できた。

# systemctl stop sshd
# goss validate

sshdを止めてgossを実行すると しっかりとエラーが出ます。

FS....F
 
Failures/Skipped: 
(詳細中略)
# goss serve 2>/dev/null &
# curl -i http://localhost:8080/healthz

ちなみに、HTTPとして取得も可能です。

FS....F
 
Failures/Skipped: 
(詳細中略)

詳しくはこちらに全部書いています。 https://github.com/aelsabbahy/goss/blob/master/docs/manual.md

おまけ

Gossには複数のCUIコマンドがあります。

add a - テストスイートにシステムリソースを追加する autoadd aa - すべての一致するリソースをテストスイートに自動的に追加する render r - 参照されたすべてのゴスファイルをインポートした後にゴスファイルをレンダリングする serve s - healthzエンドポイントを提供する validate v - システムを検証する

数あるtestsその中でも私が検査するときによく使ったもの

(完全に独断と偏見で決定してます) gossfile:gossファイル内でgossfileを定義する。 command:コマンドを実行して返り値を確認する。 file:fileに記載されている情報とどの程度違うのか確認する

gossfile

gossファイル内でgossfileを定義する。 gossfileを機能や役割に分ける。

gossfile:
  "goss_git.yaml": {}
  "goss_basic.yaml": {}
  "goss_service.yaml": {}
  "goss_command.yaml": {}
file

fileに記載されている情報とどの程度違うのか確認する そのほかにもシンボリックリンクの情報や 権限の情報も取得できる

file:
  /var/config:
    exists: true
    contains:
    - address = 192.168.0.1