Я хотел бы включить рецепт, основанный на условной ветке, в другой рецепт. В настоящее время планируется, что это произойдет во время выполнения итератора 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
не вносите изменений в узел.