Packerで作ったイメージにserverspecでテストしたい
PackerとAnsibleを実行してAMIを作るビルドジョブを用意していました。
このジョブの最後の処理でserverspecを噛まして、テストを流し込みたい。
背景
Ansibleは確かにロール単位で見るととてもシンプルでテスト不要だなぁというのは感じるところだけど、ロールを組み合わせてプロビジョニングしていると、あれとこれの組み合わせでこう動いてくれるよね?っていう確認はやっぱり必要なわけ。
例えば、nginx -> APP serverの疎通確認とか。
そんな観点のテストにserverspec流して自動化してしまおうというのが事の発端。
※この記事を書いた時にやっていた事を思い出しながら書いてます。
Packer with serverspec
先にディレクトリ構成とpacker.jsonを記載する。
ディレクトリ構成
├── packer.json
├── provisioners
├── scripts
│ ├── serverspec.sh
├── serverspec
│ ├── Gemfile
│ ├── Gemfile.lock
│ ├── Rakefile
│ └── spec
│ └── AMI-TYPE
│ └── hoge_spec.rb
│ └── spec_helper.rb
└── variables
└── packer.json
packer.json
{
"type": "ansible-local"
},
{
"type": "file",
"source": "serverspec",
"destination": "/tmp"
},
{
"type": "shell",
"execute_command": "sh {{ .Path }} -t AMI-TYPE-A",
"script": "{{user `script_dir`}}/serverspec.sh"
},
どう動かしているのか
Ansibleのプロビジョニングが完了したら、serverspecをプロビジョニング先のマシンで実行しています。
流れはこんな感じ。
- Ansibleのプロビジョニング実行
-
serverspec
ディレクトリを丸ごとプロビジョニング先のマシンへ転送 - serverspec実行シェルを起動
Packerでゴールデンイメージを作っているのですが、くそ時間がかかるのでAMIを分割して作成していく方式を取っているため、AMI-TYPE
なんていうものを用意しています。
serverspec.sh
の中身はごくごくシンプルで、bundle install
とbundle exec rake spec:hoge
を実行しているだけです。
こんな感じで簡単にserverspecを連携させることが出来るので、滅茶苦茶楽出来ましたとさ。
実際運用させてみて
楽だし安心感ある。
ゴールデンイメージ運用しているから、各コミットの安全性が担保されるのは良い、自信を持ってリリースが出来ます。