Serverspec on AWS 入門

AWS上でServerspecを試してみた。

* EC2インスタンスを2台作成(t2.micro,OSはAmazonLinux)
 * ここではServerspec実行側のEC2をserver01,Serverspecでテストされる側のEC2をserver02とします。
* server01のEC2のSecuretyGroupは以下の様な感じで設定を追加(FTP用),左からType,Protocol,PortRange,Source

```
Custom TCP Rule TCP 21 0.0.0.0/0
Custom TCP Rule TCP 60000 - 60010 0.0.0.0/0
```

* ec2-userでserver01にSSHログイン
* 既にgemとRubyはインストールされているのですが一応確認

```
ruby -v
gem -v
```

* 足りないモジュールを追加

```
sudo su -
yum update
yum vsftpd
gem install rake
gem install serverspec
```


* FTPファイルアップロードの為に以下を実行

```
useradd ftpuser

passwd ftpuser
New UNIX password: *********
Retype new UNIX password: *********
passwd: all authentication tokens updated successfully

service vsftpd start
```

* SSH鍵を以下のパスにFTPでアップロード

```
/root/.ssh/
mv {アップロードしたSSHKeyのファイル名} serverspec
```

* SSHログイン情報を記載したファイル作成

```
vi /root/.ssh/config
```

```/root/.ssh/config
Host server02
  HostName {server02のPrivateIPsを記載}
  Port 22
  User ec2-user
  IdentityFile ~/.ssh/serverspec-key
```

* Serverspecディレクトリを作成したいパスに移動後、Serverspecコード生成

```
mkdir /etc/severspec
cd /etc/severspec
serverspec-init

Select OS type:

  1) UN*X
  2) Windows

Select number: 1

Select a backend type:

  1) SSH
  2) Exec (local)

Select number: 1

Vagrant instance y/n: n
Input target host name: server02
 + spec/
 + spec/server02/
 + spec/server02/httpd_spec.rb
 + spec/spec_helper.rb
 + Rakefile

[root@XXX.XX.XX.XX serverspec]# ls -l
total 8
-rw-r--r-- 1 root root  148 Aug 19 21:24 Rakefile
drwxr-xr-x 3 root root 4096 Aug 19 21:24 spec


```

* 以下の通りにファイルを編集
/etc/serverspec/spec/spec_helper.rb

```ruby:spec_helper.rb

require 'serverspec'
require 'pathname'
require 'net/ssh'

include SpecInfra::Helper::Ssh
include SpecInfra::Helper::DetectOS

RSpec.configure do |c|
  if ENV['ASK_SUDO_PASSWORD']
    require 'highline/import'
    c.sudo_password = ask("Enter sudo password: ") { |q| q.echo = false }
  else
    c.sudo_password = ENV['SUDO_PASSWORD']
  end
  c.before :all do
    block = self.class.metadata[:example_group_block]
    if RUBY_VERSION.start_with?('1.8')
      file = block.to_s.match(/.*@(.*):[0-9]+>/)[1]
    else
      file = block.source_location.first
    end
    host  = File.basename(Pathname.new(file).dirname)
    if c.host != host
      c.ssh.close if c.ssh
      c.host  = host
      options = Net::SSH::Config.for(c.host)
      user    = options[:user] || Etc.getlogin
      c.ssh   = Net::SSH.start(host, user, options)

      c.request_pty = true　★★★ この一行を追記する! ★★★

    end
  end
end
```

※上記設定を入れないとServerspec実行時に以下のエラーメッセージが出力される。

```
Please set "SpecInfra.configuration.request_pty = true" or "c.request_pty = true" in your spec_helper.rb or other appropriate file.
```


* 一応以下にテスト内容が記載されているファイルがあることを確認
/etc/serverspec/spec/server02/httpd_spec.rb

```ruby:httpd_spec.rb
require 'spec_helper'

describe package('httpd') do
  it { should be_installed }
end

describe service('httpd') do
  it { should be_enabled   }
  it { should be_running   }
end

describe port(80) do
  it { should be_listening }
end

describe file('/etc/httpd/conf/httpd.conf') do
  it { should be_file }
  its(:content) { should match /ServerName server02/ }
end
```


これでserver01側の設定はOK。


* 続いて、server02にSSHログイン(ec2-user)
* 以下のコマンドを実行

```
sudo yum install httpd
sudo service httpd start
```

これですべての準備OK、あとはテストを実行するだけ

* server01で以下のコマンド実行
```
rake spec
```