4

Chef で、このコードが bash リソースでスローされた例外をキャッチしないのはなぜですか? このコードを実行すると、例外がスローされても Python リソースにアクセスできません。エラーが予想されるため、私はそれをキャッチし、pymongo に移動してそのように修正します。

begin
    bash "mongo fix" do
        code "mongo --verbose #{filename}"
        action :run

    end
rescue
    python 'pymongo reconfig'  do
        code "Pymongo does a catch and reconfig"
    end

end

そして、これは例外出力です

[2013-03-05T20:03:55+00:00] FATAL: Mixlib::ShellOut::ShellCommandFailed: bash[mongo fix (noudata::mongo line 77) had an error: Mixlib::ShellOut::ShellCommandFailed: Expected process to exit with [0], but received '253'
---- Begin output of "bash"  "/tmp/chef-script20130305-3916-14xxhn5-0" ----
STDOUT: MongoDB shell version: 2.2.3
Tue Mar  5 20:03:55 versionCmpTest passed
Tue Mar  5 20:03:55 versionArrayTest passed
connecting to: test
Tue Mar  5 20:03:55 creating new connection to:127.0.0.1:27017
Tue Mar  5 20:03:55 BackgroundJob starting: ConnectBG
Tue Mar  5 20:03:55 connected connection!
true
{
"errmsg" : "replSetReconfig command must be sent to the current replica set primary.",
"ok" : 0
}
Tue Mar  5 20:03:55 uncaught exception: [object bson_object]
failed to load: /tmp/test.js
STDERR:
---- End output of "bash"  "/tmp/chef-script20130305-3916-14xxhn5-0" ----
Ran "bash"  "/tmp/chef-script20130305-3916-14xxhn5-0" returned 253
4

2 に答える 2

6

beginブロック内のコードは、リソースのインスタンスを作成し、リソースと属性Chef::Resource::Bashを割り当て、リソースを に追加します。リソースは決して「実行」されていません。リソースのインスタンスを作成しても例外は発生しないため、ブロック内のコードは実行されません。codeactionrun_context.resource_collectionrescue

後で、すべてのレシピ コードの実行が完了すると、Chef はrun_context.resource_collection. リソースごとに、Chef はリソースのアクションを実行します。リソースの場合、これbashはリソースのcode属性で指定された文字列を実行することを意味します。これは、レシピと他のすべてのレシピの実行が完了した後に発生するため、beginブロックの外側で発生することに注意してください。アクションが実行されたときにこのリソースによって発生した例外は、beginブロックに伝播しません。これは、アクションがブロック内から呼び出されるのではなくbegin、その後から呼び出されるためです。

次のようなことを試すことができます:

bash "mongo fix" do
  code "mongo --verbose #{filename} || python pymongo reconfig"
end
于 2013-03-05T20:22:32.630 に答える