4

chef最近使い始めたばかりです。属性はnode、レシピやテンプレートで使用できる という名前の 1 つの大きなモノリシック ハッシュに格納されていると思います。

属性を定義する方法は複数あるようです

  1. レシピ自体に直接
  2. 属性ファイルの下 - 例attributes/default.rb
  3. chef-solo呼び出しに渡される JSON オブジェクト内。例えばchef-solo -j web.json

上記の3つを考えると、私は興味があります

  1. これらは、属性を定義できるすべての方法ですか?
  2. ここの優先順位は何ですか?これらの方法の1つが他の方法よりも優先されると思います
  3. #3(JSONメソッド)はのみ有効ですchef-soloか?
  4. nodedefaultハッシュの両方が定義されています。違いは何ですか?私の最善の推測は、でdefault定義されたハッシュがハッシュattributes/default.rbにマージされるということnodeですか?

ありがとう!

4

2 に答える 2

1
  1. 最後の質問はおそらく最も答えやすいものです。属性ファイルでは、「node」と入力する必要がないため、attributes/default.rb で次のようになります。

default['foo']['bar']['baz'] = 'qux'

これは、recipes/whatever.rb の内容とまったく同じです:

node.default['foo']['bar']['baz'] = 'qux'

振り返ってみると、レシピと属性の構文が異なることは紛らわしいですが、この設計の選択は非常に古いバージョンの Chef にさかのぼります。

  1. -j オプションはchef-clientまたはchef-soloで利用可能で、両方とも属性を設定します。これらは、ノード オブジェクト内で持続する「通常の」属性であり、通常は使用が推奨されないことに注意してください。ただし、サーバー上の「run_list」、「chef_environment」、および「tags」はこの方法で実装されています。通常、他の「通常の」属性を使用したり、レシピ (または属性) ファイルを回避したりすることはお勧めしませnode.normal['foo'] = 'bar'node.set['foo'] = 'bar'。違いはnode.normal、レシピから行を削除するとノードの古い設定が保持されるのnode.defaultに対し、レシピから設定を削除すると、ノードでchef-clientを実行するとその設定が削除されることです。

これを実現するためにchef-clientの実行で何が起こるかというと、実行の開始時にクライアントがGETを発行してサーバーから古いノードドキュメントを取得することです。次に、「通常の」属性を維持しながら、デフォルト、オーバーライド、および自動 (ohai) 属性をワイプします。デフォルト、オーバーライド、および自動属性の動作は最も理にかなっています。実行の最初からやり直してから、すべての状態を構築します。レシピにない場合は、そこに値が表示されません。ただし、通常、run_list はノードに設定され、ノードは (多くの場合) 独自の run_list を管理しません。run_list を持続させるために、それは通常の属性です。

'normal' 属性を設定する 'node.set' の選択と同様に、'normal' という単語の選択は残念です。これらは属性の設定に使用する明白な選択肢のように見えますが、ユーザーはそれらの使用を避ける必要があります。繰り返しますが、問題は、それらが最初に来て、今も昔も必要であり、run_list に必須であるということです。通常、デフォルト属性とオーバーライド属性のみを使用します。通常、ほとんどの作業はデフォルトの属性で行うことができます。これらの属性を優先する必要があります。

  1. ここに大きな優先レベルの図があります:

https://docs.chef.io/attributes.html#attribute-precedence

これは、属性の優先順位に関する究極の信頼できる情報源です。

  1. このグラフは、属性を定義するさまざまな方法をすべて説明しています。

Chef Attributes の問題は、それらが有機的に成長し、追い詰められたユーザーを助けようとする多くのオプションを生み出したことです。一般に、automatic、normal、force_default、または force_override レベルの属性に触れる必要はありません。また、レシピ コードで属性を設定することも避ける必要があります。レシピの設定属性を属性ファイルに移動する必要があります。これにより、属性を設定するこれらの場所が残ります。

  • 最初の -j 引数で (通常の属性を設定します。これを使用して run_state を設定するように制限する必要があります。これを使用すると、一般的に匂いがします)
  • ロールファイルでデフォルトまたはオーバーライドの優先レベルとして (ただし、ロールはバージョン管理されておらず、これらの属性に頻繁に触れると本番環境の問題が発生するため、これには注意してください)
  • クックブック属性ファイルで、デフォルトまたはオーバーライドの優先レベルとして (これは、ほとんどの属性を設定する必要がある場所です)
  • 環境ファイルで、デフォルトまたはオーバーライドの優先レベルとして (データセンターの DNS サーバーなどの設定に役立ちますが、ロールやクックブックを使用することもできます)

レシピに属性を設定することもできますが、そうすると、Chef Recipes を実行する 2 フェーズのコンパイル - コンバージ パーサーで次のレッスンを受けることになります。相互に通信する必要があるレシピがある場合は、ノード属性として書き込まれない単なるハッシュである node.run_state を使用することをお勧めします。node.run_state[:foo] = 'bar' を 1 つのレシピにドロップして、別のレシピで読み取ることができます。ただし、属性を設定するレシピが表示される可能性があるため、注意が必要です。

役立つことを願っています。

于 2015-06-27T02:18:15.330 に答える