代表的な構成管理ツールの1つであるItamaeを用いることで、シンプルにサーバを開発することができます。 この記事では、VagrantServerspecを用いて、開発〜テストまでを行なう手順について解説します。

動作環境

この記事で解説する内容は、以下のバージョンにて動作を確認しています。

開発の流れ

Itamaeを用いて開発を行なう流れは次のとおりです。 環境を構築する手順についても、以下にしたがって説明していきます。

  1. Itamaeでインフラを開発する
  2. Vagrant(仮想環境)に適用する
  3. Serverspecでテストする

ディレクトリ構成

今回は、例として「ユーザを作成する」ための手順を書いていきます。 その際のディレクトリ構成は、以下のようになります。

$ tree
.
├── Gemfile
├── Gemfile.lock
├── Rakefile
├── Vagrantfile
├── cookbooks
│   └── user
│       └── default.rb
├── nodes
│   └── development.json
├── roles
│   └── web.rb
└── spec
    ├── default
    │   └── user_spec.rb
    └── spec_helper.rb

手順

1. インストールする

まず、必要なGemをインストールします。 bundle initでGemfileを作成した後で以下を追記し、bundle installします。

Gemfile:

gem 'itamae'
gem 'itamae-secrets' # 機密情報を管理する場合
gem 'serverspec'

2. レシピを実装する

今回は、例として「ユーザを作成する」レシピを実装します。 以下にしたがってファイルを作成します。

cookbooks/user/default.rb:

user node[:user][:id] do
  action :create
end

nodes/development.json:

{
  "user": {
    "id": "kami"
  }
}

roles/web.rb:

recipes = %w(
  user
)

recipes.each do |recipe|
  include_recipe "../cookbooks/#{recipe}/default.rb"
end

3. Vagrantの準備をする

Vagrantを立ち上げるための設定ファイルを作成します(Vagrant自体の導入は省略します)。

以下のコマンドで、CentOS 6.7のボックスを指定したVagrantfileを生成します。 ファイルの修正は特に必要ありません。

$ vagrant init bento/centos-6.7

4. Vagrantを立ち上げる

以下のコマンドで、Vagrantを立ち上げます。

$ vagrant up

5. Itamaeを適用する

それでは、実装したレシピをVagrantに適用します。 以下のコマンドで適用できます。

$ bundle exec itamae ssh --vagrant -j nodes/development.json roles/web.rb

6. テストの準備をする

まず、Serverspecを実行するための初期設定を行ないます。 serverspec-initコマンドを実行し、以下に従って入力します。

$ 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: y
Auto-configure Vagrant from Vagrantfile? y/n: y

上記コマンドを実行すると、いくつかのファイルが生成されます。

7. テストを書く

今回は例としてユーザを追加しましたので、「正しくユーザが作成されたかどうか」をテストします。 Serverspecのリソース一覧に従って、以下のように実装します。

spec/default/user_spec.rb:

require 'spec_helper'

describe user('kami') do
  it { should exist }
end

8. テストを実行する

それではテストを実行してみます。 rake specコマンドでテストを実行します。

$ rake spec
User "kami"
  should exist

Finished in 0.43756 seconds (files took 6.04 seconds to load)
1 example, 0 failures

9. .gitignoreを更新する

Vagrantを立ち上げると、.vagrantというディレクトリが作成されます。 これをGitに含めないよう設定しておきます。

.gitignore:

/.vagrant

備考

機密情報を管理する

Itamaeでパスワードなどの機密情報を管理する場合、itamae-secretsを利用します。 決して生の情報をリポジトリに含めないよう注意しましょう。

レシピを試行錯誤する

ItamaeとVagrantで試行錯誤しながらレシピを開発する場合、Saharaというプラグインが便利です。 ひとことでいうと、レシピを適用する前の状態を保存し、いつでもその状態にロールバックできます。

Itamaeで開発する際は、ぜひ導入しましょう。

おわりに

Itamaeを用いてサーバを一度開発しておくことで、いろんなシーンで活用できると思います。 インフラ開発の際は、ぜひ参考にしてみてください。