Resource Types
bond | bridge | cgroup | command | cron | default_gateway | docker_container | docker_image | file | group | host | iis_app_pool | iis_website | interface | ip6tables | ipfilter | ipnat | iptables | kernel_module | linux_audit_system | linux_kernel_parameter | lxc | mail_alias | mysql_config | package | php_config | port | ppa | process | routing_table | selinux | selinux_module | service | user | x509_certificate | x509_private_key | windows_feature | windows_registry_key | yumrepo | zfs
Note: In the following examples, due to my preference I’m using should syntax, but Serverspec works well on expect syntax.
You can use more strict grammar syntax like be_a_file instead of be_file with all resource types.
bond
Network bond resource type.
exist
In order to test a bond exists, you should use exist matcher.
describe bond('bond0') do
it { should exist }
end
have_interface
In order to test a bond has a correct member, you should use have_interface matcher.
describe bond('bond0') do
it { should have_interface 'eth0' }
end
bridge
Network bridge resource type.
exist
In order to test a bridge exists, you should use exist matcher.
describe bridge('br0') do
it { should exist }
end
have_interface
In order to test a bridge has a correct interface, you should use have_interface matcher.
describe bridge('br0') do
let(:stdout) { 'eth0' }
it { should have_interface 'eth0' }
end
cgroup
Linux cgroup resource type.
You can test cgroup parameters like this.
describe cgroup('group1') do
its('cpuset.cpus') { should eq 1 }
end
command
Command resource type.
its(:stdout), its(:stderr), its(:exit_status)
You can get the stdout, stderr and exit status of the command result, and can use any matchers RSpec supports.
describe command('ls -al /') do
its(:stdout) { should match /bin/ }
end
describe command('ls /foo') do
its(:stderr) { should match /No such file or directory/ }
end
describe command('ls /foo') do
its(:exit_status) { should eq 0 }
end
contain
Notice: The matcher contain will be obsoleted.
In order to test a command stdout/stderr a given string, you can use contain matcher.
describe command('apachectl -M') do
its(:stdout) { should contain('proxy_module') }
end
You can test a given string within a given range.
describe command('apachectl -V') do
# test 'Prefork' exists between "Server MPM" and "Server compiled".
its(:stdout) { should contain('Prefork').from(/^Server MPM/).to(/^Server compiled/) }
# test 'conf/httpd.conf' exists after "SERVER_CONFIG_FILE".
its(:stdout) { should contain('conf/httpd.conf').after('SERVER_CONFIG_FILE') }
# test 'Apache/2.2.29' exists before "Server built".
its(:stdout) { should contain(' Apache/2.2.29').before('Server built') }
end
cron
Cron resource type.
have_entry
In order to test cron have a given entry exists, you should use have_entry matcher.
describe cron do
it { should have_entry '* * * * * /usr/local/bin/foo' }
end
You can test a given user has the cron entry like this.
describe cron do
it { should have_entry('* * * * * /usr/local/bin/foo').with_user('mizzy') }
end
You can get all cron table entries and use regexp like this.
describe cron do
its(:table) { should match /you can use regexp/ }
end
default_gateway
Default gateway resource type.
In order to test a default gateway is set up correctly, you should use this syntax.
describe default_gateway do
its(:ipaddress) { should eq '192.168.10.1' }
its(:interface) { should eq 'br0' }
end
docker_container
Docker Container resource type
Container settings can be tested like this.
describe docker_container('focused_curie') do
its(['HostConfig.NetworkMode']) { should eq 'bridge' }
its(:Path) { should eq '/bin/sh' }
end
exist
Check if a named container exists.
describe docker_container('focused_curie') do
it { should exist }
end
be_running
Check if a named container is running.
describe docker_container('focused_curie') do
it { should be_running }
end
have_volume
In order to test if a volume has been mounted.
describe docker_container('focused_curie') do
# matcher syntax: have_volume(container_path,host_path)
it { should have_volume('/tmp','/data') }
end
docker_image
Docker Image resource type
Check the attributes hash returned by docker inspect.
describe docker_image('busybox:latest') do
its(:inspection) { should_not include 'Architecture' => 'i386' }
end
You can also specify hash key like this.
describe docker_image('busybox:latest') do
its(['Architecture']) { should eq 'amd64' }
end
You can also specify nested hash key like this.
describe docker_image('busybox:latest') do
its(['Config.Cmd']) { should include '/bin/sh' }
end
exist
Check if a specific image been pulled to the host.
describe docker_image('busybox:latest') do
it { should exist }
end
file
File and directory resource type.
be_file
In order to test a subject exists as a file, you should use be_file matcher.
describe file('/etc/passwd') do
it { should be_file }
end
exist
In order to test the presence of a file, you should use exist matcher.
describe file('/etc/passwd') do
it { should exist }
end
be_directory
In order to test a subject exists as a directory, you should use be_directory matcher.
describe file('/var/log/httpd') do
it { should be_directory }
end
be_block_device
In order to test a subject exists as a block device, you should use be_block_device matcher.
describe file('/dev/disk0') do
it { should be_block_device }
end
be_character_device
In order to test a subject exists as a character device, you should use be_character_device matcher.
describe file('/dev/ttys0') do
it { should be_character_device }
end
be_pipe
In order to test a subject exists as a name pipe, you should use the be_pipe matcher.
describe file('/tmp/unicorn.fifo') do
it { should be_pipe }
end
be_socket
In order to test a subject exists as a socket, you should use be_socket matcher.
describe file('/var/run/unicorn.sock') do
it { should be_socket }
end
be_symlink
In order to test a subject exists as a link, you should use be_symlink matcher.
describe file('/etc/pam.d/system-auth') do
it { should be_symlink }
end
contain
Notice: Instead of contain, you can use its(:content) and any standard rspec matchers. The matcher contain will be obsoleted.
describe file('/etc/httpd/conf/httpd.conf') do
its(:content) { should match /ServerName www\.example\.jp/ }
end
In order to test a file contains a given string, you can use contain matcher.
describe file('/etc/httpd/conf/httpd.conf') do
it { should contain 'ServerName www\.example\.jp' }
end
You can test a file contains a given string within a given range.
describe file('Gemfile') do
# test 'rspec' exists between "group :test do" and "end".
it { should contain('rspec').from(/^group :test do/).to(/^end/) }
# test 'rspec' exists after "group :test do".
it { should contain('rspec').after(/^group :test do/) }
# test 'rspec' exists before "end".
it { should contain('rspec').before(/^end/) }
end
be_mode
In order to test a subject is set to given mode, you should use be_mode matcher.
Notice: be_mode, supports 3 and 4 number octet matching in the format ‘755’ and ‘2755’
describe file('/etc/sudoers') do
it { should be_mode 440 }
end
be_owned_by
In order to test a subject is owned by a given user, you should use be_owned_by matcher.
describe file('/etc/sudoers') do
it { should be_owned_by 'root' }
end
be_grouped_into
In order to test a subject is grouped into a given group, you should use be_grouped_into matcher.
describe file('/etc/sudoers') do
it { should be_grouped_into 'wheel' }
end
be_linked_to
In order to test a subject is linked to a given file or directory, you should use be_linked_to matcher.
describe file('/etc/system-release') do
it { should be_linked_to '/etc/redhat-release' }
end
be_readable
In order to test a subject is readable, you should use be_readable matcher.
describe file('/etc/sudoers') do
it { should be_readable }
end
You can also test a subject is readable by owner, group members, others or a specific user.
describe file('/etc/sudoers') do
it { should be_readable.by('owner') }
it { should be_readable.by('group') }
it { should be_readable.by('others') }
it { should be_readable.by_user('apache') }
end
be_writable
In order to test a subject is writable, you should use be_writable matcher.
describe file('/etc/sudoers') do
it { should be_writable }
end
You can also test a subject is writable by owner, group members, others or a specific user.
describe file('/etc/sudoers') do
it { should be_writable.by('owner') }
it { should be_writable.by('group') }
it { should be_writable.by('others') }
it { should be_writable.by_user('apache') }
end
be_executable
In order to test a subject is executable, you should use be_executable matcher.
describe file('/etc/init.d/httpd') do
it { should be_executable }
end
You can also test a subject is executable by owner, group members, others or a specific user.
describe file('/etc/init.d/httpd') do
it { should be_executable.by('owner') }
it { should be_executable.by('group') }
it { should be_executable.by('others') }
it { should be_executable.by_user('httpd') }
end
be_immutable
In order to test a subject is immutable, you should use the be_immutable matcher.
describe file('/root/.ssh/authorized_keys') do
it { should be_immutable }
end
be_mounted
In order to test a directory is mounted, you should use be_mounted matcher.
describe file('/') do
it { should be_mounted }
end
You can also test a directory is mounted with correct attributes.
describe file('/') do
it { should be_mounted.with( :type => 'ext4' ) }
end
describe file('/') do
it { should be_mounted.with( :options => { :rw => true } ) }
end
describe file('/') do
it do
should be_mounted.only_with(
:device => '/dev/mapper/VolGroup-lv_root',
:type => 'ext4',
:options => {
:rw => true,
:mode => 620,
}
)
end
end
only_with needs all attributes of the mounted directory.
be_version
In order to test a file’s version using its metadata in Windows, you should use be_version matcher.
describe file('C:\\Windows\\System32\\wuapi.dll') do
it { should be_version('7.6.7600.256') }
end
its(:md5sum)
In order to test a file’s md5 checksum matches a given value, you should use its(:md5sum).
describe file('/etc/services') do
its(:md5sum) { should eq '35435ea447c19f0ea5ef971837ab9ced' }
end
its(:selinux_label)
In order to test a file’s SELinux label matches a given value, you should use its(:selinux_label).
describe file('/etc/services') do
its(:selinux_label) { should eq 'system_u:object_r:etc_t:s0' }
end
its(:sha256sum)
In order to test a file’s sha256 checksum matches a given value, you should use its(:sha256sum).
describe file('/etc/services') do
its(:sha256sum) { should eq 'a861c49e9a76d64d0a756e1c9125ae3aa6b88df3f814a51cecffd3e89cce6210' }
end
its(:size)
In order to test a file’s size matches a given value, you should use its(:size). The file size is passed as bytes.
describe file('/etc/services') do
its(:size) { should < 641021 }
end
its(:content_as_yaml)
In order to test YAML file’s contents match a given value, you should use its(:content_as_yaml).
describe file('example.yml') do
its(:content_as_yaml) { should include('foo' => include('bar' => 'hoge')) }
end
example.yml
---
foo:
bar: hoge
its(:content_as_json)
In order to test JSON file’s contents match a given value, you should use its(:content_as_json).
describe file('example.json') do
its(:content_as_json) { should include('foo' => include('bar' => 'hoge')) }
end
example.json
{
"foo": {
"bar": "hoge"
}
}
group
Group resource type.
exist
In order to test a group exists, you should use exist matcher.
describe group('wheel') do
it { should exist }
end
have_gid
In order to test a group have a given gid, you should use have_gid matcher.
describe group('root') do
it { should have_gid 0 }
end
host
Host resource type.
be_resolvable
In order to test a host is resolvable on the target host, you should use be_resolvable matcher.
describe host('serverspec.org') do
it { should be_resolvable }
end
describe host('serverspec.org') do
it { should be_resolvable.by('hosts') }
end
describe host('serverspec.org') do
it { should be_resolvable.by('dns') }
end
be_reachable
In order to test a given host is network reachable, you should use be_reachable matcher.
describe host('target.example.jp') do
# ping
it { should be_reachable }
# tcp port 22
it { should be_reachable.with( :port => 22 ) }
# set protocol explicitly
it { should be_reachable.with( :port => 22, :proto => 'tcp' ) }
# udp port 53
it { should be_reachable.with( :port => 53, :proto => 'udp' ) }
# timeout setting (default is 5 seconds)
it { should be_reachable.with( :port => 22, :proto => 'tcp', :timeout => 1 ) }
end
its(:ipaddress)
You can get the ipaddress of the host, and can use any matchers rspec supports to them.
describe host('example.jp') do
its(:ipaddress) { should eq '1.2.3.4' }
end
describe host('example.jp') do
its(:ipaddress) { should match /1\.2\.3\./ }
end
On a dualstack host this may return an IPv6 address, notably Linux. Use its(:ipv4_address) or its(:ipv6_address) described below to get the desired address format.
its(:ipv4_address)
Query the IPv4 ipaddress of a host and apply any rspec supported matchers.
describe host('example.jp') do
its(:ipv4_address) { should eq '1.2.3.4' }
end
describe host('example.jp') do
its(:ipv4_address) { should match /1\.2\.3\./ }
end
its(:ipv6_address)
Query the IPv6 ipaddress of a host and apply any rspec supported matchers.
describe host('example.jp') do
its(:ipv6_address) { should eq '2001:db8::1234' }
end
describe host('example.jp') do
its(:ipv6_address) { should match /2001:db8:.*/ }
end
iis_app_pool
IIS Application Pool resource type.
exists
In order to test that an IIS app pool exists, you should use exists matcher.
describe iis_app_pool('Default App Pool') do
it{ should exist }
end
have_dotnet_version
In order to test that an IIS app pool is using the correct .NET version, you should use have_dotnet_version matcher.
describe iis_app_pool('Default App Pool') do
it{ should have_dotnet_version('2.0') }
end
iis_website
IIS Website resource type.
exists
In order to test that an IIS website exists, you should use exists matcher.
describe iis_website('Default Website') do
it{ should exist }
end
enabled
In order to test that an IIS website is set to automatically start, you should use enabled matcher.
describe iis_website('Default Website') do
it{ should be_enabled }
end
running
In order to test that an IIS website is currently running, you should use running matcher.
describe iis_website('Default Website') do
it{ should be_running }
end
in_app_pool
In order to test that an IIS website is currently assigned to the correct Application Pool, you should use in_app_pool matcher.
describe iis_website('Default Website') do
it{ should be_in_app_pool('Default App Pool') }
end
have_physical_path
In order to test that an IIS website gets its files from the correct location, you should use have_physical_path matcher.
describe iis_website('Default Website') do
it{ should have_physical_path('C:\\inetpub\\www') }
end
interface
Network interface resource type.
exist
In order to test an interface exists, you should use exist matcher.
describe interface('eth0') do
it { should exist }
end
up
In order to test an interface is up, you should use be_up matcher.
describe interface('eth0') do
it { should be_up }
end
speed
In order to test the speed of network interface is set up correctly, you should use this syntax.
describe interface('eth0') do
its(:speed) { should eq 1000 }
end
have_ipv4_address
In order to test an interface has an IP address, you should use have_ipv4_address matcher.
describe interface('eth0') do
it { should have_ipv4_address("192.168.10.10") }
it { should have_ipv4_address("192.168.10.10/24") }
end
have_ipv6_address
In order to test an interface has an IPv6 address, you should use have_ipv6_address matcher.
describe interface('eth0') do
it { should have_ipv6_address("fe80::1") }
it { should have_ipv6_address("fd00::1/48") }
end
its(:ipv4_address)
Query the IPv4 ipaddress of an interface and apply any rspec supported matchers.
describe interface('eth0') do
its(:ipv4_address) { should eq '1.2.3.4/1' }
end
describe interface('eth0') do
its(:ipv4_address) { should match /1\.2\.3\./ }
end
its(:ipv6_address)
Query the IPv6 ipaddress of an interface and apply any rspec supported matchers.
describe interface('eth0') do
its(:ipv6_address) { should eq '2001:db8::1234/1' }
end
describe interface('eth0') do
its(:ipv6_address) { should match /2001:db8:.*/ }
end
ip6tables
Ip6tables resource type.
have_rule
In order to test ip6tables has a given rule, you should use have_rule matcher.
describe ip6tables do
it { should have_rule('-P INPUT ACCEPT') }
end
You can give a table name and a chain name like this.
describe ip6tables do
it { should have_rule('-P INPUT ACCEPT').with_table('mangle').with_chain('INPUT') }
end
ipfilter
Ipfilter resource type.
have_rule
In order to test ipfilter has a given rule, you should use have_rule matcher.
describe ipfilter do
it { should have_rule 'pass in quick on lo0 all' }
end
ipnat
Ipnat resource type.
have_rule
In order to test ipnat has a given rule, you should use have_rule matcher.
describe ipnat do
it { should have_rule 'map net1 192.168.0.0/24 -> 0.0.0.0/32' }
end
iptables
Iptables resource type.
have_rule
In order to test iptables has a given rule, you should use have_rule matcher.
describe iptables do
it { should have_rule('-P INPUT ACCEPT') }
end
You can give a table name and a chain name like this.
describe iptables do
it { should have_rule('-P INPUT ACCEPT').with_table('mangle').with_chain('INPUT') }
end
kernel_module
Kernel module resource type.
be_loaded
In order to test a given kernel module is loaded, you should use be_loaded matcher.
describe kernel_module('virtio_balloon') do
it { should be_loaded }
end
linux_audit_system
Allow checking the configuration of linux audit system via /sbin/auditctl. Suitable for server hardening.
be_running
To make sure that the audit system is running.
describe linux_audit_system do
it { should be_running }
end
be_enabled
To make sure that the audit system is enabled (mode ‘1’).
describe linux_audit_system do
it { should be_enabled }
end
rules
To check that audit system has a given auditing rule. Argument can be a string for equality comparison or a regular expression.
describe linux_audit_system do
its(:rules) { should include '-w /etc/audit/ -p wa' }
its(:rules) { should include '-w /var/lib/ -p wa' }
its(:rules) { should include %r!/var/lib/! }
its(:rules) { should_not include %r!/var/log! }
end
linux_kernel_parameter
Linux kernel parameter resource type.
You can test Linux kernel parameters like this.
describe 'Linux kernel parameters' do
context linux_kernel_parameter('net.ipv4.tcp_syncookies') do
its(:value) { should eq 1 }
end
context linux_kernel_parameter('kernel.shmall') do
its(:value) { should be >= 4294967296 }
end
context linux_kernel_parameter('kernel.shmmax') do
its(:value) { should be <= 68719476736 }
end
context linux_kernel_parameter('kernel.osrelease') do
its(:value) { should eq '2.6.32-131.0.15.el6.x86_64' }
end
context linux_kernel_parameter('net.ipv4.tcp_wmem') do
its(:value) { should match /4096\t16384\t4194304/ }
end
end
LXC
LXC(Linux Container) resource type.
You can test LXC like this.
describe lxc('ct01') do
it { should exist }
it { should be_running }
end
mail_alias
Mail alias resource type.
You can test mail aliases like this.
describe mail_alias('daemon') do
it { should be_aliased_to 'root' }
end
mysql_config
MySQL config resource type.
You can test MySQL config parameters like this.
describe 'MySQL config parameters' do
context mysql_config('innodb-buffer-pool-size') do
its(:value) { should > 100000000 }
end
context mysql_config('socket') do
its(:value) { should eq '/tmp/mysql.sock' }
end
end
package
Package resource type.
be_installed
In order to test a package is installed, you should use be_installed matcher.
describe package('httpd') do
it { should be_installed }
end
You can also test a given version of gem is installed.
describe package('jekyll') do
it { should be_installed.by('gem').with_version('0.12.1') }
end
Or to test a pip packge is installed.
describe package('requests') do
it { should be_installed.by('pip').with_version('2.18.1') }
end
php_config
PHP config resource type.
You can test PHP config parameters like this.
describe 'PHP config parameters' do
context php_config('default_mimetype') do
its(:value) { should eq 'text/html' }
end
context php_config('session.cache_expire') do
its(:value) { should eq 180 }
end
context php_config('mbstring.http_output_conv_mimetypes') do
its(:value) { should match /application/ }
end
end
You can also specify php.ini file to be used with php cli. You have just to pass :ini param with either a directory in which to look for php.ini, a path to php.ini file or custom INI file.
describe '[FPM] PHP config parameters' do
context php_config('display_errors', {:ini => '/etc/php/7.1/fpm/php.ini'}) do
its(:value) { should eq 1 }
end
end
port
Port resource type.
be_listening
In order to test a given port is listening, you should use be_listening matcher.
describe port(80) do
it { should be_listening }
end
You can also specify tcp, udp, tcp6, or udp6.
describe port(80) do
it { should be_listening.with('tcp') }
end
describe port(80) do
it { should be_listening.with('tcp6') }
end
describe port(53) do
it { should be_listening.with('udp') }
end
describe port(53) do
it { should be_listening.with('udp6') }
end
You can specify local binding address for port (this features requires gem 'serverspec', '~> 2.0.0.beta8').
describe port(80) do
it { should be_listening.on('127.0.0.1').with('tcp') }
end
ppa
PPA resource type.
exist
In order to test a given ppa repository exists, you should use exist matcher.
PPA resource type accepts both ppa:username/reponame and username/reponame style.
describe ppa('launchpad-username/ppa-name') do
it { should exist }
end
be_enabled
In order to test a given ppa repository is enabled, you should use be_enabled matcher.
describe ppa('launchpad-username/ppa-name') do
it { should be_enabled }
end
process
Process resource type.
You can test any process parameter available (such as user, group, args…) through the ps command like this:
describe process("memcached") do
its(:user) { should eq "memcached" }
its(:args) { should match /-c 32000\b/ }
end
For the complete list of available parameters, check the manual page
for ps(1), section Standard Format Specifiers. When several
processes match, only the parameters of the first one are available.
count
To check the number of processes running under a given name use the count attribute matcher.
describe process("rsyslogd") do
its(:count) { should eq 1 }
end
be_running
To check if a given process is running, you should use be_running matcher.
describe process("memcached") do
it { should be_running }
end
routing_table
Routing table resource type.
have_entry
In order to test a routing table has a given entry, you should use have_entry matcher.
describe routing_table do
it do
should have_entry(
:destination => '192.168.100.0/24',
:interface => 'eth1',
:gateway => '192.168.10.1',
)
end
end
selinux
SELinux resource type.
be_disabled, be_enforcing, be_permissive
In order to test SELinux is running in a given mode, you should use be_disabled, be_enforcing and be_permissive matchers.
# SELinux should be disabled
describe selinux do
it { should be_disabled }
end
# SELinux should be enforcing
describe selinux do
it { should be_enforcing }
end
# SELinux should be permissive
describe selinux do
it { should be_permissive }
end
To check if a given policy is used in permissive or enforcing mode append the with_policy matcher.
# SELinux should be enforcing with policy mls
describe selinux do
it { should be_enforcing.with_policy('mls') }
end
# SELinux should be permissive with policy targeted
describe selinux do
it { should be_permissive.with_policy('targeted') }
end
selinux_module
SELinux Module resource type.
be_enabled
In order to test if a SELinux module is enabled, the following syntax is used.
describe selinux_module('zebra') do
it { should be_enabled }
end
be_installed
To check if a given SELinux module is installed, the following syntax is used.
describe selinux_module('zebra') do
it { should be_installed }
end
To see if a given version of SELinux module is installed the with_version matcher is appended.
describe selinux_module('zebra') do
it { should be_installed.with_version('1.13.0') }
end
service
Service resource type.
be_enabled
In order to test a given service is enabled(automatically start when OS booting up), you should use be_enabled matcher.
describe service('ntpd') do
it { should be_enabled }
end
You can test a service is enabled with a given run level.(This works only with Red Hat and Debian family currently.)
describe service('ntpd') do
it { should be_enabled.with_level(3) }
end
be_installed
In order to test a given service is installed, you should use be_installed matcher.
Currently only supported in Windows
describe service('DNS Client') do
it { should be_installed }
end
be_running
In order to test a given service/process is running, you should use be_running matcher.
describe service('ntpd') do
it { should be_running }
end
You can test a given service/process is running under supervisor, upstart, systemd, and daemontools.
describe service('ntpd') do
it { should be_running.under('supervisor') }
end
describe service('ntpd') do
it { should be_running.under('upstart') }
end
describe service('ntpd') do
it { should be_running.under('systemd') }
end
describe service('ntpd') do
it { should be_running.under('daemontools') }
end
be_monitored_by
In order to test a service/process is monitored by a given software, you should use be_monitored_by matcher.
describe service('sshd') do
it { should be_monitored_by('monit') }
end
describe service('unicorn') do
it { should be_monitored_by('god') }
end
Should the monitor resource not match the service name the with_name matcher can be used override it.
describe service('tinc') do
it { should be_monitored_by('monit').with_name('tinc-myvpn') }
end
have_start_mode
In order to test a service’s startup mode is correct, you should use have_start_mode matcher.
Currently only supported in Windows
describe service('DNS Client') do
it { should have_start_mode('Manual') }
end
user
User resource type.
exist
In order to test a subject exists as a user, you should use exist matcher.
describe user('root') do
it { should exist }
end
belong_to_group
In order to test a user belongs to a given group, be it primary or secondary, use the belong_to_group matcher.
describe user('apache') do
it { should belong_to_group 'apache' }
end
belong_to_primary_group
In order to test a user’s primary group, use the belong_to_primary_group matcher.
describe user('apache') do
it { should belong_to_primary_group 'apache' }
end
have_uid
In order to test a user have a given uid, you should use have_uid matcher.
describe user('root') do
it { should have_uid 0 }
end
have_home_directory
In order to test a user have a given home directory, you should use have_home_directory matcher.
describe user('root') do
it { should have_home_directory '/root' }
end
have_login_shell
In order to test a user have a given login shell, you should use have_login_shell matcher.
describe user('root') do
it { should have_login_shell '/bin/bash' }
end
have_authorized_key
In order to test a have have a given authorized key, you should use have_authorized_key matcher.
describe user('root') do
it { should have_authorized_key 'ssh-rsa ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGH foo@bar.local' }
end
encrypted_password
To run tests against hashed passwords use the encrypted_password matcher.
Match a user without password.
describe user('nobody') do
its(:encrypted_password) { should match(/^.{0,2}$/) }
end
Ensure password is stored using a SHA-512 hash.
describe user('unicorn') do
its(:encrypted_password) { should match(/^\$6\$.{8}\$.{86}$/) }
end
minimum_days_between_password_change
In order to test the minimum days that a user is allowed to change their password use minimum_days_between_password_change matcher.
describe user('root') do
its(:minimum_days_between_password_change) { should eq 0 }
end
maximum_days_between_password_change
In order to test the maximum days that a user is allowed to change their password use maximum_days_between_password_change matcher.
describe user('root') do
its(:maximum_days_between_password_change) { should eq 99999 }
end
x509_certificate
x509_certificate resource type
be_certificate
In order to check whether a file is a certificate, use be_certificate matcher.
describe x509_certificate('some_cert.pem') do
it { should be_certificate }
end
be_valid
You can ensure that a certificate is valid at present moment using be_valid matcher.
describe x509_certificate('some_cert.pem') do
it { should be_valid }
end
validity_in_days
In order to ensure that a certificate is valid for a certain amount of days, use validity_in_days.
describe x509_certificate('some_cert.pem') do
its(:validity_in_days) { should_not be < 100 }
its(:validity_in_days) { should be >= 100 }
end
subject
In order to check the subject of a certificate, use:
describe x509_certificate('some_cert.pem') do
its(:subject) { should eq '/C=DE/O=What/OU=Ever/CN=Root CA' }
end
issuer
In order to check the issuer of a certificate, use:
describe x509_certificate('some_cert.pem') do
its(:issuer) { should match /O=What/ }
end
In order to check the email of a certificate, use:
describe x509_certificate('some_cert.pem') do
its(:email) { should be_empty }
end
have_purpose
Certificates can have purposes enabled or not, i.e. a certificate that may be used for client side SSL authentication. Check with have_purpose:
describe x509_certificate('some_cert.pem') do
it { should have_purpose 'SSL server CA' }
it { should_not have_purpose 'SSL server' }
end
keylength
In order to ensure that the key of a certificate has been generated with a certain key length, use the key_length matcher. It returns the key length as an integer, so it can be easily compared like:
describe x509_certificate('some_cert.pem') do
its(:keylength) { should be >= 2048 }
end
subject_alt_names
Subject alternative names of a certificate can be specified as the following:
describe x509_certificate('some_cert.pem') do
its(:subject_alt_names) { should include 'DNS:www.example.com' }
end
x509_private_key
x509_private_key resource type
be_encrypted
Checks if given file contains an encryption signature:
describe x509_private_key('/my/private/server-key.pem') do
it { should_not be_encrypted }
end
be_valid
In order to check key integrity.
describe x509_private_key('/my/private/server-key.pem') do
it { should be_valid }
end
have_matching_certificate
In order to ensure that the private key modulus is equal to modulus of given certificate, that is, certificate has been created from key.
describe x509_private_key('/my/private/server-key.pem') do
it { should have_matching_certificate('/my/certs/server-cert.pem') }
end
windows_feature
Windows Feature resource type.
installed
In order to test that a windows feature has been installed, you should use installed matcher.
describe windows_feature('Minesweeper') do
it{ should be_installed }
end
You can optionally specify the method used to check the windows feature, as the same feature can have different names.
describe windows_feature('IIS-Webserver') do
it{ should be_installed.by("dism") }
end
describe windows_feature('Web-Webserver') do
it{ should be_installed.by("powershell") }
end
windows_registry_key
Windows Registry Key resource type.
Matchers that reference the data type of the registry key will accept any of the following identifiers;
- :type_string
- :type_binary
- :type_dword
- :type_qword
- :type_multistring
- :type_expandstring
exist
In order to test that a key exists in the registry, you should use exist matcher.
describe windows_registry_key('HKEY_USERS\S-1-5-21\Test MyKey') do
it { should exist }
end
have_property
In order to test a registry key contains a specific property, you should use the have_property matcher.
describe windows_registry_key('HKEY_USERS\S-1-5-21\Test MyKey') do
it { should have_property('string value') }
it { should have_property('binary value', :type_binary) }
it { should have_property('dword value', :type_dword) }
end
have_value
In order to test that a registry key property has the correct value, you should use the have_value matcher.
describe windows_registry_key('HKEY_USERS\S-1-5-21\Test MyKey') do
it { should have_value('test default data') }
end
have_property_value
In order to test that a registry key property has the correct value and data type, you should use the have_property_value matcher.
describe windows_registry_key('HKEY_USERS\S-1-5-21\Test MyKey') do
it { should have_property_value('multistring value', :type_multistring, "test\nmulti\nstring\ndata") }
it { should have_property_value('qword value', :type_qword, 'adff32') }
it { should have_property_value('binary value', :type_binary, 'dfa0f066') }
end
yumrepo
Yumrepo resource type.
exist
In order to test a given yum repository exists, you should use exist matcher.
describe yumrepo('epel') do
it { should exist }
end
be_enabled
In order to test a given yum repository is enabled, you should use be_enabled matcher.
describe yumrepo('epel') do
it { should be_enabled }
end
zfs
ZFS resource type.
exist
In order to test a given zfs pool exists, you should use exist matcher.
describe zfs('rpool') do
it { should exist }
end
have_property
In order to test a zfs pool has given properties, you should use have_property matcher.
describe zfs('rpool') do
it { should have_property 'mountpoint' => '/rpool', 'compression' => 'off' }
end
