Berkshelf を使っていると、knife solo cook 実行時に berks install (git clone 相当) && berks vendor (どこかに cp) && rsync が走って遅い。
recipe の単体動作確認をしたいだけなのに、knife solo cook やっていると日が暮れるので、レシピを単体で動作確認できる方法を調べた。
1. chef-apply
chef に chef-apply というコマンドが同梱されている。
これを使うと recipe ファイルを指定して、そのレシピだけを実行できるようだ。
chef-apply {recipe_file}
便利!と思ったが、どうも色々機能が足りない。
- -j JSON_ATTRIBS オプションがなく attributes 指定できない (プルリク送った)
- template 展開できない
- cookbook_path 指定ができない (他の cookbook に依存している recipe の実行ができない)
この辺の機能が必要でないなら、chef 同梱なので手軽に使えそうではある。
2. sandwich
sandwich という gem がある。基本的には chef-apply とやっていることは同じなのだが、こちらは template 展開ができる。
sandwich {recipe_file}
attributes 指定のオプションに関しては、プルリク を送って使えるようになった。why-run もできなかったのだが、できるようになった。
ただ、こちらも cookbook_path 指定ができない。
FYI: どうも実装を読む限り、レシピをファイル名で指定できるようにするため、cookbook をチートしていたりするようだ。指定できるようにするのはちょっと困難かもしれない。
3. chef-solo
chef-solo でも実行できる(結局、戻って来た感)。
chef-solo -o {run_list}
レシピファイル名指定ではなくて、run_list 指定なので、recipe[cookbook_name::recipe_name]
とか recipe_name
のような書式指定になる。cf. run_list 書式大全。シェルのファイル名補完が利かなくてちょっといらっとするが、これでレシピを単体実行できる。
cookbook_path は solo.rb を作成して、
cookbook_path %w(vendor/cookbooks ..).map {|path| File.expand_path(path) }
$ chef-solo -c solo.rb -o {run_list}
のようにして指定できるので berks install 先のディレクトリに合わせて指定すればよい。cf. Chef - berks install 先のディレクトリを指定する
もちろん template 展開もできるし、-j JSON_ATTRIBS オプションもある。
run_list の補完は利かないが、一番紛れがないかもしれない。