如何检查厨师数据库是否存在?

我想检查是否有奴隶数据包。 如果有一个,并且它包含数据,那么我想为每个从机执行一个动作。

我有以下代码:

slaves = data_bag('slaves') if slaves.length > 0 for slave in slaves ...xyz.. end end 

这工作,除非数据标签还不存在。 如何检查数据库是否存在? 还是我这样做完全错了?

当您尝试访问尚不存在的数据标签时,Chef将引发exception,具体取决于您正在运行的Chef Client的types。

例如,在Chef Solo中,您将引发一个名为Chef::Exceptions::InvalidDataBagPath ,而在Chef Client中(对于Chef Server而言,将引发Net::HTTPServerExceptionexception,因为在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,如果数据包存在,这将是正确的返回,但是是空的,并且只会执行xyz步骤(如果不是nil

(我也把for slave in slaves .each了更习惯的Ruby。 .each迭代器。)

如果感兴趣,可以在这里查看数据包加载器代码。