使用 Chef,我可以在 If 语句中使用 include_recipe 并指望它多次起作用吗?

使用 Chef,我可以在 If 语句中使用 include_recipe 并指望它多次起作用吗?

我想将基于条件分支的配方包含在另一个配方中。目前计划在 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对节点进行任何更改。

相关内容