LoginSignup
22
22

More than 5 years have passed since last update.

chef の recipe を単体実行する3つの方法

Last updated at Posted at 2015-01-14

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}

便利!と思ったが、どうも色々機能が足りない。

  1. -j JSON_ATTRIBS オプションがなく attributes 指定できない (プルリク送った)
  2. template 展開できない
  3. 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 を作成して、

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 の補完は利かないが、一番紛れがないかもしれない。

22
22
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
22