[英]How to implement a dynamic attribute default in chef LWRP definition
我希望能夠定義一個輕量級資源,讓我們說3個參數,其中兩個是基本/基本參數,第三個是這兩個參數的組合。 我還想提供定制第三個參數的可能性。 例如:
如何修改以下代碼以實現full_name
屬性的上述行為:
資源定義:
actions :install
attribute :name, :kind_of => String, :name_attribute => true
attribute :version, :kind_of => String
attribute :full_name, :kind_of => String
提供者定義:
action :install do
Chef::Log.info "#{new_resource.full_name}"
end
我想看到不同資源指令的不同輸出,例如:
resource "abc" do
version "1.0.1"
end
將導致abc-1.0.1
,但是:
resource "def" do
version "0.1.3"
full_name "completely_irrelevant"
end
將導致completely_irrelevant
。
是否有可能在資源定義中定義此行為(可能通過default
參數),或者我只能在提供程序定義中執行此操作? 如果第二個為真,那么我可以將計算出的值存儲在new_resource
對象的full_name
屬性中(該類似乎錯過了full_name=
方法定義)或者我必須將它存儲在局部變量中嗎?
更新
感謝Draco的提示,我意識到我可以在資源文件中創建一個訪問器方法,並在請求時動態計算full_name
值。 我更喜歡更清潔的解決方案,但它比在行動實施中計算它要好得多。
廚師版廚師:10.16.4
在構造函數中設置@full_name,類似於在cook <0.10.10中提供默認操作,如wiki中所寫 ,不起作用,因為@version尚未設置。
def initialize( name, run_context=nil )
super
@full_name ||= "%s-%s" % [name, version]
end
所以我們必須通過添加覆蓋資源中的full_name方法
def full_name( arg=nil )
if arg.nil? and @full_name.nil?
"%s-%s" % [name, version]
else
set_or_return( :full_name, arg, :kind_of => String )
end
end
進入資源定義。 這樣可行。 測試。
attribute :full_name, :kind_of => String, default => lazy {|r| "#{r.name}-#{r.version}" }
經過一段時間的斗爭后,我發現這個工作干凈利落。
attribute :eman, String, default: lazy {|r| r.name.reverse }
我失蹤的部分是|r|
延遲塊的參數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.