[Goss] テストを実行する (validateコマンドの使い方)

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

Goss – Quick and Easy server validation

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

1. 基本的な使い方

validateコマンドは、作成したgossファイルに従ってテストを実行します。

goss validate [command_options]

デフォルトでは、./goss.yamlの内容を読み込みます。gossファイルのパスを変更するにはグローバルオプションの’-g‘を利用します。

goss -g goss_file validate

標準入力からgossファイルの読込みを行いたい場合は、ファイルのパスとして’‘を指定します。

$ cat ./goss/goss.yaml | goss -g - validate

復数のgossファイルをインクルードしている場合は、goss renderを利用して1つのgossファイルとしてまとめて標準出力に出すことができます。

goss render

公式サイトの実行例にあるように、ローカルの復数のgossファイルを利用して、リモートホストのテストを実行する場合などに利用できます。

$ goss render | ssh remote-host 'goss -g - validate'

この例では、ローカルの復数gossファイルをrenderコマンドで1つにまとめ、gossファイルの内容をまるごとリモートホストへ引き渡す動きになります。これによりテスト対象のリモートホストにgossファイルを配布する必要がなくなります。
 
デフォルトではRSpecに似たような出力フォーマットですが、’-f‘オプションで出力フォーマットを変更することができます。’-f‘オプションに指定できるフォーマットは以下のとおりです。

documentation テスト結果を詳細に出力します。
json jsonフォーマットでテスト結果を詳細に出力します。
json_oneline jsonフォーマット(1行)でテスト結果を詳細に出力します。
junit junitのフォーマットでテスト結果を詳細に出力します。
nagios nagiosの出力フォーマットでテスト結果を出力します。
nagios_varbose nagiosの出力フォーマットでテスト結果を詳細に出力します。
rspecish デフォルトのフォーマット。RSpecに似たような出力を行います。
tap TAP(Test Anything Protocol)のフォーマットでテスト結果を詳細に出力します。
slitent テスト結果の出力は行いません。

2. rspecish(デフォルト)フォーマット

デフォルトのrspecishフォーマットの出力例です。デフォルトのフォーマットでは、結果のサマリーとエラー状態のみを表示します。

$ goss validate
FS.............

Failures/Skipped:

Port: tcp:80: listening:
Expected
    <bool>: false
to equal
    <bool>: true
Port: tcp:80: ip: skipped

Total Duration: 0.016s
Count: 15, Failed: 1, Skipped: 1

3. documentationフォーマット

documentationフォーマットの出力例です。デフォルトのrspecishフォーマットは成功したテスト項目がわかりませんが、documentフォーマットでは成功したテスト項目も表示します。

$ goss validate -f documentation
Group: nginx: exists: matches expectation: [true]
Group: nginx: gid: matches expectation: [117]
Port: tcp:80: listening:
Expected
    <bool>: false
to equal
    <bool>: true
Port: tcp:80: ip: skipped
Process: nginx: running: matches expectation: [true]
User: nginx: exists: matches expectation: [true]
User: nginx: uid: matches expectation: [113]
User: nginx: gid: matches expectation: [117]
User: nginx: home: matches expectation: ["/nonexistent"]
User: nginx: groups: matches expectation: [["nginx"]]
User: nginx: shell: matches expectation: ["/bin/false"]
Package: nginx: installed: matches expectation: [true]
Package: nginx: version: matches expectation: [["1.13.9-1~artful"]]
Service: nginx: enabled: matches expectation: [false]
Service: nginx: running: matches expectation: [true]


Failures/Skipped:

Port: tcp:80: listening:
Expected
    <bool>: false
to equal
    <bool>: true
Port: tcp:80: ip: skipped

Total Duration: 0.014s
Count: 15, Failed: 1, Skipped: 1

4. jsonフォーマット

jsonフォーマットの出力例です。 *出力結果が長くなるので、途中を省略しています。

$ goss validate -f json
{
    "results": [
        {
            "duration": 15781,
            "err": null,
            "expected": [
                "true"
            ],
            "found": [
                "true"
            ],
            "human": "",
            "meta": null,
            "property": "running",
            "resource-id": "nginx",
            "resource-type": "Process",
            "result": 0,
            "successful": true,
            "summary-line": "Process: nginx: running: matches expectation: [true]",
            "test-type": 0,
            "title": ""
        },
        [...]
    ],
    "summary": {
        "failed-count": 1,
        "summary-line": "Count: 15, Failed: 1, Duration: 0.013s",
        "test-count": 15,
        "total-duration": 13422821
    }
}

5. json_onelineフォーマット

json_onelineフォーマットの出力例です。 *出力結果が長くなるので、途中を省略しています。
改行がなくなり、1行で出力されます。

$ goss validate -f json_oneline
{"results":[{"duration":97075,"err":null,"expected":["true"],"found":["true"],"human":"","meta":null,"property":"exists","resource-id":"nginx","resource-type":"Group","result":0,"successful":true,"summary-line":"Group: nginx: exists: matches expectation: [true]","test-type":0,"title":""},{"duration":41374,"err":null,"expected":["117"],"found":["117"],"human":"","meta":null,"property":"gid","resource-id":"nginx","resource-type":"Group","result":0,"successful":true,"summary-line":"Group: nginx: gid: matches expectation: [117]","test-type":0,"title":""}[...]}

6. junitフォーマット

junitフォーマットの出力例です。 *出力結果が長くなるので、途中を省略しています。

$ goss validate -f junit
<?xml version="1.0" encoding="UTF-8"?>
<testsuite name="goss" errors="0" tests="15" failures="1" skipped="1" time="0.019" timestamp="2018-03-15T11:42:54+09:00">
<testcase name="Process nginx running" time="0.000">
<system-out>Process: nginx: running: matches expectation: [true]</system-out>
</testcase>
<testcase name="User nginx exists" time="0.000">
<system-out>User: nginx: exists: matches expectation: [true]</system-out>
</testcase>
[...]
<testcase name="Service nginx running" time="0.003">
<system-out>Service: nginx: running: matches expectation: [true]</system-out>
</testcase>
</testsuite>

7. nagiosフォーマット

nagiosフォーマットの出力例です。

$ goss validate -f nagios
GOSS CRITICAL - Count: 15, Failed: 1, Skipped: 1, Duration: 0.016s

8. nagios_validateフォーマット

nagios_validateフォーマットの出力例です。

$ goss validate -f nagios_verbose
GOSS CRITICAL - Count: 15, Failed: 1, Skipped: 1, Duration: 0.017s
Fail 1 - Port: tcp:80: listening: doesn't match, expect: [true] found: [false]

9. tapフォーマット

tapフォーマットの出力例です。TAPプロトコルについては、こちらのページを参照してください。

$ goss validate -f tap
1..15
ok 1 - Group: nginx: exists: matches expectation: [true]
ok 2 - Group: nginx: gid: matches expectation: [117]
not ok 3 - Port: tcp:80: listening: doesn't match, expect: [true] found: [false]
ok 4 - # SKIP Port: tcp:80: ip: skipped
ok 5 - Process: nginx: running: matches expectation: [true]
ok 6 - User: nginx: exists: matches expectation: [true]
ok 7 - User: nginx: uid: matches expectation: [113]
ok 8 - User: nginx: gid: matches expectation: [117]
ok 9 - User: nginx: home: matches expectation: ["/nonexistent"]
ok 10 - User: nginx: groups: matches expectation: [["nginx"]]
ok 11 - User: nginx: shell: matches expectation: ["/bin/false"]
ok 12 - Package: nginx: installed: matches expectation: [true]
ok 13 - Package: nginx: version: matches expectation: [["1.13.9-1~artful"]]
ok 14 - Service: nginx: enabled: matches expectation: [false]
ok 15 - Service: nginx: running: matches expectation: [true]

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