Goss - Quick and Easy server validation
Goss in 45 seconds
Note: For testing containers see the dgoss wrapper. Also, user submitted wrapper scripts for Kubernetes kgoss and Docker Compose dcgoss.
Note: For some Docker/Kubernetes healthcheck, health endpoint, and container ordering examples, see my blog post here.
Introduction
What is Goss?
Goss is a YAML based serverspec alternative tool for validating a server's configuration. It eases the process of writing tests by allowing the user to generate tests from the current system state. Once the test suite is written they can be executed, waited-on, or served as a health endpoint.
Why use Goss?
- Goss is EASY! - Goss in 45 seconds
- Goss is FAST! - small-medium test suites are near instantaneous, see benchmarks
- Goss is SMALL! - <10MB single self-contained binary
Installation
Note: For macOS and Windows, see: platform-feature-parity.
This will install goss and dgoss.
Note: Using curl | sh is not recommended for production systems, use manual installation below.
curl -fsSL https://goss.rocks/install | sh
# Install v0.4.8 version to ~/bin
curl -fsSL https://goss.rocks/install | GOSS_VER=v0.4.8 GOSS_DST=~/bin sh
Manual installation
Latest
chmod +rx /usr/local/bin/goss
curl -L https://github.com/goss-org/goss/releases/latest/download/dg oss -o /usr/local/bin/dgoss
# Alternatively, using the latest master
# curl -L https://raw.githubusercontent.com/goss-org/goss/master/extra s/dgoss/dgoss -o /usr/local/bin/dgoss
chmod +rx /usr/local/bin/dgoss
Specific Version
VERSION=v0.4.8
curl -L "https://github.com/goss-org/goss/releases/download/${VERSION}/goss-linux-amd64" -o /usr/local/bin/goss
chmod +rx /usr/local/bin/goss
# (optional) dgoss docker wrapper (use 'master' for latest version)
VERSION=v0.4.8
curl -L "https://github.com/goss-org/goss/releases/download/${VERSION}/dgoss" -o /usr/local/bin/dgoss
chmod +rx /usr/local/bin/dgoss
Build it yourself
Full Documentation
Using the container image
Using the Goss container image
Quick start
Writing a simple sshd test
An initial set of tests can be derived from the system state by using the add or autoadd commands.
Let's write a simple sshd test using autoadd.
$ sudo goss autoadd sshd
Generated goss.yaml:
tcp:22:
listening: true
ip:
- 0.0.0.0
tcp6:22:
listening: true
ip:
- '::'
service:
sshd:
enabled: true
running: true
user:
sshd:
exists: true
uid: 74
gid: 74
groups:
- sshd
home: /var/empty/sshd
shell: /sbin/nologin
group:
sshd:
exists: true
gid: 74
process:
sshd:
running: true
Now that we have a test suite, we can:
- Run it once
...............
Total Duration: 0.021s # <- yeah, it's that fast..
Count: 15, Failed: 0
- Edit it to use templates, and run with a vars file
- keep running it until the system enters a valid state or we timeout
- serve the tests as a health endpoint
$ curl localhost:8080/healthz
# JSON endpoint
$ goss serve --format json &
$ curl localhost:8080/healthz
# rspecish response via content negotiation
$ goss serve --format json &
$ curl -H "Accept: application/vnd.goss-rspecish" localhost:8080/healthz
Manually editing Goss files
Goss files can be manually edited to improve readability and expressiveness of tests.
A Json draft 7 schema available at https://goss.rocks/schema.yaml makes it easier to edit simple goss.yaml files in IDEs, providing usual coding assistance such as inline documentation, completion and static analysis. See #793 for screenshots.
For example, to configure the Json schema in JetBrains intellij IDEA, follow documented instructions, with arguments such as:
schema url=https://goss.rocks/schema.yamlschema version=Json schema version 7file path pattern=*/goss.yaml
In addition, Goss files can also be further manually edited (without yet full json support) to use:
- Patterns
- Advanced Matchers
- Templates
titleandmeta(arbitrary data) attributes are persisted when adding other resources withgoss add
Some examples:
user:
sshd:
title: UID must be between 50-100, GID doesn't matter. home is flexible
meta:
desc: Ensure sshd is enabled and running since it's needed for system management
sev: 5
exists: true
uid:
# Validate that UID is between 50 and 100
and:
gt: 50
lt: 100
home:
# Home can be any of the following
or:
- /var/empty/sshd
- /var/run/sshd
package:
kernel:
installed: true
versions:
# Must have 3 kernels and none of them can be 4.4.0
and:
- have-len: 3
- not:
contain-element: 4.4.0
# Loaded from --vars YAML/JSON file
{{.Vars.package}}:
installed: true
{{if eq .Env.OS "centos"}}
# This test is only when $OS environment variable is set to "centos"
libselinux:
installed: true
{{end}}