3

この投稿で説明されている方法に従って、Chef がプロビジョニングする新しいサーバーの DNS レコードを作成しています。AWS 認証情報用に暗号化されたデータ バッグ アイテムを作成しました。

$ knife data bag show passwords aws --secret-file .chef/encryted_data_bag_secret 
aws_access_key: <my_access_key>
aws_secret_key: <my_secret_key>
id:             aws

ただし、シェフクライアントを実行すると、この行...

aws_creds = Chef::EncryptedDataBagItem.load('passwords', 'aws')

このエラーが発生します:

TypeError: can't convert nil into String

エラーを検索してみましたが、他の人がこれに遭遇したという証拠を見ることができますが、彼らの問題が何であるか、またはそれがどのように解決されたかは明らかではありません. ここで何が起こっていますか?どうすれば修正できますか?

4

2 に答える 2

4

今日もこのエラーに遭遇しました。私の場合、ノードには encrypted_data_bag_secret がありませんでした。

このバグ ( http://tickets.opscode.com/browse/CHEF-4441 ) によると、エラー (私の場合) は Chef 11.4.4 の方が明確でした:

No such file or directory - file not found '/etc/chef/encrypted_data_bag_secret'

お役に立てば幸いです。

于 2013-08-19T20:32:05.607 に答える
1

レシピの実行順序については、(rgnever の回答へのコメント) いくつかのことが順不同で発生しているように見えることは正しいです。Chef Recipe の実行に関する Opscode の記事は次のとおりです。

Chef は、コンパイルと実行の 2 つのフェーズでレシピを処理します。

  1. コンパイル段階で、レシピは Ruby コードとして評価され、認識されたリソースがリソース コレクションに追加されます。
  2. 実行段階で、Chef は各リソースに対して適切なプロバイダー アクションを実行します。

これを明示的に確認するドキュメントは見つかりませんでしたが、データ バッグがコンパイル時に評価されるリソース タイプの 1 つであることは明らかです。したがって、レシピのその部分は実際には実行リストの順序を崩し、秘密ファイルに実際にロードする必要のある他のレシピよりも先にジャンプします。

cookbook_fileそのドキュメントで説明されている (リソースに適応した) トリックを使用することで、これを回避することができました。

cb_file = cookbook_file "/etc/chef/encrypted_data_bag_secret" do
  source "chef_secret_file"
  mode 0755
  owner "root"
  group "root"
end

cb_file.run_action(:create)

このアクションはcookbook_file リソース:nothingではサポートされていないことに注意してください。また、リソース ブロックにアクションがない場合、デフォルトで になります。これにより、レシピの実行フェーズでもシークレット ファイルが実際に上書きされます。:create

于 2013-12-13T17:57:51.247 に答える