我想将基于条件分支的配方包含在另一个配方中。目前计划在 Ruby .each 迭代器执行期间执行此操作。
opscode wiki 对 include_recipe 有如下说明:“...include_recipe
对同一配方的后续调用将不会产生任何效果。”
我假设这意味着include_recipe
在运行期间不能多次使用相同的配方。但是,如果在迭代器执行期间调用它,这是否适用?
谢谢!
更新澄清:
因此,只是为了澄清一下。recipe_1 是主要配方。在 recipe_1 中,我遍历节点上的应用程序,如果 Application_2 在节点上,我想包含 recipe_2;如果 App_3 在节点上,我想包含 recipe_3。如果我在节点上有两个应用程序,我想确保当下一次迭代开始为 App_3 运行时,包含 recipe_2 的第一次迭代不会仍包含在 recipe_1 中。再次,我对文档中的以下说明持谨慎态度:包含的配方的资源将按顺序插入到调用 include_recipe 的位置。
答案1
你的怀疑是正确的。include_recipe
在运行上下文(chef-client 运行)。下面粘贴的是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
答案2
您可以include_recipe
根据需要使用相同的配方(例如在迭代器中),并且如果多次包含它,它不会产生任何错误或类似的东西。
文档试图说明的是,我在实践中也观察到了这一点,即首次包含配方时,所包含配方中的资源会更新一次。后续调用不会include_recipe
对节点进行任何更改。