その属性に適切なデフォルトがない場合に、テンプレートなどのリソースで属性を使用するための推奨されるアプローチは何ですか。属性値は実行時に提供されることが期待されます。そうでない場合、シェフのレシピの実行はエラーになります。
テンプレートに適用したときの属性値は空の文字列です。
/recipes/default.rb
template "/var/tmp/my_script.sh" do
source "my_script.erb"
mode "0755"
variables({
:url => node['environment']['url']
})
end
/templates/default/my_script.erb
#!/bin/bash
echo "The url is: <%= @url %>"
結果の/var/tmp/my_script.shファイルは次のようになります。
#!/bin/bash
echo "The url is: "
しかし、私はそれがただエラーになることを望みます。何かアドバイス?
指摘すべきことが1つあります-ifnode['environment']
がまったく設定されていないため、例はそのまま失敗します。これが私が得た出力です:
[Tue, 16 Oct 2012 02:40:31 +0000] INFO: Starting Chef Run for vagrant.int.housepub.org
[Tue, 16 Oct 2012 02:40:31 +0000] INFO: Running start handlers
[Tue, 16 Oct 2012 02:40:31 +0000] INFO: Start handlers complete.
[Tue, 16 Oct 2012 02:40:31 +0000] ERROR: Running exception handlers
[Tue, 16 Oct 2012 02:40:31 +0000] ERROR: Exception handlers complete
[Tue, 16 Oct 2012 02:40:31 +0000] FATAL: Stacktrace dumped to /tmp/vagrant-chef-1/chef-stacktrace.out
[Tue, 16 Oct 2012 02:10:38 +0000] FATAL: NoMethodError: undefined method `[]' for nil:NilClass
しかし、それはあまり役に立ちませんし、必ずしも十分ではありません。おそらく、属性の追加の検証を行いたいと思うでしょう。その場合、次のようなものをレシピに入れることができます。
unless node['environment']['url'] && node['environment']['url'].size > 5
Chef::Application.fatal!("The URL attribute isn't long enough.")
end
これで、Chefの実行により、失敗したときにさらに役立つメッセージが表示されます。
[Tue, 16 Oct 2012 02:41:36 +0000] INFO: Starting Chef Run for vagrant.int.housepub.org
[Tue, 16 Oct 2012 02:41:36 +0000] INFO: Running start handlers
[Tue, 16 Oct 2012 02:41:36 +0000] INFO: Start handlers complete.
[Tue, 16 Oct 2012 02:41:36 +0000] FATAL: The URL attribute isn't long enough.
[Tue, 16 Oct 2012 02:41:36 +0000] ERROR: Running exception handlers
[Tue, 16 Oct 2012 02:41:36 +0000] ERROR: Exception handlers complete