[英]How can a chef LW resource attribute default value refer to another attribute?
我正在嘗試將一個資源屬性的默認值設置為另一個屬性的值。
我正在為我正在構建的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
但那些不編譯。
有沒有辦法做我想做的事情?
由於這些是類級方法,您需要使用lazy
屬性:
attribute :service_name, kind_of: String, default: lazy { |r| r.name }
值得注意的是:
attribute :name, kind_of: String, required: true, name_attribute: true
完全是多余的。 那是默認的......
我無法使用Seth的“懶惰”評估,但能夠通過創建動態訪問器方法進行模擬。
這篇文章非常有用: 如何在chef LWRP定義中實現動態屬性默認值
首先,我的資源定義文件中的定義:
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
再次感謝你的幫助。 我希望其他人在將來發現這有用。
豐富
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.