0

シェフのゼロ実行 (ノードの状態をローカルの .json ファイルとして保存) をいくつか実行した後、ノード ファイルでこれを見つけてがっかりしました。Chef ... "ssmtp": { "auth_username": "secret user name", "auth_password": "even-more-secret password" } Server で同じ実行を行うと、ノード データがサーバーに保存されます。もちろん、それは問題です。資格情報を置き換えたり、レシピを変更したりする必要があります。そもそもこれの原因を調査していますが、私の質問は次のとおりです。

レシピの rspec/chefspec テストを作成して、特定のノード属性がノードの .json ファイルまたは Chef Server に永続的に保存されていないことを確認するにはどうすればよいですか?

二度と起こらないように、これを仕様に追加したいと思います。

エピローグ

ここでの大きな教訓は、ノード アトリビュートに入る方法を見つけたものはすべて、ノード オブジェクト表現に保存されるということです。

4

2 に答える 2

2

Chef Server はすべての属性を保存します。属性が通常、デフォルト、または別の優先レベルであっても同様です。「シェフクライアントの実行中に一時的なデータを隠しておく」ために使用できるnode.run_stateを使用することで、これを回避できます。

これは、elkstackコミュニティのクックブック、特に_lumberjack_secrets.rbレシピで確認できます。

node.run_state設定中:

if <CONDITION ABBREVIATED>
  node.run_state['lumberjack_decoded_key'] = Base64.decode64(lumberjack_secrets['key'])
  ....
end

node.run_state使用されています:

lumberjack_keypair = node.run_state['lumberjack_decoded_key'] && node.run_state['lumberjack_decoded_certificate']

テストに関しては、私はこれを自分で「テスト」していませんが、次のように、属性が設定されていないことを確認するためにテストします。

it 'should not have secret attributes set' do
  node = chef_run.node
  expect (node['my_secret']).to be_nil
end
于 2015-05-06T20:34:06.880 に答える
0

鍵は、Chef ドキュメントのコメントにあります。 これにより、属性が「通常の」属性であるかどうかのテストに問題が分解されます。

Chef::Node と Chef::Node::Attribute クラスのコードを調べてみると、呼び出しnode.attributes.normalて通常の属性だけを取得できることがわかりました。したがって、この簡潔なテストは正しく失敗し、私の秘密情報ノード オブジェクトに永続的に保存されることを示しています!

it 'does not have a normal attribute node[ssmtp][auth_password]' do expect(subject.node.attributes.normal['ssmtp'].keys).to_not include 'auth_password' end

このまともなエラーメッセージが表示されます:

Failure/Error: expect(subject.node.attributes.normal['ssmtp'].keys).to_not include 'auth_password' expected ["auth_username", "auth_password"] not to include "auth_password"

特定の値が設定されていないかどうかをテストすることもできますが、キーが存在しないことをテストすることはより重要だと思います。

どういうわけか、ここに投稿する質問を作成するだけで、常に新しい洞察が得られます。だからそうなるのです。

于 2015-05-06T17:33:22.687 に答える