簡體   English   中英

廚師LW資源屬性默認值如何引用另一個屬性?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM