Eu quero verificar se existe um databag de escravos. Se houver um e contiver dados, desejo executar uma ação para cada escravo.
Eu tenho o seguinte código:
slaves = data_bag('slaves')
if slaves.length > 0
for slave in slaves
...xyz..
end
end
Isso funciona, exceto quando o databag ainda não existe. Como posso verificar se o databag já existe? Ou estou fazendo isso completamente errado?
Quando você tenta acessar um databag que ainda não existe, o Chef gerará uma exceção, dependendo de qual tipo de Chef Client você está executando.
Por exemplo, no Chef Solo, você gerará uma exceção chamada
Chef::Exceptions::InvalidDataBagPath
, enquanto no Chef Client (contra um Chef Server, umaNet::HTTPServerException
exceção será gerada, pois o objeto não foi encontrado em uma chamada de API para o servidor.Então você pode agrupar a configuração em um bloco Ruby, assim:
No entanto, isso retorna uma matriz vazia, pois você a está usando para
.length
comparação.Se o objetivo é que, se houver algum escravo, itere neles, eu faria algo assim:
Isso retorna um
nil
caso o data bag não exista, ao invés de um Array, que seria o retorno correto caso o data bag exista, mas esteja vazio, e só executará osxyz
passos se não existirnil
.(Eu também mudei para o iterador
for slave in slaves
Ruby mais idiomático .).each
Você pode ver o código do carregador de saco de dados aqui se estiver interessado.