Я хочу проверить, есть ли в базе данных рабов. Если он есть и содержит данные, то я хочу выполнить действие для каждого ведомого устройства.
У меня такой код:
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 Server 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
в случае, если пакет данных не существует, вместо массива, который был бы правильным возвратом в случае, если пакет данных существует, но пуст и будет выполнять только xyz
шаги, если нет nil
.
(Я также изменил for slave in slaves
к более идиоматическому Ruby .each
итератор.)
Вы можете посмотреть код загрузчика пакетов данных Вот Если Вы заинтересованы.