[Vagrant][Chef] vagrant provisionよりknife solo cookするべき

 config.vm.provision :chef_solo do |chef|
    chef.cookbooks_path = [ "./cookbooks", "./site-cookbooks" ]
    chef.roles_path = "./roles"
    chef.add_role  "hoge"
    chef.add_recipe  "fuga"
    chef.json = {
       "apache" => {
         "listen_address" => "0.0.0.0"
       }
     }  end
しかしちょっと待ってください。
この方法、何かおかしいと思いませんか?
  • ここに書いた設定はknife solo cookでは呼び出せない。
  • これをデータセンター上の本番サーバに適用しようと思ったら、node/server.jsonのようなファイルを作ってJSONで書きなおす必要がある。
  • vagrantに対してknife solo cookしたいときもある
  • JSONデータをわざわざRubyで書くのが苦痛

したがって、knife solo cookしようと思ったら nodes/vagrant.jsonのようなファイルを作って上記と同じような情報をJSONで定義する必要があります。
nodes/vagrant.json
{
  "run_list" : ["role[hoge]", "recipe[fuga]"],
  "apache" : {...}
}
しかしこれはDRYではありません。
しかも本来JSONで記述するべき情報を、わざわざRubyのDSLで書くのは無駄に学習コストが上がるだけです。
また大きな問題点として、vagrant provision ばかり使っているとknife solo cookコマンドの使い方がなかなか身につかないというデメリットがあります。

よりよいやり方

学習コストの観点からは、Vagrant環境であってもknife solo cookでプロビジョンした方がよいでしょう。
vagrant ssh-config --host=tmphost > sshconfig
knife solo cook -F sshconfig tmphost nodes/vagrant.json
このようにすれば、vagrant.jsonに記述したrun_listやらattributesやらをそのまま使うことができます。
本番サーバにプロビジョンするときは nodes/honban.json などというファイルを用意してあげればよいですね。

Happy Provisioning!
カテゴリ: