Packer with ChefでProdとDev環境でIdenticalなイメージをビルドする方法
開発環境としてVirtualbox(Vagrant)を用いてmac上で開発を行い、本番環境ではEC2を使うことを考えています。できることならば、本番環境と開発環境を同じにしたいと誰もが思っていると思います(殴り書き図参照)。 Packerのフロントページに書いてあるようにPackerを使う事ででできそうです:)
Packer is a tool for creating identical machine images for multiple platforms from a single source configuration
*ちなみに私はamiイメージを手元に作れるかと思ってドキュメントを読んでいましたが違うようですね。(It's not exactly identicalな気がしますが。。)
一連の流れは下記のようになります。
- packer用のjsonに複数のBuilderを書く
- Image作成に必要なスクリプトをprovisionerに追加
- cookbookを作る
- 両方に適用するchecf-soloのprovisionerを追加
- packer build!!
https://github.com/shoheik/packerにのってます
では、一つずつ見ていきましょう。
1. packer用jsonに複数のBuilderを書く
Builderに複数のエントリ(ここでは1つはamazonでもう1つはvirtualbox)を書く
2. Image作成に必要なスクリプトをprovisionerに追加
$ ls provisioners/
base.sh cleanup.sh vagrant.sh virtualbox.sh
どのImageかによってやらなければいけないことが少し違うので必要に応じてprovisionerディレクトリ以下にスクリプトを配置します。jsonの中のprovisionerでonlyを指定する
3. cookbookを作る
cookbookを作ります。 Berkshelfを使うと簡単ですね。
$ gem install berkshelf
$ cat > Berksfile
site :opscode
cookbook 'mysql'
^C
$ berks install --path=./cookbooks
4. 両方に適用するchecf-soloのprovisionerを追加
onlyを指定しないことで両方に適用されます。
{
"type": "chef-solo",
"cookbook_paths": ["./cookbooks/"],
"run_list": ["mysql", "memcached"]
}
5. packer build!!
$ packer build packer.json
Immutable Infrastructureに一歩近づいた気もしますね。
Food fight showのMitchellさんが登場した 回ではpacker.json自体を自動生成している会社もあるって言ってましたね(そのためにjsonをコンフィグに選んだとも言ってます)。システムの規模に応じて、chefのエントリを書き換えるスクリプトを書けばタイプ別のImage作成もできますね。 サーバを起動してからchefを適応するよりも時間を短縮できるのでCloudを使っている人はpackerを選択肢にいれるのもありだと思います。
ようやく最近のテクノロジーに追いついた感があります^^