- 最後の質問はおそらく最も答えやすいものです。属性ファイルでは、「node」と入力する必要がないため、attributes/default.rb で次のようになります。
default['foo']['bar']['baz'] = 'qux'
これは、recipes/whatever.rb の内容とまったく同じです:
node.default['foo']['bar']['baz'] = 'qux'
振り返ってみると、レシピと属性の構文が異なることは紛らわしいですが、この設計の選択は非常に古いバージョンの Chef にさかのぼります。
- -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 に必須であるということです。通常、デフォルト属性とオーバーライド属性のみを使用します。通常、ほとんどの作業はデフォルトの属性で行うことができます。これらの属性を優先する必要があります。
- ここに大きな優先レベルの図があります:
https://docs.chef.io/attributes.html#attribute-precedence
これは、属性の優先順位に関する究極の信頼できる情報源です。
- このグラフは、属性を定義するさまざまな方法をすべて説明しています。
Chef Attributes の問題は、それらが有機的に成長し、追い詰められたユーザーを助けようとする多くのオプションを生み出したことです。一般に、automatic、normal、force_default、または force_override レベルの属性に触れる必要はありません。また、レシピ コードで属性を設定することも避ける必要があります。レシピの設定属性を属性ファイルに移動する必要があります。これにより、属性を設定するこれらの場所が残ります。
- 最初の -j 引数で (通常の属性を設定します。これを使用して run_state を設定するように制限する必要があります。これを使用すると、一般的に匂いがします)
- ロールファイルでデフォルトまたはオーバーライドの優先レベルとして (ただし、ロールはバージョン管理されておらず、これらの属性に頻繁に触れると本番環境の問題が発生するため、これには注意してください)
- クックブック属性ファイルで、デフォルトまたはオーバーライドの優先レベルとして (これは、ほとんどの属性を設定する必要がある場所です)
- 環境ファイルで、デフォルトまたはオーバーライドの優先レベルとして (データセンターの DNS サーバーなどの設定に役立ちますが、ロールやクックブックを使用することもできます)
レシピに属性を設定することもできますが、そうすると、Chef Recipes を実行する 2 フェーズのコンパイル - コンバージ パーサーで次のレッスンを受けることになります。相互に通信する必要があるレシピがある場合は、ノード属性として書き込まれない単なるハッシュである node.run_state を使用することをお勧めします。node.run_state[:foo] = 'bar' を 1 つのレシピにドロップして、別のレシピで読み取ることができます。ただし、属性を設定するレシピが表示される可能性があるため、注意が必要です。
役立つことを願っています。