根据每本食谱的需要,我有几本烹饪书,其中包括其他几本食谱。 随附的烹饪书宣布了通知其他服务的服务。
其中一本食谱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
带有这种退货声明的食谱是否只能使某些食谱运行?这是可取的吗?
注意:我这样做是因为我不想在所有其他食谱中复制粘贴相同的代码。
答案 0 :(得分:1)
如果我理解你,那就不会做你想要的事情,因为:
include_recipe A::B
有多个食谱,那么食谱A的食谱B只会编译一次,连续调用将是无操作(不会复制食谱)资源)。return
语句将结束实际的食谱编译,在您的情况下,它将停止编辑食谱default
中的食谱common_actions
。你可以做的是使用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本身上使用条件。