serverspecのリソースタイプ・マッチャー

More than 5 years have passed since last update.

--

注意 ここでは、 expect シンタックスのかわりにshouldシンタックスを採用します。読みやすいのと、個人的な好みのためです。

expect シンタックスの使用は推奨される方法です。すべてのobjectにshouldをつけると、BasicObjectのサブクラス化されたプロキシオブジェクトで使われるときに、失敗を引き起こすからです。

しかし、このページの例で使われているワンライナー構文では、いかなるオブジェクトに対しても should を付け加えていないので、上記のような問題を引き起こしません。これがワンライナー should シンタックスを採用した理由です。

もしこの問題について知らないのであれば、rspec-expectationsのドキュメントをご覧ください。

--

すべてのリソースタイプに対して、be_fileの代わりにbe_a_fileのように、より厳格な文法のシンタックスを使用することができます。

--


cgroup

Linux cgroup リソースタイプ

このようにcgroupの引数をテストできます。

describe cgroup('group1') do

its('cpuset.cpus') { should eq 1 }
end

--


command

Command リソースタイプ


return_stdout

コマンドが正常に標準出力を返しているかテストするためには、return_stdoutマッチャーを使うべきです。

describe command('whoami') do

it { should return_stdout 'root' }
end

正規表現も使えます。

describe command('cat /etc/resolv.conf') do

it { should return_stdout /8\.8\.8\.8/ }
end


return_stderr

コマンドが正常に標準エラーを返しているかテストするためには、return_stderrマッチャーを使うべきです。

describe command('ls /foo') do

it { should return_stderr 'ls: /foo: No such file or directory' }
end

正規表現も使えます。

describe command('ls /foo') do

it { should return_stderr /No such file or directory/ }
end


return_exit_status

コマンドが正常にexitステータスを返しているかテストするためには、return_exit_statusマッチャーを使うべきです。

describe command('ls /tmp') do

it { should return_exit_status 0 }
end


its(:stdout), its(:stderr)

標準出力と標準エラーが取得でき、rspecがサポートしているどちらのマッチャーも使えます。

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

--


cron

Cron リソースタイプ


have_entry

cronに指定したエントリが存在しているかテストするためには、have_entryを使うべきです。

describe cron do

it { should have_entry '* * * * * /usr/local/bin/foo' }
end

このように、特定のユーザーのcronのエントリをテストすることもできます。

describe cron do

it { should have_entry('* * * * * /usr/local/bin/foo').with_user('mizzy') }
end

--


default_gateway

Default gateway リソースタイプ

デフォルトゲートウェイが正常にセットアップしているかテストするためには、このシンタックスを使うべきです。

describe default_gateway do

its(:ipaddress) { should eq '192.168.10.1' }
its(:interface) { should eq 'br0' }
end

--


file

File and directory リソースタイプ


be_file

対象がファイルとして存在するかテストするためには、use be_fileマッチャーを使うべきです。

describe file('/etc/passwd') do

it { should be_file }
end


be_directory

対象がディレクトリとして存在するかテストするためにはbe_directoryマッチャーを使うべきです。

describe file('/var/log/httpd') do

it { should be_directory }
end


be_socket

対象がソケットとして存在するかテストするためにはbe_scoketマッチャーを使うべきです。

describe file('/var/run/unicorn.sock') do

it { should be_socket }
end


contain

注意: containの代わりに、its(:content)や、任意の標準的なrspecのマッチャーが使えます。

このcontainマッチャーは廃止予定です。

describe file('/etc/httpd/conf/httpd.conf') do

its(:content) { should match /ServerName www.example.jp/ }
end

ファイルの中身に与えられた文字列が含まれているかテストするためには、containマッチャーが使えます。

describe file('/etc/httpd/conf/httpd.conf') do

it { should contain 'ServerName www.example.jp' }
end

範囲を指定してファイルに文字列が含まれているかテストすることもできます。

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

対象が与えられたモードに設定されているかテストするためには、be_modeマッチャーを使うべきです。

describe file('/etc/sudoers') do

it { should be_mode 440 }
end


be_owned_by

対象が与えられたユーザーに所有されているかテストするためには、be_owned_byマッチャーを使うべきです。

describe file('/etc/sudoers') do

it { should be_owned_by 'root' }
end


be_grouped_into

対象が与えられたグループに所属しているかテストするためには、be_grouped_intoマッチャーを使うべきです。

describe file('/etc/sudoers') do

it { should be_grouped_into 'wheel' }
end


be_linked_to

対象が与えられたファイルやディレクトリにリンクしているかテストするためには、be_linked_toマッチャーを使うべきです。

describe file('/etc/system-release') do

it { should be_linked_to '/etc/redhat-release' }
end


be_readable

対象が読み込み可能かテストするためには、be_readableマッチャーを使うべきです。

describe file('/etc/sudoers') do

it { should be_readable }
end

所有者、グループメンバー、他人、あるいは特定のユーザーが読み込み可能かテストすることもできます。

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

対象が書き込み可能かテストするためには、be_writableマッチャーを使うべきです。

describe file('/etc/sudoers') do

it { should be_writable }
end

所有者、グループメンバー、他人、あるいは特定のユーザーが書き込み可能かテストすることもできます。

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

対象が実行可能かテストするためには、be_executableマッチャーを使うべきです。

describe file('/etc/init.d/httpd') do

it { should be_executable }
end

所有者、グループメンバー、他人、あるいは特定のユーザーが実行可能かテストすることもできます。

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_mounted

ディレクトリがマウントされているかテストするためには、be_mountedマッチャーを使うべきです。

describe file('/') do

it { should be_mounted }
end

正しい属性でマウントしているかもテストできます。

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 はマウントされたディレクトリのすべての属性を必要とします。


match_md5checksum

ファイルのmd5チェックサムが与えられた値と一致するかテストするためには、match_md5checksumマッチャーを使うべきです。

describe file('/etc/services') do

it { should match_md5checksum '35435ea447c19f0ea5ef971837ab9ced' }
end

--


group

Group リソースタイプ


exist

グループが存在するかテストするためには、existマッチャーを使うべきです。

describe group('wheel') do

it { should exist }
end


have_gid

グループが与えられたgidを持っているかテストするためには、have_gidマッチャーを使うべきです。

describe group('root') do

it { should have_gid 0 }
end

--


host

Host リソースタイプ


be_resolvable

ホストが目的のホストで名前解決可能かテストするためには、be_resolvableマッチャーを使うべきです。

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

与えられたホストがネットワーク的に到達可能かテストするためには、be_reachableマッチャーを使うべきです。

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

--


interface

Network interface リソースタイプ

ネットワークインタフェースが正常にセットアップしているかテストするためには、このシンタックスを使うべきです。

describe interface('eth0') do

its(:speed) { should eq 1000 }
end


have_ipv4_address

インタフェースがIPアドレスを持っているかテストするためには、have_ipv4_addressマッチャーを使うべきです。

describe interface('eth0') do

it { should have_ipv4_address("192.168.10.10") }
it { should have_ipv4_address("192.168.10.10/24") }
end

--


ipfilter

Ipfilter リソースタイプ


have_rule

ipfilterが与えられたルールを持っているかテストするためには、have_ruleマッチャーを使うべきです。

describe ipfilter do

it { should have_rule 'pass in quick on lo0 all' }
end

--


ipnat

Ipnat リソースタイプ


have_rule

ipnatが与えられたルールを持っているかテストするためには、have_ruleマッチャーを使うべきです。

describe ipnat do

it { should have_rule 'map net1 192.168.0.0/24 -> 0.0.0.0/32' }
end

--


iptables

Iptables リソースタイプ


have_rule

iptablesが与えられたルールを持っているかテストするために、have_ruleマッチャーを使うべきです。

describe iptables do

it { should have_rule('-P INPUT ACCEPT') }
end

テーブル名とチェイン名を与えることができます。

describe iptables do

it { should have_rule('-P INPUT ACCEPT').with_table('mangle').with_chain('INPUT') }
end

--


kernel_module

Kernel module リソースタイプ


be_loaded

与えられたカーネルモジュールがロードされているかテストするためには、be_loadedマッチャーを使うべきです。

describe kernel_module('virtio_balloon') do

it { should be_loaded }
end

--


linux_kernel_parameter

Linux kernel parameter リソースタイプ

このようにLinuxカーネルのパラメータをテストできます。

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) リソースタイプ

このようにLXCをテストできます。

describe lxc('ct01') do

it { should exist }
it { should be_running }
end

--


mail_alias

Mail alias リソースタイプ

このようにメールエイリアスをテストできます。

describe mail_alias('daemon') do

it { should be_aliased_to 'root' }
end

--


package

Package リソースタイプ


be_installed

パッケージがインストールされているかテストするためには、be_installedマッチャーを使うべきです。

describe package('httpd') do

it { should be_installed }
end

与えられたバージョンのgemがインストールされているかもテストできます。

describe package('jekyll') do

it { should be_installed.by('gem').with_version('0.12.1') }
end

--


php_config

PHP config リソースタイプ

このようにPHPの設定パラメータをテストできます。

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

--


port

Port リソースタイプ


be_listening

与えられたポートがリッスン状態かテストするためには、be_listeningマッチャーを使うべきです。

describe port(80) do

it { should be_listening }
end

tcp または udp を指定することもできます。

describe port(80) do

it { should be_listening.with('tcp') }
end

describe port(53) do
it { should be_listening.with('udp') }
end

--


routing_table

Routing table リソースタイプ


have_entry

ルーティングテーブルに与えられたエントリがあるかテストするためには、have_entryマッチャーを使うべきです。

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 リソースタイプ


be_disabled/be_enforcing/be_permissive

SELinuxが与えられたモードかテストするためには、be_disabled、be_enforcing、be_permissinveマッチャーを使うべきです。

# 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

--


service

Service リソースタイプ


be_enabled

サービスがenabled(OS起動時に自動で起動)かテストするためには、be_enabledマッチャーを使うべきです。

describe service('ntpd') do

it { should be_enabled }
end

ランレベルでテスト可能です。(現在はRed Hat系かDebian系でのみ機能します。)

describe service('ntpd') do

it { should be_enabled.with_level(3) }
end


be_running

与えられたサービスやプロセスが起動中かテストするためには、be_runningマッチャーを使うべきです。

describe service('ntpd') do

it { should be_running }
end

supervisorの下でサービスやプロセスが起動中かテストできます。

describe service('ntpd') do

it { should be_running.under('supervisor') }
end


be_monitored_by

サービスやプロセスが与えられたソフトウェアによって監視されているかテストするためには、be_monitored_byマッチャーを使うべきです。

describe service('sshd') do

it { should be_monitored_by('monit') }
end

describe service('unicorn') do
it { should be_monitored_by('god') }
end

--


user

User リソースタイプ


exist

対象がユーザーとして存在するかテストするためには、existマッチャーを使うべきです。

describe user('root') do

it { should exist }
end


belong_to_group

ユーザーが与えられたグループに所属しているかテストするためには、belong_to_groupマッチャーを使うべきです。

describe user('apache') do

it { should belong_to_group 'apache' }
end


have_uid

ユーザーが与えられたuidを持っているかテストするためには、have_uidマッチャーを使うべきです。

describe user('root') do

it { should have_uid 0 }
end


have_home_directory

ユーザーが与えられたホームディレクトリを持っているかテストするためには、have_home_directoryマッチャーを使うべきです。

describe user('root') do

it { should have_home_directory '/root' }
end


have_login_shell

ユーザーが与えられたログインシェルを持っているかテストするためには、have_login_shellマッチャーを使うべきです。

describe user('root') do

it { should have_login_shell '/bin/bash' }
end


have_authorized_key

ユーザーが与えられたauthorized_keyを持っているかテストするためには、have_authorized_keyマッチャーを使うべきです。

describe user('root') do

it { should have_authorized_key 'ssh-rsa ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGH foo@bar.local' }
end

--


yumrepo

Yumrepo リソースタイプ


exist

与えられたyumのリポジトリが存在するかテストするためには、existマッチャーを使うべきです。

describe yumrepo('epel') do

it { should exist }
end


be_enabled

与えられたyumのリポジトリが使用可能かテストするためには、be_enabledマッチャーを使うべきです。

describe yumrepo('epel') do

it { should be_enabled }
end

--


zfs

ZFS リソースタイプ


exist

与えられたZFSストレージプールが存在するかテストするためには、existマッチャーを使うべきです。

describe zfs('rpool') do

it { should exist }
end


have_property

ZFSストレージプールが与えられた属性を持つかテストするためには、have_propertyマッチャーを使うべきです。

describe zfs('rpool') do

it { should have_property 'mountpoint' => '/rpool', 'compression' => 'off' }
end