Ruby chef LW资源属性默认值如何引用其他属性?
我试图将一个资源属性的默认值设置为另一个属性的值 我正在为我正在构建的tomcat cookbook定义一个资源,其中包含以下定义。我想拥有可以独立设置的“name”和“service_name”属性。当未设置服务名称时,我希望它默认为为“name”提供的内容 以下内容与我预期的不一样:Ruby chef LW资源属性默认值如何引用其他属性?,ruby,chef-infra,lwrp,Ruby,Chef Infra,Lwrp,我试图将一个资源属性的默认值设置为另一个属性的值 我正在为我正在构建的tomcat cookbook定义一个资源,其中包含以下定义。我想拥有可以独立设置的“name”和“service_name”属性。当未设置服务名称时,我希望它默认为为“name”提供的内容 以下内容与我预期的不一样: attribute :name, :kind_of => String, :required => true, :name_attribute => true attribut
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"
这不是我所期望的。我希望服务名称为“foo\u bar”,除非它被明确设置
我试过了
attribute :service_name, :kind_of => String, :default => new_resource.name
attribute :service_name, :kind_of => String, :default => @new_resource.name
但这些都不能编译
有什么方法可以完成我想做的吗?因为这些都是类级方法,所以需要使用
lazy
属性:
attribute :service_name, kind_of: String, default: lazy { |r| r.name }
还值得注意的是:
attribute :name, kind_of: String, required: true, name_attribute: true
这完全是多余的。这是默认的…我无法使用Seth的“惰性”评估,但能够通过创建动态访问器方法进行模拟 另一个帖子很有用: 首先,我的资源定义文件中的定义:
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
接下来,同一资源定义文件底部的访问器块:
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
再次感谢你的帮助。我希望将来有人会觉得这很有用
里奇谢谢。刚试过,但编译失败:“未定义的方法‘lazy’”。然而,这让我认识到,在这个上下文中,语法只是“name”,而不是“:name”或“new_resource.name”。但是,仅使用“名称”会导致延迟计算问题。我是否需要将它转换为一个动态赋值,以便“lazy”在这里被接受?不确定。也许你在用老版本的厨师?厨师长11.12。我可以在中使用'lazy'作为资源的一部分(类似于示例),但不能按照您建议的方式在默认情况下使用:子句。然而,基于您的帮助,我想我使用动态访问器方法找到了答案。我将把它贴在下面。@sethvargo正如上面的评论员所说,当我尝试它时,它完全失败了。我以为它说,
lazy
是未定义的,但现在它可以工作了,如果我提供一个block参数,它就完全可以正常工作::默认值=>lazy{r}“blah{r.name}
。很抱歉我试图撤回否决票,但它说除非答案被编辑,否则我不能。r是运行上下文对象吗?