[Goss] テスト項目を作成する (addコマンドの使い方)

Gossは構築したサーバーの構成や設定が正しいかを、すばやく簡単に確認できるツールです。

Goss – Quick and Easy server validation

https://github.com/aelsabbahy/goss
同様のツールにServerspecがありますが、GossはYAMLでテスト項目を設定します。
テスト項目を自動的に作成するのにgoss addコマンドとgoss autoaddコマンドがあります。今回はaddコマンドの基本的な使い方を紹介します。

1. 基本的な使い方

addコマンドは、1つのリソースのテスト項目を追加します。

goss add rsource_type resource

resource_typeに指定できるのは以下の項目です。

resource_type 説明
addr リモートアドレスに接続できるかを確認します。
command コマンドの実行結果のステータスコードおよび結果出力を確認します。
dns DNS解決できるかを確認します。
file ファイル、ディレクトリ、シンボリックリンクの状態を確認します。
goss 他のgossファイルをインポートします。
group ユーザーグループの状態を確認します。
http httpレスポンスコードとレスポンス内容を確認します。
interface ネットワークインターフェースの状態を確認します。
kernel-param カーネルパラメーターの状態を確認します。
mount ファイルシステムのマウント状態を確認します。
package パッケージの状態を確認します。
port ポートの状態を確認します。
process プロセスの状態を確認します。
service サービスの状態を確認します。
user ユーザーの状態を確認します。

2. リモートアドレスへのtcp接続を確認する: addr

リモートアドレスへのtcp接続を確認するには、リソースタイプに’addr‘を指定します。リソースには’リモートアドレス:ポート‘の形式で接続先を指定します。

設定項目 説明 必須(o:yes x:no)
reachable 指定アドレス、ポートに到達できるか(true/false) o
timeout タイムアウトするまでの時間(ミリ秒) x

410gone.clickの443ポートに接続できることを確認するテスト項目を作成してみます。

$ goss add addr 410gone.click:443
Adding Addr to './goss.yaml':

tcp://410gone.click:443:
  reachable: true
  timeout: 500

3. コマンドの実行結果を確認する: command

コマンドの実行結果のステータスコードおよび結果出力を確認するには、リソースタイプに’command‘を指定します。リソースには実行するコマンドを指定します。

設定項目 説明 必須(o:yes x:no)
exit-status コマンド実行時の終了ステータス o
stdout コマンド実行時の標準出力 x
stderr コマンド実行時の標準エラー x
timeout コマンド実行のタイムアウト時間(ミリ秒) x

カーネルのバージョンを確認するテスト項目を作成してみます。

$ goss add command 'uname -r'
Adding Command to './goss.yaml':

uname -r:
  exit-status: 0
  stdout:
  - 4.13.0-36-generic
  stderr: []
  timeout: 10000

4. DNS名前解決の結果を確認する: dns

DNS名前解決ができるかを確認するには、リソースタイプに’dns‘を指定します。リソースには問い合わせ対象(FQDN,IPアドレス)を指定します。

設定項目 説明 必須(o:yes x:no)
resolvable 名前解決ができるか(true/false) o
server 問い合わせ先のDNSサーバアドレス x
addrs 問い合わせ結果 x
timeout 問い合わせのタイムアウト時間(ミリ秒) x

410gone.clickの名前解決ができるかを確認するテスト項目を作成してみます。

$ goss add dns 410gone.click
Adding DNS to './goss.yaml':

410gone.click:
  resolvable: true
  addrs:
  - XXX.XXX.XXX.XXX
  timeout: 500

DNSのレコートタイプを指定するには、ホスト名の前に’レコードタイプ:‘の形式で追加します。
410gone.clickのAレコードを確認するテスト項目を作成してみます。

$ goss add dns A:410gone.click
Adding DNS to './goss.yaml':

A:410gone.click:
  resolvable: true
  addrs:
  - XXX.XXX.XXX.XXX
  timeout: 500

5. ファイル、ディレクトリ、シンボリックリンクの状態を確認する: file

ファイル、ディレクトリ、シンボリックリンクの状態を確認するには、リソースタイプに’file‘を指定します。リソースには対象のファイル、ディレクトリ、シンボリックリンク名を指定します。

設定項目 説明 必須(o:yes x:no)
exists 存在するか(true/false) o
mode パーミッション x
size サイズ(バイト) x
owner オーナー x
group グループ x
filetype ファイルタイプ(file/symlink/directory) x
contains ファイルに含まれる内容 x
md5 md5チェックサム x
sha256 sha256チェックサム x
liked-to シンボリックリンク先 x

/etc/passwdのファイルの状態を確認するテスト項目を作成してみます。

$ goss add file /etc/passwd
Adding File to './goss.yaml':

/etc/passwd:
  exists: true
  mode: "0644"
  size: 1775
  owner: root
  group: root
  filetype: file
  contains: []

6. 他のgossファイルをインポートする: goss

テスト項目が多くなるとgossファイルも巨大化し、可読性が悪くなります。このような場合、用途や機能別にgossファイルを分割して作成し、実行用gossファイルでインポートすると可読性が高まります。
gossファイルをインポートするには、リソースタイプに’goss‘を指定します。リソースにはインポートするgossファイルを指定します。ワイルドカード等でのパターン展開もできます。
 
/etc/goss.dディレクトリにある.yamlファイルを全てインポートする設定を作成してみます。

$ goss add goss /etc/goss.d/*.yaml
Adding Gossfile to './goss.yaml':

/etc/goss.d/*.yaml: {}

7. OSユーザーグループの状態を確認する: group

OSのユーザーグループの状態を確認するには、リソースタイプに’group‘を指定します。リソースにはグループ名を指定します。

設定項目 説明 必須(o:yes x:no)
exists グループが存在するか(true/false) o
gid グループのgid x

nginxグループの状態を確認するテスト項目を作成してみます。

$ goss add group nginx
Adding Group to './goss.yaml':

nginx:
  exists: true
  gid: 117

8. httpレスポンスコードとレスポンス内容を確認する: http

httpレスポンスとレスポンス内容の正常性を確認するには、リソースタイプに’http‘を指定します。リソースには接続先のURLを指定します。リソースのプロトコルに’https’を指定することで、httpsでの確認もできます。

設定項目 説明 必須(o:yes x:no)
status httpレスポンスコード o
allow-insecure TLS/SSL認証の自己証明書や期限切れ証明書を許可する(true/false) x
no-follow-redirects リダイレクトを追随するか(true/false) x
timeout タイムアウトまでの時間(ミリ秒) x
body レスポンスボディの内容 x

410gone.clickのhttpsレスポンスを確認するテスト項目を作成してみます。

$ goss add http https://410gone.click
Adding HTTP to './goss.yaml':

https://410gone.click:
  status: 200
  allow-insecure: false
  no-follow-redirects: false
  timeout: 5000
  body: []

9. ネットワークインターフェースの状態を確認する: interface

ネットワークインターフェースの状態を確認するには、リソースタイプに’interface‘を指定します。リソースにはインターフェース名を指定します。

設定項目 説明 必須(o:yes x:no)
exists インターフェースが存在するか(true/false) o
addrs インターフェースのアドレス x
mtu インターフェースのmtu x

ネットワーク・インターフェース’enp03s’の状態を確認するテスト項目を作成してみます。

$ goss add interface enp0s3
Adding Interface to './goss.yaml':

enp0s3:
  exists: true
  addrs:
  - 10.0.2.4/24
  - XXXX::XXXX:XXXX:XXXX:XXXX/64

10. カーネルパラメーターの状態を確認する: kernel-param

カーネルパラメーターの内容を確認するには、リソースタイプに’kernel-param‘を指定します。リソースに設定できる値は、sysctl -aで確認することができます。

設定項目 説明 必須(o:yes x:no)
value カーネルパラメーターの設定値 o

vm.swappinessの値を確認するテスト項目を作成してみます。

$ goss add kernel-param vm.swappiness
Adding KernelParam to './goss.yaml':

vm.swappiness:
  value: "60"

11. ファイルシステムのマウント状態を確認する: mount

ファイルシステムのマウント状態を確認するには、リソースタイプに’mount‘を指定します。リソースにはマウントポイントを指定します。

設定項目 説明 必須(o:yes x:no)
exists マウントポイントが存在するか(true/false) o
opts マウントオプション x
source マウントするデバイス x
filesystem ファイルシステム x

ルート(/)のマウント状態を確認するテスト項目を作成してみます。

$ goss add mount /
Adding Mount to './goss.yaml':

/:
  exists: true
  opts:
  - rw
  - relatime
  source: /dev/mapper/ubuntu--vg-root
  filesystem: ext4

12. パッケージの状態を確認する: package

パッケージの状態を確認するには、リソースタイプに’package‘を指定します。リソースにはテストをしたいパッケージ名を指定します。

設定項目 説明 必須(o:yes x:no)
installed インストールされているか(true/false) o
version インストールバージョン x

nginxパッケージの状態を確認するテスト項目を作成してみます。

$ goss add package nginx
Adding Package to './goss.yaml':

nginx:
  installed: true
  versions:
  - 1.13.9-1~artful

13. ローカルポートの状態を確認する: port

ローカルポートの状態を確認するには、リソースタイプに’port‘を指定します。リソースにはテストをしたいポート番号を指定します。
※リモートのポート状態を確認するには、リソースタイプに’addr‘を指定します。

設定項目 説明 必須(o:yes x:no)
listening ポートがLISTEN状態か(true/false) o
ip リスニングアドレス x

ローカル22番ポートの状態を確認するテスト項目を作成してみます。

$ goss add port 22
Adding Port to './goss.yaml':

tcp:22:
  listening: true
  ip:
  - 0.0.0.0

14. プロセスの状態を確認する: process

プロセスの状態を確認するには、リソースタイプに’process‘を指定します。リソースにプロセス名を指定します。

設定項目 説明 必須(o:yes x:no)
running プロセスが起動しているか o

sshdプロセスを確認するテスト項目を作成してみます

$ goss add process sshd
Adding Process to './goss.yaml':

sshd:
  running: true

15. サービスの状態を確認する: service

サービスの状態を確認するには、リソースタイプに’service‘を指定します。リソースにはサービス名を指定します。

設定項目 説明 必須(o:yes x:no)
enabled 自動起動か(true/false) o
running 起動しているか(true/false) o

sshdサービスの状態を確認するテスト項目を作成してみます。

$ goss add service sshd
Adding Service to './goss.yaml':

sshd:
  enabled: true
  running: true

16. ユーザーの状態を確認する: user

osユーザーの状態を確認するには、リソースタイプに’user‘を指定します。リソースには確認対象のユーザー名を指定します。

設定項目 説明 必須(o:yes x:no)
exists ユーザーが存在するか(true/false) o
uid ユーザーのuid x
gid ユーザーのgid x
groups ユーザーが所属するグループ x
home ユーザーのホームディレクトリ x
shell ユーザーのログインシェル x

nginxユーザの状態を確認するテスト項目を作成してみます。

$ goss add user nginx
Adding User to './goss.yaml':

nginx:
  exists: true
  uid: 113
  gid: 117
  groups:
  - nginx
  home: /nonexistent
  shell: /bin/false

 
以上、goss addコマンドの使い方の紹介でした。