5

たとえば、3 つのパラメーターを使用して軽量リソースを定義できるようにしたいと考えています。そのうちの 2 つは基本/基本パラメーターであり、3 つ目はこれら 2 つの組み合わせです。また、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パラメーターを介して)、またはプロバイダー定義でのみ実行できますか? 2番目が真の場合、計算された値をnew_resourceオブジェクトのfull_name属性に保存できますか(クラスはfull_name=メソッド定義を欠いているようです)、それともローカル変数に保存する必要がありますか?

アップデート

Draco のヒントのおかげで、リソース ファイルにアクセサ メソッドを作成し、full_name要求されたときにその場で値を計算できることに気付きました。私はよりクリーンなソリューションを好みますが、実際の実装で計算するよりもはるかに優れています。

シェフのバージョン シェフ: 10.16.4

4

3 に答える 3

3

wiki に書かれているように、chef < 0.10.10 でデフォルト アクションを提供するのと同様に、コンストラクターで @full_name を設定すると、@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

リソース定義に。それはうまくいきます。テスト済み。

于 2013-01-05T14:27:07.257 に答える
1
attribute :full_name, :kind_of => String, default => lazy {|r| "#{r.name}-#{r.version}" }
于 2015-12-11T10:25:54.637 に答える