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

时间:2014-06-03 22:20:40

标签: ruby chef 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

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

my_tomcat "install tomcat" do
  name "foo_bar"
end

属性值被指定为

 name = "foo_bar"
 service_name = "name"

这不是我的预期。我希望service_name为“foo_bar”,除非它是明确设置的。

我试过

attribute :service_name, :kind_of => String, :default => new_resource.name
attribute :service_name, :kind_of => String, :default => @new_resource.name

但那些不编译。

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

2 个答案:

答案 0 :(得分:8)

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

attribute :service_name, kind_of: String, default: lazy { |r| r.name }

值得注意的是:

attribute :name, kind_of: String, required: true, name_attribute: true

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

答案 1 :(得分:2)

我无法使用Seth的“懒惰”评估,但能够通过创建动态访问器方法进行模拟。

这篇文章很有用:How to implement a dynamic attribute default in chef LWRP definition

首先,我的资源定义文件中的定义:

attribute :service_name,        :kind_of => String, default: nil

接下来,相同资源定义文件底部的访问者块:

def service_name( arg=nil )
  if arg.nil? and @service_name.nil?
    set_or_return( :service_name, @name, :kind_of => String)
  else
    set_or_return( :service_name, arg, :kind_of => String )
  end
end

第一次在我的提供者代码中使用时,它有效地设置了“service_name”的值。

这适用于

的所有组合
resource "title" do
  # name defaults to "title"
  # service_name defaults to "title"
end
resource "title" do
  name "my_name"
  # service_name defaults to "my_name"
end
resource "title" do
  name "my_name"
  service_name "my_service_name"
end

再次感谢您的帮助。我希望其他人在将来发现这有用。