tkuchikiの日記

新ブログ https://blog.tkuchiki.net

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]" ]
}

ぱっと見わかりづらいと思いますので、補足しますと、

  • ファイル名: hoge_hoge(アンダースコア)
  • role name: 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 ファイル名を同じにしましょう。