我想检查是否有奴隶数据库.如果有一个,并且它包含数据,那么我想为每个从属执行一个动作.
我有以下代码:
slaves = data_bag('slaves') if slaves.length > 0 for slave in slaves ...xyz.. end end
解决方法
当您尝试访问尚不存在的数据库时,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..
但是,这将返回一个空数组,因为您将其用于.length比较.
如果目标是如果有任何奴隶,然后迭代它们,我会做这样的事情:
slaves = begin data_bag('slaves') rescue Net::HTTPServerException,Chef::Exceptions::InvalidDataBagPath nil end if slaves slaves.each do |slave| ...xyz..
如果数据包不存在,则返回nil而不是Array,如果数据包存在,它将是正确的返回,但是为空,并且仅在不为nil时才执行xyz步骤.
(我还将奴隶奴隶改为更惯用的Ruby .each迭代器.)