[Chef]Attributesのキーはシンボルでも文字列でもどっちでもいける

Vagrant + ChefSoloを使ってるとき、NodeオブジェクトのAttributesのキー名をシンボルにするのか文字列にするのか混乱していたのですが、検証してみたらどっちでもいけることがわかりました。
文字列 - 文字列
Vagrantfile
chef.json = {"myhostname" => "example.com" }
テンプレートファイル
HOSTNAME=<%= node["myhostname"] %>
シンボル - 文字列
Vagrantfile
chef.json = {:myhostname => "example.com" }
テンプレートファイル
HOSTNAME=<%= node["myhostname"] %>
文字列 - シンボル
Vagrantfile
chef.json = {"myhostname" => "example.com" }
テンプレートファイル
HOSTNAME=<%= node[:myhostname] %>
シンボル - シンボル
Vagrantfile
chef.json = {:myhostname => "example.com" }
テンプレートファイル
HOSTNAME=<%= node[:myhostname] %>

なぜこれで動くのか?

推測ですが、Vagrantfileのchef.jsonの方は一度JSONに変換されるので、その時にRubyで書いたシンボルがJSの文字列に変換されるのだと思います。

一方、template側でなぜシンボル・文字列が同じように扱えるのかはわかりませんでした><
これがChefの仕様なのかな?
カテゴリ:

人気記事