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,分配资源codeaction属性,并将资源添加到run_context.resource_collection. 该资源在任何意义上都不是“运行”的。创建资源实例不会引发任何异常,因此rescue块中的代码不会运行。

稍后,一旦您的所有配方代码运行完毕,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 回答
0

将您的代码放入定义中并从配方中调用定义。

于 2013-05-15T10:02:16.533 回答