Quando você tenta acessar um banco de dados que ainda não existe, o Chef irá levantar uma exceção, dependendo do tipo de Chef Client que você está executando.
Por exemplo, no Chef Solo, você levantará uma exceção chamada Chef::Exceptions::InvalidDataBagPath
, enquanto que com o Chef Client (contra um Chef Server, uma exceção Net::HTTPServerException
será gerada, pois o objeto não é encontrado em uma chamada API para o servidor.
Assim, você pode colocar a configuração em um bloco Ruby, assim:
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..
No entanto, isso retorna uma matriz vazia, já que você a está usando para a comparação .length
.
Se o objetivo é que, se houver qualquer escravos, então iterar sobre eles, eu faria algo assim:
slaves = begin
data_bag('slaves')
rescue Net::HTTPServerException, Chef::Exceptions::InvalidDataBagPath
nil
end
if slaves
slaves.each do |slave|
...xyz..
Isso retorna um nil
no caso do pacote de dados não existir, em vez de um Array, que seria o retorno correto no caso do pacote de dados existir, mas está vazio e só executará o xyz
etapas, se não nil
.
(Eu também alterei o for slave in slaves
para o mais idiomático Ruby .each
iterator.)
Você pode ver o código do carregador de saco de dados aqui se interessado.