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