okochangの馬鹿でありがとう

ふらふら適当に世間を生きる日々でございます

Packer、Vagrant、Chef Soloで構築した環境をserverspecでテストする

こんにちは、@oko_changです。
伊藤直也さんのブログにあるこちらの記事は読んでいたのですが、自分でもう少し整理したかったので今回はその内容を残しておきます。

構成

OSXに以下のツールをインストールしてありま、レシピの適用とテスト先のサーバがAWS上のEC2インスタンスといって感じです。

  • Packer
  • Vagrant
  • Chef SoloやJenkins

また、今回の内容はこちらのリポジトリにまとめておきました。

環境構築

Packer

今回の環境はAWS Market Placeで配布されているCentOS公式のAMIを使う予定です。
このAMIはsudo実行時にttyが必要となるので、Packerを使ってこの辺の設定や最低限の設定をします。
Packerの使い方はとても簡単ですし、少し前のエントリで簡単な使い方をまとめましたのでこちらでは省略します。

Vagrant

次はVagrantvagrant-awsのインストールですが、こちらも以前のエントリでまとめています。
今回はOSXですので、Vagrantそのものはインストーラーを使って簡単にインストールが終わります。

$ vagrant plugin install vagrant-aws
$ vagrant box add centos https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box

実作業

リポジトリの初期化

リポジトリ初期化ついでにknifeコマンドでChefリポジトリのテンプレートを作成します。

$ knife solo init serverci.okochang.com 
$ cd serverci.okochang.com
$ touch README.md
bundle

今回の作業で必要となるソフトウェアを管理するためにGemfileを作成します。
最終的にjenkinsでテストするのでci_reporterが必要。

$ bundle init
$ vi Gemfile
$ bundle install --path vendor/bundle

Packer

まずは最初にPackerを使って基本となるAMIを作成しておきます。
ここで使ったjsonファイルもリポジトリにあげています。

$ vi packer.json
$ packer build packer.json
==> Builds finished. The artifacts of successful builds are:
--> amazon-ebs: AMIs were created:
 
ap-northeast-1: ami-b5c0b1b4

Vagrant

次に先ほど作成されたAMIから起動するVagrantfileを作成&更新をします。
Packerのjsonファイルと同様にVagrantfileもリポジトリにアップしています。

$ vagrant init centos
$ vi Vagrantfile

serverspec

次にserverspecのテストを作りますので、初期化します。

$ bundle exec 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: n
Input vagrant instance name: serverci.okochang.com
 + spec/
 + spec/serverci.okochang.com/
 + spec/serverci.okochang.com/httpd_spec.rb
 + spec/spec_helper.rb
 + Rakefile

最終的にci_reporterで出力を出すための設定を追記しておきます。

$ vi Rakefile

テストコードも忘れずにアップデートします。

$ vi spec/default/httpd_spec.rb
chef

次に今回のサーバ構築に使用するChefのレシピを作成します。

$ bundle exec knife cookbook create httpd -o site-cookbooks
$ vi site-cookbooks/httpd/recipes/default.rb
$ vi site-cookbooks/httpd/templates/default/httpd.conf.erb    
$ vi nodes/serverci.okochang.com.json

テスト実行

あとは以下のようにvagrant upしてプロビジョニングとテストを実行します。
テストが終わったら忘れずに環境を削除しておきます。
※[fog][WARNING] Unable to load the 'unf' gem.のエラー、unfを入れても解決出来てなくて強引にsedで回避しているのなんとかしなきゃ。

$ vagrant up --provider aws 
$ vagrant ssh-config --host=serverci.okochang.com > vagrant-ssh.conf
$ sed -i -e "1d" vagrant-ssh.conf
$ bundle exec knife solo bootstrap serverci.okochang.com -F vagrant-ssh.conf 
$ bundle exec rake spec 
$ rm vagrant-ssh.conf
$ vagrant destroy serverci.okochang.com

残りの作業

Jenkinsでテストを自動化するところのまとめ