我想检查是否有奴隶数据包。如果有一个,并且它包含数据,那么我想为每个从站执行一个操作。
我有以下代码:
slaves = data_bag('slaves')
if slaves.length > 0
for slave in slaves
...xyz..
end
end
Run Code Online (Sandbox Code Playgroud)
这有效,除非数据包尚不存在。如何检查数据包是否存在?还是我这样做完全错误?
当您尝试访问尚不存在的数据包时,Chef 将引发异常,具体取决于您正在运行的 Chef Client 类型。
例如,在 Chef Solo 中,您将引发名为 的异常Chef::Exceptions::InvalidDataBagPath
,而对于 Chef Client(针对 Chef 服务器,Net::HTTPServerException
将引发异常,因为在对服务器的 API 调用中找不到该对象。
因此,您可以将设置包装在 Ruby 块中,如下所示:
slaves = begin
data_bag('slaves')
rescue Net::HTTPServerException, Chef::Exceptions::InvalidDataBagPath
[] # empty array for length comparison
end
if slaves.length > 0
for slave in slaves
...xyz..
Run Code Online (Sandbox Code Playgroud)
但是,这将返回一个空数组,因为您正在使用它进行.length
比较。
如果目标是如果有任何奴隶,然后对它们进行迭代,我会做这样的事情:
slaves = begin
data_bag('slaves')
rescue Net::HTTPServerException, Chef::Exceptions::InvalidDataBagPath
nil
end
if slaves
slaves.each do |slave|
...xyz..
Run Code Online (Sandbox Code Playgroud)
这nil
在数据包不存在的情况下返回 a ,而不是数组,如果数据包存在,但为空,则正确返回,xyz
如果不存在,则仅执行步骤nil
。
(我还将 更改for slave in slaves
为更惯用的 Ruby.each
迭代器。)
如果有兴趣,您可以在此处查看数据包加载程序代码。
归档时间: |
|
查看次数: |
5270 次 |
最近记录: |