Назад | Перейти на главную страницу

Как проверить, существует ли метка шеф-повара?

Я хочу проверить, есть ли в базе данных рабов. Если он есть и содержит данные, то я хочу выполнить действие для каждого ведомого устройства.

У меня такой код:

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 итератор.)

Вы можете посмотреть код загрузчика пакетов данных Вот Если Вы заинтересованы.