43

クックブックにデフォルトの属性があるとしましょう:

default.nginx_upstreams = {
    'service1' => ['service1.server.com'],
    'service2' => ['service2.server.com'],
}

次に、最終的に私のレシピに到達するまで、ロールと環境で変更およびオーバーライドされます。そこで、属性に追加したいいくつかの追加サービスを計算します。私がこのようなことをすると:

node.nginx_upstreams.merge! {'service3' => ['service3.server.com']}

次に、テンプレートで属性を使用しようとすると、undefined method 'each' for nil:NilClass実行しようとするとテンプレートに

<% node.nginx_upstreams.each do |name, servers| %>

さらに、私も取得しWARN: Setting attributes without specifying a precedence is deprecated and will be removed in Chef 11.0ます。役立つ警告は、通常の優先順位で属性を設定する方法を教えてくれます (どうやら を使用node.set["key"] = "value"していますが、デフォルトまたはオーバーライド属性を指定する方法は教えてくれません。

次のようなことを行うことで、この問題を回避できます。

upstreams = node.nginx_upstreams.to_hash
upstreams.merge! {'service3' => ['service3.server.com']}

template "nginx_config" do
    variables({:upstreams=>upstreams})
end

しかし、それはハックのように感じます。これは、レシピで通常の属性とオーバーライド属性の両方を設定できることを示していますnode.set()が、方法は述べていません。

では、レシピ内から (他のすべてのものと一緒に深くマージされる) 属性を適切に設定するにはどうすればよいでしょうか? 呼び出しは実際に何node.set()をしますか? また、マージしたい優先順位を指定できますか?

4

3 に答える 3

46

default.nginx_upstreamsdefault[:nginx_upstreams]と同じですdefault['nginx_upstreams']-慣例では、後者の2つのうち1つを使用します。さらに文字列を使用しているので、ここでも使用してください。

属性ファイルで初期nginx_upstreams化する方法は、次のようにするのと同じです。

default['nginx_upstreams']['service1'] = ['service1.server.com']
default['nginx_upstreams']['service2'] = ['service2.server.com']

そして、その前に初期化する必要はありませんdefault['nginx_upstreams'] = {}。これらはハッシュではなく属性であり、はるかにスマートです。:)

レシピ内からの属性の変更は、次のように行われます。

node.default['nginx_upstreams']['service3'] = ['service3.server.com']

優先順位を変更する必要がある場合は、ここの代わりに、setまたはを使用できます。優先順位の名前(または)を省略すると、優先順位が使用されます。しかし、これは非推奨であり、まもなく削除されます-それが警告のすべてです。すべてが実際にそこにあるので、属性に関するマニュアルページをチェックしてください。overridedefaultnode['nginx_upstreams']node.nginx_upstreamsset

于 2013-01-31T08:24:26.310 に答える
13

シェフの属性についてさらに洞察を深めたいと思っただけですが、ノード属性のオーバーライドに関するこの質問を参照しようとしているユーザーにとって非常に重要です。

属性に対応するファイル メソッド

クックブックの属性ファイル内またはレシピ内で次のメソッドを使用します。これらのメソッドは、同じ名前の属性タイプに対応しています。

  • オーバーライド
  • デフォルト
  • normal (または set、set は normal のエイリアス)
  • _そうでもなければ
  • 属性?

属性の優先順位

属性は常に、chef-client によって次の順序で適用されます。

  1. クックブック属性ファイルにあるデフォルト属性
  2. レシピにあるデフォルト属性
  3. 環境にあるデフォルト属性
  4. role にあるデフォルトの属性
  5. クックブック属性ファイルにある force_default 属性
  6. レシピにある force_default 属性
  7. クックブック属性ファイルにある通常の属性
  8. レシピにある通常の属性
  9. クックブック属性ファイルにあるオーバーライド属性
  10. レシピにあるオーバーライド属性
  11. ロールにあるオーバーライド属性
  12. 環境にあるオーバーライド属性
  13. クックブック属性ファイルにある force_override 属性
  14. レシピにある force_override 属性
  15. シェフクライアントの実行開始時に Ohai によって識別される自動属性

リストの最後の属性は、ノードに適用される属性です。

これは、OHAI 属性が最も優先順位が高く、クックブック属性ファイルのデフォルト属性が最も優先順位が低いことを意味します。

注:ユーザーの利益のために、Chef ドキュメントから属性の重要な詳細を提供しました。URLが移動したり無効になる場合があるためです。

于 2015-11-19T12:00:17.317 に答える
6

それで、掘り下げた後、私は答えを見つけました:

node.set node.set は node.normal のエイリアスであるため、node.set の代わりに node.override を
使用します。node.default通常のデータはノード オブジェクトに保持されます。したがって、node.set を使用すると、ノード オブジェクトにデータが保持されます。node.set を使用するコードが後で削除された場合、そのデータがノードに既に設定されている場合は残ります。

通常属性とオーバーライド属性は、chef-client の実行の開始時にクリアされ、その時点でクックブックとレシピのコードに基づいて実行の一部として再構築されます。

node.set(およびnode.normal) は、chef-client の最初の実行時にデータベースのパスワードを生成するなどの目的でのみ使用する必要があります。このタイプのデータを格納するには、データ バッグを使用することをお勧めします。

于 2015-04-17T14:34:19.717 に答える