2017-02-03 2 views
1

У меня есть несколько кулинарных книг, которые включают в себя несколько других кулинарных книг, в зависимости от потребностей каждой кулинарной книги. Включенные кулинарные книги объявляют службы, которые уведомляют другие службы.Можно ли использовать оператор возврата внутри включенного рецепта?

Одна из включенных поваренных книг 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 

Может поваренную книгу с таким геЬигпом вызывает только некоторые поваренные книги для запуска? Целесообразно?

Примечание: Я делаю это, потому что я не хочу копировать один и тот же код во всех других кулинарных книгах.

ответ

1

Если я правильно вас понял, что это не будет делать то, что вы после этого, потому что:

  1. будут включены только рецепт один раз, если есть кратные поваренные книги в runlist вызова include_recipe A::B затем рецепт B из поваренной книги A будет только компилироваться один раз, последовательные вызовы будут no-op (не будут дублировать ресурсы рецепта).
  2. В заявлении 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' вы начать Рецепт с:

Другое значение может использоваться для регистрации из рецептов в разных средах lik e это:

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

Вы можете поместить верхний уровень в таком виде, или вы можете использовать условное выражение для самой include_recipe.

Смежные вопросы