とりあえず、berks updateしてみる
最新版だと直っている可能性もあるので、最新版を試してみる。
$ chef exec berks update
それでもダメなら
デバッグ方針
エラー文を注意深く読んで、まずはエラーが出ているRecipeを突き止める。
その後、どこまでは期待通りに動いているのか可能な限り絞り込んでいく。外部のリソースだろうがローカルに保存して書き換えるくらいの心意気が大事。
テスト環境構築
ChefDKをサクッと入れておきます
https://downloads.chef.io/chef-dk/
これで、test-kitchenを使ってテストができます。使い方は公式ドキュメントにお任せして割愛。
一部のcookbookだけ差し替える
差し替え方法
問題のcookbookをローカルに保存します。
git cloneしてくるも良し、berks vendorしてからmvするも良し。
そして、Berksfile
を開き、cookbookの参照先をローカルパスに差し替えます。
# Berksfile
cookbook 'buggy_cookbook', path: '/path/to/cookbook'
GitHub上でForkしてgit urlをfork先のものに変える方法もありますが、ローカルで書き換えた方が圧倒的に早いので、pathで指定することをお勧めします。
念のため、再現できるか確認。
$ chef exec kitchen test
無事再現した場合は、思う存分デバッグコードを仕込みます。
デバッグ方法
Log Level Debug
ChefのログレベルをDEBUGにして、情報を増やしてみる。
$ chef exec kitchen test -l debug
log
古き良きprintデバッグ。実行時の値をチェックしたいのでlazy付けます。付けないと、コンパイル時に評価されてしまいます。
# recipes/xxx.rb
log 'check variable' do
command lazy { "Value is #{SOME_VARIABLE}" }
end
remote_file -> cookbook_file
例えremote_fileだろうが、wgetしてローカルで書き換えます。filesディレクトリに保存しておけば、recipeから参照しやすくなります。
$ wget -o files/default/yyy.sh http://example.com/yyy.sh
remote_fileの代わりにfiles下のファイルを指定するために、cookbook_fileメソッドに書き換えます。
$ git diff
-remote_file '/usr/local/src/yyy.sh' do
- source 'http://example.com/yyy.sh'
+cookbook_file '/usr/local/src/yyy.sh' do
+ source 'yyy.sh'
Shell Scriptなら、set -xでデバッグフラグ立てておくと変数の値等が見れて役立ちます。
kitchen login
インスタンスの中に乗り込んで、現状を調査します。
$ chef exec kitchen login