7

ノードのレシピと属性ファイルがあります。たとえば、localhost と linode です。デフォルトまたは他の属性の前に、属性ファイルを最初にロードする(そしてホスト名などを設定する)ようにしています。例:

属性/localhost.rb:

default[:hostname] = "localhost"
default[:nginx][:hostname] = 'mbdev-localhost'

include_attribute 'mbdev::common'

属性/ common.rb

default[:nginx][:website1][:url] = "subdomain." + default[:nginx][:hostname]

レシピ/localhost.rb

include_recipe 'mbdev::default'

ランリスト:

'mbdev::localhost'

ただし、 include_attribute は「共通」属性を最初にロードするようです。そのため、nginx-hostname はまだ設定されていません...

私が取得する順序は次のとおりです。1) attributes/default.rb の読み込み 2) attributes/common.rb の読み込み 3) + に関するエラー

common.rb の前に localhost.rb をロードするにはどうすればよいですか?

4

2 に答える 2

12

デフォルトでは、属性ファイルはアルファベット順にロードされます。これはどこでも完全に一貫していませんでしたが、CHEF-2903で修正されました。

したがって、アルファベット順で前に来るという理由だけで、 yourattributes/common.rbが前にロードされます。attributes/localhost.rbルールの例外は、attributes/default.rb常にクックブック内の他の属性ファイルより前にロードされることです。

一般に、属性ファイルのロード順序は次のとおりです。

  1. すべてのクックブックの依存関係の属性をアルファベット順にロードします
  2. 負荷attributes/default.rb(存在するか)
  3. その他の属性ファイルを、ファイル名のアルファベット順にロードします

を使用して、通常よりも先にアトリビュート ファイルをロードすることはできますinclude_attributeが、後でロードすることはできません。

このロジックはchefにハードコーディングされており、変更できません。ただし、いくつかの回避策を実行できます。

  • 読み込み順序がもはや重要ではない方法で属性ファイルを書くことができます
  • 上記のロジックと一致する方法でレシピ/属性に名前を付けることができます
  • 属性ファイルを再度ロードするように強制できます。

    node.from_file(run_context.resolve_attribute("cookcook_name", "attribute_file"))
    
于 2013-10-28T11:45:16.267 に答える