gossでLinuxサーバーの構成をテストするには

ChatGPTに聞いてみた。
ユーザーデータでEC2のLinuxインスタンスを構成しています。期待通りに構成されているか確認したいです。
Serverspecのようなツールもありますが、自分で管理しているサーバーではないので、追加インストールはしたくないです。単一ファイルで構成情報をテストできればよいです。何かアイデアを出してもらえますか?

2つのアプローチを提案された。Gossがよさそう。
1. 自前の “assert” 関数 を使った構成チェック
シェルスクリプト内に assert 関数を定義し、様々なチェック項目(ファイルの存在、内容、所持者、パーミッション、プロセスやポートの稼働)を簡潔に記述できます。
#!/bin/bash
set -e
assert() {
local desc="$1"; shift
"$@" >/dev/null 2>&1
if [ $? -eq 0 ]; then
echo "OK: $desc"
else
echo "FAIL: $desc"
exit 1
fi
}
# 例1: ファイルの存在
assert "ログディレクトリが存在するか" test -d /var/log/myapp
# 例2: パーミッションが 640 か
assert "ログファイルのパーミッション" [ "$(stat -c '%a' /var/log/myapp/app.log)" = "640" ]
# 例3: 所有者が root であるか
assert "ログファイル所有者が root" [ "$(stat -c '%U' /var/log/myapp/app.log)" = "root" ]
# 例4: ポート 8080 でリッスンしているか
assert "サービスがポート8080で稼働" sh -c "netstat -tulpn | grep -q :8080"
# 例5: パッケージがインストールされているか(例:curl)
assert "curlがインストールされている" sh -c "rpm -q curl"
echo "全チェック合格 🎉"
メリット
- 柔軟で拡張しやすく、自分の環境や好みに合わせたチェックが可能。
- 完全にシェル内完結、外部依存なし。
2. Goss を単一バイナリで利用
シェルスクリプトには収まりませんが、goss は追加インストールが不要な単一バイナリで、YAML にテストを書くだけでサーバ構成の検証ができます (vpsserver.com, stackoverflow.com, medium.com, github.com)。
使用例
# goss.yaml
file:
/etc/myapp/config.yml:
exists: true
mode: "0640"
owner: root
service:
myapp:
enabled: true
running: true
port:
tcp:8080:
listening: true
実行は goss validate
だけ。カスタマイズ性も高く goss generate
で現在のサーバ構成を YAML 化する機能もあります 。
3. チェック項目別ヒントまとめ
チェック内容 | シェル関数での手法 | 備考 |
---|---|---|
ファイル/ディレクトリの存在 |
test -e , test -d
|
|
モード/所有者 |
stat -c '%a' , stat -c '%U'
|
|
プロセス/サービス |
pgrep , systemctl is-active
|
|
ポート稼働 |
netstat または ss , grep :ポート番号
|
|
パッケージ |
rpm -q , dpkg -s , which
|
|
ファイル内容の検証 |
grep -q パターン ファイル , diff , sha256sum
|
|
ホスト間疎通 |
ping -c1 , nc , curl -sSf (docs.rockylinux.org, serverspec.org, stackoverflow.com, unix.stackexchange.com) |
nc は多くのLinuxに標準搭載 |
✅ まとめ
-
assert
関数ベースの純シェルテスト:完全セルフ完結、柔軟・軽量 - Goss:単一バイナリで記述シンプル、実行も簡単
目的や運用体制に応じて、最初はシンプルな assert スクリプトから始め、ゆくゆくは YAML ベースの Goss に移行する、という段階的な採用もおすすめです。
どちらについても詳しく聞きたい点があれば、遠慮なくお知らせください!

GossのManualインストール。
curl -L https://github.com/goss-org/goss/releases/latest/download/goss-linux-amd64 -o /usr/local/bin/goss
chmod +rx /usr/local/bin/goss
一般ユーザーの場合はsudo
を付ける。
sudo curl -L https://github.com/goss-org/goss/releases/latest/download/goss-linux-amd64 -o /usr/local/bin/goss
sudo chmod +rx /usr/local/bin/goss

Gossにはサブコマンドadd/autoaddがあり、現在のサーバーの状態からテストケースのyamlを生成できる。

今回は手動でテストケースを作成する。sshdのサンプル(起動中であり、自動起動が有効)。
service:
sshd:
enabled: true
running: true

sshdが起動中で自動起動が有効な場合、テストにPassする。
$ systemctl status sshd | grep Active
# Active: active (running) since Fri 2025-08-29 14:16:47 JST; 8min ago
$ systemctl is-enabled sshd
# enabled
$ goss validate
# ..
#
# Total Duration: 0.011s
# Count: 2, Failed: 0, Skipped: 0

sshdの自動起動を無効にすると、テストFailedになる。
$ sudo systemctl disable sshd
# Removed "/etc/systemd/system/multi-user.target.wants/sshd.service".
$ systemctl is-enabled sshd
# disabled
$ goss validate
# F.
#
# Failures/Skipped:
#
# Service: sshd: enabled:
# Expected
# false
# to equal
# true
#
# Total Duration: 0.011s
# Count: 2, Failed: 1, Skipped: 0