簡體   English   中英

如何在chef LWRP定義中實現動態屬性默認值

[英]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| 延遲塊的參數。

https://docs.chef.io/resource_common.html#lazy-evaluation

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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