0

リポジトリ内の 2 つの異なるファイルには、次の行が含まれています。

# library_cookbook_1/attributes/default.rb
default[:library_cookbook_1][:foo] = true
# library_cookbook_2/attributes/default.rb
default[:library_cookbook_2][:foo] = true

両方の属性をマージしたいと思います。どちらも同じ意味で使用されるため、単純に一方を他方と同じに設定するだけでは十分ではありません。私の最大の懸念は、誰かがこの間違いを犯すことです:

"environment_json_attributes": {
    "library_cookbook_1": {
        "foo": false //Now it's false half of the time...
    }
}

コードで両方の変数の値を設定するのを忘れることは、現在の構造では致命的な間違いです。オーバーライド階層を維持する方法で属性をマージして、library_cookbook_1 にロール レベルのオーバーライドがあり、library_cookbook_2 に環境レベルのオーバーライドがある場合、属性が 1 つの属性であるかのようにシェフがオーバーライドを処理するようにします。

理想的なマージ コードは次のようになります。

> node.attributes.debug_value('library_cookbook_1', 'foo')
{'precedence1' => true, 'precendence3' => false}
> node.attributes.debug_value('library_cookbook_2', 'foo')
{'precedence1' => false, 'precendence2' => true}

> attr_merge(['library_cookbook_1', 'foo'], ['library_cookbook_2', 'foo'])
> node.attributes.debug_value('library_cookbook_1', 'foo')
{'precedence1' => true, 'precendence2' => true, 'precendence3' => false}
> node.attributes.debug_value('library_cookbook_2', 'foo')
{'precedence1' => true, 'precendence2' => true, 'precendence3' => false}

> node[:library_cookbook_1][:foo].precedence4 = true
> node.attributes.debug_value('library_cookbook_2', 'foo')
{'precedence1' => true, 'precendence2' => true, 'precendence3' => false, 'precedence4' => true}

理想的には、各属性を同じものへのポインターにすることで、将来の呼び出しと割り当てが両方に適用されるようにします。

さて、明らかな答えは、単純に属性の 1 つをリファクタリングすることです。残念なことに、chef は属性のリファクタリングを困難にしています - 私たちは 10 の異なる環境、7 つの異なる役割、環境ごとに 20 のノードなどを持っています。

4

2 に答える 2

1

属性を使用するクックブックをリファクタリングして、代わりに単一の属性を使用します。次に、元の attrs のいずれかが nil (またはセンチネル) 以外に設定されている場合、Chef の実行を中止するコードを追加します。最初の 1 時間程度はやや煩わしいかもしれませんが、古い値がどこに設定されているかはすぐにわかります。

それができない場合は、単一の属性を取り、それに基づいて 2 つの古い値の force_override を設定するクックブックを作成します。これは、競合が発生した場合、常に新しい値が優先されることを意味します。

于 2015-01-21T19:27:14.947 に答える
0

全体をリファクタリングしようとすると、微妙な形で表面化する間違いを犯すことは確実です。

まずこれを修正する必要があります。変更に自信を持つには、十分な自動テストが必要です。変更を行うことについて心配している場合、行き詰まり、Chef を使用することはできません。

ChefSpecを使用して、クックブック コードをすばやく単体テストします (変更を適用する必要はありません)。

実際のchefdev環境の前に、新しいクックブックを使用して完全に収束するノードをテストするために、Vagrant や VM を備えた環境のようなものが必要になる場合があります。

補足として、複数環境のセットアップでは、役割も避けたい場合があります。

明白な答えは、単に属性の 1 つをリファクタリングすることです

Chef はすぐに使用できるものをサポートしていないため、どの方法を選択してもリファクタリングが必要になります。物事を変えることを恐れて目立たないクラッジを追加すると、後であなたを噛むだけになります.

だから、あなたの明白な答えは私の答えになるでしょう....

単一の属性を使用するようにクックブックをリファクタリングします。単一の属性はすでにかなり優先されています。

于 2015-01-21T23:07:57.397 に答える