Следует использовать include_recipe или добавить рецепт в run_list?

Пытаемся найти лучший подход для большого проекта. Когда целесообразно добавлять рецепты в рецепт, используя include_recipe, а не добавлять рецепт в run_list? Есть ли хорошее практическое правило?


person Micah    schedule 05.06.2013    source источник


Ответы (2)


На мой взгляд, любой рецепт должен работать на пустой машине сам по себе. Поэтому, если какой-то рецепт A зависит от выполнения рецепта B перед ним, я всегда использую include_recipe.

Например: 2 кулинарные книги, tomcat и java. Tomcat требует java.

  1. Когда какой-то пользователь хочет установить tomcat, он может и не подозревать, что для его установки ему на самом деле требуется какая-то другая поваренная книга. Он запускает рецепт tomcat, и либо он выходит из строя с каким-то совершенно бесполезным сообщением об ошибке, например «Java не найден», либо, что еще хуже, он преуспевает, но тогда, конечно, пользователь не может запустить tomcat, потому что у него не установлена ​​java.

  2. Но когда в книге рецептов tomcat есть строка include_recipe 'java', для которой также требуется строка depends 'java' в метаданных, пользователь при попытке установить tomcat увидит понятное сообщение об ошибке: «java поваренной книги не найден». Таким образом, пользователь может загружать зависимости самостоятельно (или даже с помощью какого-либо автоматического инструмента), не выполняя рецепты, но читая метаданные.

person Draco Ater    schedule 10.06.2013
comment
Насколько умен шеф-повар в том, чтобы не повторять рецепты? Итак, если ваша кулинарная книга зависит от parent, вы include_recipe parent и какая-то невольная душа добавляет parent в список запусков, неужели parent::default.rb запускается дважды? Если parent был создан правильно, с машиной ничего плохого не случится, но насколько время будет потрачено впустую, когда вы начнете загружать / собирать новый узел? Если Chef не умеет уклоняться от дублирования, есть ли рекомендуемый способ избежать этого вручную? - person Patrick M; 16.12.2013
comment
Он не загружает один и тот же рецепт несколько раз. Пропускает, если уже видел. - person Draco Ater; 16.12.2013
comment
Я полагаю, что это преимущество идемпотентности: если вы гарантированно получите тот же результат независимо от того, сколько раз вы его запускали, то вы знаете, что можете пропустить его, если он уже был запущен! Спасибо, Драко. - person Patrick M; 16.12.2013
comment
Chef сразу выполняет рецепт, когда он читаетinclude_recipe foo? - person Kevin Meredith; 25.10.2014
comment
Нет, Chef run состоит из двух этапов: сначала он считывает все рецепты и создает набор ресурсов для управления, и только затем выполняет эти ресурсы. - person Draco Ater; 25.10.2014

Вся логика должна контролироваться списками выполнения. Поваренные книги, как бы они ни старались, не так пригодны для повторного использования, как люди думают. Все, что делает include_recipe, - это добавляет еще одно место, где пользователи должны искать, чтобы выяснить, что будет делать список выполнения, поэтому сделайте его явным и поместите в список выполнения.

person David K.    schedule 23.05.2014
comment
Я бы предположил, что нужно использовать include_recipe, чтобы сделать зависимость явной. - person user1071847; 17.02.2017