最近はChef-Severの導入も簡単になりました。 パッケージから導入はもちろん、aws marketplaceからすぐ使用できたりと。

とはいえテスト環境にChef-Serverを強いるのも大変なので、Chef-Zeroで代わりをしてもよいでしょう。

Chef-zero

Chef-zeroはChef-Serverのホットモックのようなものです。ほぼChef-Serverとして動作する小さなプロセスですが次の特徴があります。

  • 認証はするフリで全部OK
  • データはメモリに保存、永続化なし

Chef-Serverを使ったCookbookの開発をする際に、データをクリアしたい場合もありますが意外と後処理が面倒です。 Chef-zeroならプロセスのリスタートで綺麗な状態になるので、knifeで必要な要素を戻すだけで再度テストを行なうことができます。

詳細は次のリンクが参考になります。

VagrantでChef-zero

ではChef-zeroのプロセスをどこに立てるか。test-kitchenではCookbookをテストするVMで直接Chef-zeroを起動して、ダミーのChef要素を入れることができますが、現時点ではそのままシームレスにChef-Server環境に持って行こうとするにはいまいち感があります。

じゃあVagrantだろうなということで、一式書いてリポジトリに登録しました。

Vagrant with Chef-Zero
Vagrant with Chef-Zero

これならvagrant up chefzeroするだけでChef-zeroをほぼChef-Serverとして使い放題です。

chefzeroのVMだけはChef-Soloで構築しますが、ほかのVMはChef-zeroに対するChef-ClientとしてProvisioningすることができます。

最初は手元だけ直して、Cookbookのアップロードを忘れることもありますが、すぐ慣れるでしょう。

通常操作はknifeを使えるので、他の環境に持っていく際にknife.rb指定の切り替えで済むのが助かりますね。

開発作業用のRakefile

レシピ開発&テストを効率よく行なうには、とりあえずRakeのタスクを作っておくとよいです。

task :default => 'upload'
$stdin.sync = true

desc 'upload chef-repos to chefzero vm'
task :upload do
  system('knife cookbook upload --all')
  system('knife upload environments/ ')
  system('knife upload roles/ ')
end

desc 'reset chefzero'
task :reset do
  system('vagrant reload chefzero')
  Rake::Task['chefzero:upload'].invoke
end

それぞれこんな作業をやらせています。

rake upload # Chef要素のアップロード
rake reset  # Chef-zero内容クリア&要素の再アップロード

その他

ちなみにvagrant-chefzeroというプラグインもあり、これはEnvやRole要素の投入までVagrantファイル内でやるようです。

knifeを使わないのが逆に気になるので今回はCookbookでChef-zeroをセットアップしてます。