chef の role name と role ファイル名は同じにしなくてはならない
検証した環境は chef 11.16.4 ですが、
後述の通り、12-stable(2015/01/15 現在) でも同様の問題が発生すると思います。
$ cat roles/hoge_hoge.json { "name": "hoge-hoge", ... } $ cat nodes/hoge.json { ... "run_list": [ "role[hoge-hoge]" ] }
ぱっと見わかりづらいと思いますので、補足しますと、
のような環境で chef を実行したところ、
ERROR: Role hoge-hoge (included by 'top level') is in the runlist but does not exist. Skipping expand. Chef::Exceptions::MissingRole: The expanded run list includes nonexistent roles
といったエラーがでました。
role はあるのに role が無いかのようなエラーがでます。
解決策
以下のソースを読んでみると原因が分かりました。
https://github.com/opscode/chef/blob/11-stable/lib/chef/role.rb#L239-240
run_list に "role[hoge-hoge]" と指定している role 名でファイルを検索するので、
role name と role のファイル名は同じにしなくてはならないようです。
ファイル名と role name を統一したら正常に動作しました。
12-stable でもソースはほとんど同じようなので、
同様の挙動になると思います。
https://github.com/opscode/chef/blob/12-stable/lib/chef/role.rb#L239-L240
まとめ
chef-client local-mode や chef-solo 環境では、
role name と role ファイル名を同じにしましょう。