没有要求的属性的默认值

在资源中使用属性(如模板)时,如果没有合理的默认值,build议使用哪种方法。 期望属性值在运行时提供。 如果不是,厨师食谱执行应该是错误的。

现在我有东西的方式应用到模板的属性值是空string。

/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: " 

但是,我希望它只是错误。 任何build议?

有一件事要指出 – 如果node['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 

但这不是很有帮助,而且还不够。 也许你想要做一些额外的属性validation。 在这种情况下,你可以在你的食谱中join这样的东西:

 unless node['environment']['url'] && node['environment']['url'].size > 5 Chef::Application.fatal!("The URL attribute isn't long enough.") end 

现在,Chef run会在失败时给你一个更有帮助的信息:

 [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