Serverspec ハンズオン資料（事前準備編）


## メニュー

### 本ハンズオンのゴール

- Serverspec の各種バックエンドを試してみます
- Docker バックエンドを利用して Dockerfile のテストを作成し、テストを行います
- Infrataster を利用して Web サイトの振る舞いのテストを行います
- おまけで Jenkins を利用してテスト、Docker Hub へのコンテナイメージの自動化も行います

### 注意

- 資料の見方
- 事前準備について
- 資料内で紹介する各種ツールのバージョンについて
- 後片付けはしっかりと

### 参考資料

- 参考 URL
- 参考書籍
- ハンズオン資料
- ハンズオン教材

### 1. 事前準備

1.1. Serverspec を実行する仮想マシンを用意する
1.2. 仮想マシンに Ruby をインストールする
1.3. 仮想マシンに Serverspec をインストールする
1.4. 仮想マシンに Docker Engine をインストールする
1.5. 構成の確認

***

## 本ハンズオンのゴール

- Serverspec で提供される各種バックエンドを試してみます
- Docker バックエンドを利用して Dockerfile のテストを作成し、テストを行います
- Infrataster を利用して Web サイトの振る舞いのテストを行います

***

## 注意

### 資料の見方

以下、実行するコマンドの表示です。

~~~sh:command
# コメントです

# ハンズオン内で実行するコマンドです（コピー＆ペーストで貼り付けて利用して下さい）
command "foo" "bar"
~~~

以下、出力例の表示です。

~~~sh:output
# コマンドの実行後の出力例です
foo
bar
~~~

上記に実行例と異なる出力を確認した場合にはお声がけ下さい。

### 事前準備について

- ハンズオンを円滑に進めるにあたって事前準備は出来るだけ行うようにして下さい

### 資料内で紹介する各種ツールのバージョンについて

資料内で紹介する各種ツールのバージョンは以下の通りです。

- OS

~~~sh:output
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 14.04.4 LTS
Release:        14.04
Codename:       trusty
~~~

- Ruby

~~~sh:output
$ ruby -v
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-linux]
~~~

- Serverspec

~~~sh:output
$ bundle exec gem list | grep serverspec
serverspec (2.36.0)
~~~

- Infrataster

~~~sh:output
$ bundle exec gem list | grep infrataster
infrataster (0.3.2)
~~~

- Docker Engine

~~~sh:output
$ docker version
Client:
 Version:      1.11.2
 API version:  1.23
 Go version:   go1.5.4
 Git commit:   b9f10c9
 Built:        Wed Jun  1 21:47:50 2016
 OS/Arch:      linux/amd64

Server:
 Version:      1.11.2
 API version:  1.23
 Go version:   go1.5.4
 Git commit:   b9f10c9
 Built:        Wed Jun  1 21:47:50 2016
 OS/Arch:      linux/amd64
~~~

### 後片付けはしっかりと

本日作成した仮想マシンはハンズオン終了後、不要であれば削除しておきましょう。

***

## 参考資料

### 参考 URL

- http://serverspec.org/

### 参考書籍

- http://www.oreilly.co.jp/books/9784873117096/

### ハンズオン資料

- [Serverspec ハンズオン資料（事前準備編）](http://qiita.com/inokappa/private/43bb47745b3565b9b69f)※本資料です
- [Serverspec ハンズオン資料（実践編）
](http://qiita.com/inokappa/private/f96c0939331b24236bc0)
- [Serverspec ハンズオン資料（Jenkins おじさんお届け編）](http://qiita.com/inokappa/private/f9f624ec5ea01937b840)

### ハンズオン教材

- https://github.com/inokappa/handson-serverspec

***

## 1. 事前準備

### 概要

1-1. Serverspec を実行する仮想マシンを用意する
1-2. 作成した仮想マシンに Ruby をインストールする
1-3. 作成した仮想マシンに Serverspec をインストールする
1-4. 作成した仮想マシンに Docker Engine をインストールする
1-5. 構成

### 1.1. Serverspec を実行する仮想マシンを用意する

#### 1.1.1. 仮想マシンを用意する

Serverspec を動かす仮想マシンを Ubuntu Serve 14.04 LTS 64bit で作成しておきましょう。

| 環境 | AMI ID / イメージ名 / Vagrant Box | 参考手順 |
|:---|:---|:---|
| AWS | ami-a21529cc | [体育会系 Amazon EC2 を Vagrant 経由で起動する手順](http://qiita.com/inokappa/private/25a98ca152850e373f02) |
| IDCF Cloud | Ubuntu Serve 14.04 LTS 64bit | [体育会系 IDCF Cloud の仮想マシンを Vagrant 経由で起動する手順](http://qiita.com/inokappa/private/1e184f28d48178817bbc) |
| ローカルマシン | ubuntu/trusty64 | `vagrant init ubuntu/trusty64; vagrant up --provider virtualbox` |

上記の何れかの構成でセットアップされた仮想マシンを前提にハンズオンを進めます。

#### 1.1.2. 作成した仮想マシンに SSH でログイン出来るようにしておく

- 作成した仮想マシンに事前に SSH でログイン出来ることを確認しておきましょう

#### 1.1.3. 作成した仮想マシンに HTTP でアクセス出来るようにしておく

- 作成した仮想マシンに事前に HTTP でアクセス出来ることを確認しておきましょう

### 1.2. 作成した仮想マシンに Ruby をインストールする

#### 1.2.1. rbenv をインストールする

作成した仮想マシンにログインして以下のコマンドを実行する。

~~~sh:command
#
# 備考：idcf クラウドを利用していて root にてログインしている場合には sudo を付ける必要はありません
#

# apt-get update を実行する
sudo apt-get update

# Ruby のインストールに必要なパッケージを事前にインストールする
sudo apt-get install -y autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm3 libgdbm-dev git

# rbenv を git clone する
git clone https://github.com/rbenv/rbenv.git ~/.rbenv

# Ruby をビルドする為に必要な ruby-build を git clone する
git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build

# rbenv へのパスを通す
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile

# rbenv を初期化する
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

# rbenv を利用する為に .bash_profile の再読み込みを行う
source ~/.bash_profile
~~~

以下のコマンドを実行して rbenv のバージョンを確認する。

~~~sh:command
# rbenv のバージョンを確認する
rbenv --version
~~~

以下のように出力されることを確認する。

~~~sh:output
#
# 備考：バージョン番号に差異があるかもしれません
#

rbenv 1.0.0-21-g9fdce5d
~~~

以下のコマンドを実行して rbenv のサブコマンドを確認する。

~~~sh:command
rbenv
~~~

以下のように出力されることを確認する。

~~~sh:output
rbenv 1.0.0-21-g9fdce5d
Usage: rbenv <command> [<args>]

Some useful rbenv commands are:
   commands    List all available rbenv commands
   local       Set or show the local application-specific Ruby version
   global      Set or show the global Ruby version
   shell       Set or show the shell-specific Ruby version
   install     Install a Ruby version using ruby-build
   uninstall   Uninstall a specific Ruby version
   rehash      Rehash rbenv shims (run this after installing executables)
   version     Show the current Ruby version and its origin
   versions    List all Ruby versions available to rbenv
   which       Display the full path to an executable
   whence      List all Ruby versions that contain the given executable

See `rbenv help <command>' for information on a specific command.
For full documentation, see: https://github.com/rbenv/rbenv#readme
~~~

`install` のサブコマンドが利用可能であるか確認する。

#### 1.2.2. rbenv を利用して Ruby をインストールする

以下のコマンドを実行して Ruby 2.3.1 をインストールする。

~~~sh:command
rbenv install -v 2.3.1
~~~

ビルドに暫く時間が掛かるのでビールでも呑んで待機しておく。

インストールが終了したら以下のコマンドを実行して Ruby 2.3.1 が利用出来るようにしておく。

~~~sh:command
rbenv global 2.3.1
~~~

以下のコマンドを実行して Ruby のバージョンを確認する。

~~~sh:command
ruby -v
~~~

以下のように出力されることを確認する。

~~~sh:output
#
# 備考：リビジョン番号に差異があるかもしれません
#

ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-linux]
~~~

#### 1.2.3. bundler をインストールする

以下のコマンドを実行して bundler をインストールする。

~~~sh:command
gem install bundler --no-ri --no-rdoc -V
~~~

以下のように出力されることを確認する。

~~~sh:output
(snip)

Successfully installed bundler-1.12.5
1 gem installed
~~~

### 1.3. 作成した仮想マシンに Serverspec と Infrataster をインストールする

#### 1.3.1. 教材を git clone する

以下のコマンドを実行して教材を `git clone` する。

~~~sh:command
git clone https://github.com/inokappa/handson-serverspec.git
~~~

#### 1.3.2. budler を利用して Serverspec と Infrataster をインストールする

以下のコマンドを実行して Serverspec と Infrataster をインストールする。

~~~sh:command
cd handson-serverspec
bundle install --path vendor/bundle
~~~

以下のように出力されることを確認する。

~~~sh:outout
(snip)

Bundle complete! 4 Gemfile dependencies, 39 gems now installed.
Bundled gems are installed into ./vendor/bundler.
~~~

以下のコマンドを実行して Servespec と Infrataster がインストールされていることを確認する。

~~~sh:command
bundle exec gem list | egrep 'serverspec|infrataster'
~~~

以下のように出力されることを確認する。

~~~sh:output
#
# 備考：バージョン番号に差異があるかもしれません
#

infrataster (0.3.2)
serverspec (2.36.0)
~~~

### 1.4. 作成した仮想マシンに Docker Engine をインストールする

#### 1.4.1. 以下のコマンドを順番に実行する

~~~sh:command
#
# 備考：idcf クラウドを利用していて root にてログインしている場合には sudo を付ける必要はありません
#
sudo apt-get -y install apt-transport-https ca-certificates unzip
sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
sudo sh -c 'echo "deb https://apt.dockerproject.org/repo ubuntu-trusty main" > /etc/apt/sources.list.d/docker.list'
sudo apt-get update
sudo apt-get -y install docker-engine
~~~

#### 1.4.2. インストールされたことを以下のコマンドを実行して確認する

~~~sh:command
sudo docker version
~~~

以下のように出力されることを確認する。

~~~sh:output
Client:
 Version:      1.11.2
 API version:  1.23
 Go version:   go1.5.4
 Git commit:   b9f10c9
 Built:        Wed Jun  1 21:47:50 2016
 OS/Arch:      linux/amd64

Server:
 Version:      1.11.2
 API version:  1.23
 Go version:   go1.5.4
 Git commit:   b9f10c9
 Built:        Wed Jun  1 21:47:50 2016
 OS/Arch:      linux/amd64
~~~

#### 1.4.3. ユーザー権限で docker コマンドを利用出来るようにもうひと手間加える

※ idcf クラウドを利用していて root にてログインしている場合には本ステップは実施する必要はありません

~~~sh:command
sudo usermod -aG docker ${USER}
id ${USER}
~~~

以下のように出力されることを確認する。

~~~sh:output
#
# vagrant で試した例です
#

uid=1000(vagrant) gid=1000(vagrant) groups=1000(vagrant),999(docker)
~~~

一度、SSH からログアウトします。

#### 1.4.5. 再びログインして docker のバージョンを確認する

~~~sh:command
docker version
~~~

以下のように出力されることを確認する。

~~~sh:output
Client:
 Version:      1.11.2
 API version:  1.23
 Go version:   go1.5.4
 Git commit:   b9f10c9
 Built:        Wed Jun  1 21:47:50 2016
 OS/Arch:      linux/amd64

Server:
 Version:      1.11.2
 API version:  1.23
 Go version:   go1.5.4
 Git commit:   b9f10c9
 Built:        Wed Jun  1 21:47:50 2016
 OS/Arch:      linux/amd64
~~~

### 1.5. 構成の確認

#### 1.5.1. 構成図

事前準備が完了すると以下のような構成が利用可能な状態となっている。

![2016061901.png](https://qiita-image-store.s3.amazonaws.com/0/87189/6f21e282-9725-9b9b-a43a-b4dcd0d4aec9.png "2016061901.png")

#### 1.5.2. Serverspec でテスト

以下のコマンドを実行して準備した構成をテストする。

~~~sh:command
cd ~/handson-serverspec/
bundle exec rspec spec/local_exec_spec.rb
~~~

以下のように出力されることを確認する。

~~~sh:output
OS のバージョンは Ubuntu 14.04 であることを確認する
  Command "lsb_release -a"
    stdout
      should match /Ubuntu 14.04/

docker-engine がインストールされていることを確認する
  Package "docker-engine"
    should be installed

docker-engine 起動していること / docker のバージョンを確認する
  Service "docker"
    should be running
  Command "docker version"
    stdout
      should match /1.11.2/

Ruby や servespec / infrataster がインストールされていることを確認する
  インストールされている Ruby のバージョンは 2.3.1 である
  Serverspec がインストールされている
  Infrataster がインストールされている

Finished in 0.8244 seconds (files took 0.7915 seconds to load)
7 examples, 0 failures
~~~

実際の出力画面は以下のように表示される。

![2016062501.png](https://qiita-image-store.s3.amazonaws.com/0/87189/9e0ca5f3-eab7-2494-b154-4cf293d3595b.png "2016062501.png")

上図のように出力されれば事前準備は完了となる。

「[Serverspec ハンズオン資料（実践編）](http://qiita.com/inokappa/items/f96c0939331b24236bc0)」に続く...