Serverspecのインストールと利用

aws-devops-fig
  • Serverspecとは
    • rubyで書かれたサーバの状態をテストするテストフレームワーク
    • (参考) シナリオテストの検証を実施した環境:sakura-vps @CentOS release 6.7 (Final)
  • インストール

$ sudo gem install serverspec
  • serverspecの初期化
$ serverspec-init
--- 
Select OS type:
  1) UN*X
  2) Windows
Select number: 1  ←テスト対象サーバのOS種別を選択
Select a backend type:
  1) SSH
  2) Exec (local)
Select number: 1  ←テスト実行のタイプを選択
Vagrant instance y/n: n ←Vagrantの管理下のインスタンスかどうかを選択
Input target host name: server-01 ←テスト対象サーバのホスト名を入力
 + spec/
 + spec/server-01/
 + spec/server-01/httpd_spec.rb
 + spec/spec_helper.rb
 + Rakefile
---

  • spec/spec_helper.rb:Serverspecを使ってテストを実行する際のテスト設定などを記述
  • spec/<target_host>/<test_name>_spec.rb:テストスクリプト本体. この_spec.rbにテストを書いていく
  • デフォルトで下記のsample_spec.rbが置かれている

[sample_spec.rb]

require 'spec_helper'

describe package('httpd'), :if => os[:family] == 'redhat' do
  it { should be_installed }
end

describe package('apache2'), :if => os[:family] == 'ubuntu' do
  it { should be_installed }
end

describe service('httpd'), :if => os[:family] == 'redhat' do
  it { should be_enabled }
  it { should be_running }
end

describe service('apache2'), :if => os[:family] == 'ubuntu' do
  it { should be_enabled }
  it { should be_running }
end

describe service('org.apache.httpd'), :if => os[:family] == 'darwin' do
  it { should be_enabled }
  it { should be_running }
end

describe port(80) do
  it { should be_listening }
end
[確認したテスト]
  • service
    • should be_enabled
    • should be_running
    • should_not be_enabled
    • should_not be_running
  • package
    • should be_installed
    • should be_installed.with_version(‘X.X.X’)
    • should be_installed.by(‘gem’).with_version(‘X.X.X’)
  • port
    • should be_listening
    • should be_listening.with(‘tcp’)
  • command
    • :exit_status
    • :stdout
    • should match
    • should eq
  • host
    • should be_reachable
    • should be_resolvable
  • file
    • should be_executable
    • should contain
    • should exist
    • should be_directory
  • default_gateway
    • :interface
    • :ipaddress
  • interface
    • should exist
    • should be_up
    • should have_ipv4_address
  • cron
    • should have_entry
  • selinux
    • should be_disabled
    • shoudl be_enforcing
    • should be_permissive
  • user
    • should have_home_directory
    • should have_login_shell
  • yumrepo
    • should exist
    • should be_enabled
  • (routing_table)

  • (monitored_by)

[_spec.rb]

require 'spec_helper'

# サービスが起動&自動起動設定されているかを確認
describe service('nginx') do
  it { should be_enabled }
  it { should be_running }
end

# iptablesが止まっていることを確認
describe service('iptables') do
  it { should_not be_running }
  it { should_not be_enabled }
end

# packageがインストールされているか確認
describe package('python') do
 it { should be_installed }
end

# gemとして指定のバージョンがインストールされているか確認
describe package('bundler') do
  it { should be_installed.by('gem').with_version('1.11.2') }
end

# インストールしたパッケージのバージョン確認
describe package('nginx') do
  it { should be_installed.with_version('1.8.1')}
end

# ポートがListenしているかを確認
describe port(80) do
  it { should be_listening}
  it { should be_listening.with('tcp') }
end

# コマンドを使って確認
describe command('which perl') do
  its(:exit_status){should eq 0}
end

# dnsの確認
describe command('cat /etc/resolv.conf') do
  its(:stdout) { should match /X.X.X.X/ }
end

# ユーザの確認
describe command('whoami') do
  its(:stdout) { should eq "root\n" }
end

# インストールされているrubyのバージョンを確認
describe command('ruby -v') do
  its(:stdout) { should match /ruby 2\.3\.0p0/ }
end

# リーチャビリティのテスト
describe host('8.8.8.8') do
  it { should be_reachable}
end

# 名前解決のテスト
describe host('www.google.com') do
  it { should be_resolvable}
end

# デフォゲのテスト
describe default_gateway do
  its(:interface) { should eq 'eth0'}
  its(:ipaddress) { should eq 'X.X.X.X'}
end

# 実行可能かテスト
describe file('/etc/init.d/nginx') do
  it { should be_executable}
end

# config設定の確認テスト
describe file('/etc/nginx/conf.d/default.conf') do
  it { should contain 'server_name localhost'}
end

# ディレクトリが存在するか
describe file('/var/log/nginx') do
  it { should exist}
  it { should be_directory }
end

# インターフェースの確認
describe interface('eth0') do
  it { should exist }
  it { should be_up }
  it { should have_ipv4_address('X.X.X.X') }
end

# selinuxの状態確認
describe selinux do
  it { should be_disabled}
#  it { should be_enforcing }
#  it { should be_permissive }
end

describe cron do
  it { should have_entry '< $cron -l で出力されるものを書く>' }
end

# ホームディレクトリがあるか確認
describe user('root') do
  it { should have_home_directory '/root' }
end

# ログインシェルの確認
describe user('root') do
  it { should have_login_shell '/bin/bash' }
end

# yum-repoの確認
describe yumrepo('epel') do
  it { should exist}
  it { should be_enabled}
end
  • serverspecを実行する
# rake spec