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

Могу ли я с помощью Chef использовать include_recipe в операторе If и рассчитывать, что он сработает несколько раз?

Я хотел бы включить рецепт, основанный на условной ветке, в другой рецепт. В настоящее время планируется, что это произойдет во время выполнения итератора Ruby .each.

В вики-странице opscode говорится о include_recipe следующее: «... последующие вызовы include_recipe для того же рецепта не будет иметь никакого эффекта ".

Я предполагаю, что это означает, что нельзя использовать include_recipe по одному и тому же рецепту несколько раз во время пробежки. Однако применимо ли это, если он вызывается во время выполнения итератора?

Спасибо!

ОБНОВЛЕНИЕ для уточнения:

Итак, просто чтобы уточнить. recipe_1 - это основной рецепт. В recipe_1 я перебираю приложения на узле и хочу включить recipe_2, если Application_2 находится на узле, или recipe_3, если App_3 находится на узле. Если у меня есть оба приложения на узле, я хочу убедиться, что первая итерация, включающая recipe_2, все еще не включена в recipe_1 при запуске следующей итерации для App_3. Опять же, я с осторожностью отношусь к документации, которая гласит: Ресурсы включенного рецепта будут вставлены по порядку в момент вызова include_recipe.

Ваше подозрение верно. include_recipe накапливается в RunContext (запуск шеф-клиента). Вставлено ниже RunContext#load_recipe который называется IncludeRecipe#load_recipe.

# Evaluates the recipe +recipe_name+. Used by DSL::IncludeRecipe
def load_recipe(recipe_name)
  Chef::Log.debug("Loading Recipe #{recipe_name} via include_recipe")

  cookbook_name, recipe_short_name = Chef::Recipe.parse_recipe_name(recipe_name)
  if loaded_fully_qualified_recipe?(cookbook_name, recipe_short_name)
    Chef::Log.debug("I am not loading #{recipe_name}, because I have already seen it.")
    false
  else
    loaded_recipe(cookbook_name, recipe_short_name)

    cookbook = cookbook_collection[cookbook_name]
    cookbook.load_recipe(recipe_short_name, self)
  end
end

Вы можете использовать include_recipe для одного и того же рецепта сколько угодно (например, в итераторе), и он не будет генерировать никаких ошибок или чего-либо подобного, если вы включите его несколько раз.

Документация пытается сказать, и я наблюдал это на практике, что ресурсы во включенном рецепте обновляются один раз, когда рецепт впервые включен. Последующие звонки в include_recipe не вносите изменений в узел.