是否可以在包含的配方中使用return语句?

时间:2017-02-03 17:57:56

标签: chef chef-recipe chef-solo

根据每本食谱的需要,我有几本烹饪书,其中包括其他几本食谱。 随附的烹饪书宣布了通知其他服务的服务。

其中一本食谱common_actions包含在所有其他食谱中,因为它包含所有人共同的行动。

include_recipe 'cookbook1'
include_recipe 'common_actions'
include_recipe 'cookbook2'
# Several cookbooks have such includes, but 'common_actions'
# is included in almost all the cookbooks.

# cookbook specific conditional logic that should be
# executed only if some condition in 'common_actions' is true

common_actions食谱中包含一个条件返回语句是否明智,以便它会强制包含的烹饪书不能根据这个条件编译/执行?出于这个问题的目的,请考虑任何假的情况,如:

if node['IP'] == 'xyz'
    # All including cookbooks should execute only IP is xyz
    return
end

带有这种退货声明的食谱是否只能使某些食谱运行?这是可取的吗?

注意:我这样做是因为我不想在所有其他食谱中复制粘贴相同的代码。

2 个答案:

答案 0 :(得分:1)

如果我理解你,那就不会做你想要的事情,因为:

  1. 一个食谱只会被包含一次,如果在运行列表中调用include_recipe A::B有多个食谱,那么食谱A的食谱B只会编译一次,连续调用将是无操作(不会复制食谱)资源)。
  2. return语句将结束实际的食谱编译,在您的情况下,它将停止编辑食谱default中的食谱common_actions
  3. 你可以做的是使用node.run_state,它只是在运行期间可用的哈希值 您可以使用它来存储来自command_actions cookbookn的另一个条件哈希值。

    node.run_state['IP_allowed'] = node['IP'] == 'xyz'
    # Probabaly a little silly, but that's the easier I can think of
    if node.chef_environment == 'Test' 
      if node['DoDebugLog'] == true
        node.run_state['LoggerLevel'] = 'debug' 
      else
        node.run_state['LoggerLevel'] = 'info'
    else
      node.run_state['LoggerLevel'] = 'warn'
    end
    

    现在,您可以在其他配方中使用这些值来控制其行为,同时仍将条件定义保留在中心位置。

    如果node['IP']'xyz',则运行的食谱中,您将启动以下食谱:

    return if node.run_state['IP_allowed']
    

    如果node['IP']'xyz',那么应该只运行 的那个你将开始配方:

    return unless node.run_state['IP_allowed']
    

    另一个值可用于从不同环境中的食谱记录,如下所示:

    log "Message to log" do
      level node.run_state['LoggerLevel']
    end
    

答案 1 :(得分:-1)

你可以像这样输入顶级回报,或者你可以在include_recipe本身上使用条件。