Closed7

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

Junichi HashimotoJunichi Hashimoto

ChatGPTに聞いてみた。

ユーザーデータでEC2のLinuxインスタンスを構成しています。期待通りに構成されているか確認したいです。

Serverspecのようなツールもありますが、自分で管理しているサーバーではないので、追加インストールはしたくないです。単一ファイルで構成情報をテストできればよいです。何かアイデアを出してもらえますか?

Junichi HashimotoJunichi Hashimoto

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 に移行する、という段階的な採用もおすすめです。
どちらについても詳しく聞きたい点があれば、遠慮なくお知らせください!

Junichi HashimotoJunichi Hashimoto

GossのManualインストール。

https://github.com/goss-org/goss

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
Junichi HashimotoJunichi Hashimoto

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

goss.yaml
service:
    sshd:
        enabled: true
        running: true
Junichi HashimotoJunichi Hashimoto

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
Junichi HashimotoJunichi Hashimoto

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
このスクラップは13日前にクローズされました