厨师LW资源属性默认值如何引用另一个属性?

Ric*_*lls 5 ruby chef-infra lwrp

我正在尝试将一个资源属性的默认值设置为另一个属性的值.

我正在为我正在构建的tomcat cookbook定义一个具有以下定义的资源.我想拥有可以独立设置的"name"和"service_name"属性.如果未设置服务名称,我希望它默认为"name"提供的任何内容.

以下不能像我期望的那样工作:

attribute :name,         :kind_of => String, :required => true, :name_attribute => true
attribute :service_name, :kind_of => String, :default => :name
Run Code Online (Sandbox Code Playgroud)

注意第二行末尾的":default =>:name".当我在配方中的新块中引用我的资源时

my_tomcat "install tomcat" do
  name "foo_bar"
end
Run Code Online (Sandbox Code Playgroud)

属性值被指定为

 name = "foo_bar"
 service_name = "name"
Run Code Online (Sandbox Code Playgroud)

这不是我的预期.除非明确设置,否则我希望service_name为"foo_bar".

我试过了

attribute :service_name, :kind_of => String, :default => new_resource.name
attribute :service_name, :kind_of => String, :default => @new_resource.name
Run Code Online (Sandbox Code Playgroud)

但那些不编译.

有没有办法做我想做的事情?

set*_*rgo 8

由于这些是类级方法,因此您需要使用以下lazy属性:

attribute :service_name, kind_of: String, default: lazy { |r| r.name }
Run Code Online (Sandbox Code Playgroud)

值得注意的是:

attribute :name, kind_of: String, required: true, name_attribute: true
Run Code Online (Sandbox Code Playgroud)

完全是多余的.那是默认的......