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)
但那些不编译.
有没有办法做我想做的事情?
由于这些是类级方法,因此您需要使用以下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)
完全是多余的.那是默认的......