我应该使用include_recipe还是将配方添加到run_list?

Mic*_*cah 66 recipe chef-infra chef-recipe

试图找出大型项目的最佳方法.何时通过使用include_recipe而不是将配方添加到配方中来添加配方中的配方run_list?有一个很好的经验法则吗?

Dra*_*ter 78

在我看来,任何配方都应该能够在一台空机器上运行.因此,如果某些配方A依赖于之前运行的配方B,我总是使用include_recipe.

例如:2个cookbook,tomcat和java.Tomcat需要java.

  1. 当一些用户想要安装tomcat时,他可能不知道他实际上需要一些其他的食谱来安装它.他运行tomcat配方并且它失败了一些完全没有帮助的错误消息,如"没有找到java"或更糟糕 - 它成功,但当然用户无法启动tomcat,因为他没有安装java.

  2. 但是当include_recipe 'java'tomcat cookbook中有一行时,也需要depends 'java'一行元数据,用户在尝试安装tomcat时,会看到可理解的错误消息:"找不到cookbook java".这种方式实际上用户可以自己下载依赖项(甚至使用一些自动工具),而无需实际运行配方,而是阅读元数据.

  • 厨师在避免重复食谱方面有多聪明?因此,如果你的食谱依赖于`parent`,你的'include_recipe parent`和一些不知情的灵魂将`parent`添加到运行列表中,`parent :: default.rb`会运行两次吗?如果`parent`已经[正确制作](http://docs.opscode.com/chef_why.html#idempotence),那么机器什么都不会发生,但是当你引导/融合新机器时会浪费多少时间节点?如果Chef在避免重复方面没有自动化,是否有建议的方法来手动避免它? (8认同)
  • 它不会多次加载相同的配方.如果它已经看到它,它会跳过它. (7认同)
  • 当厨师读取`include_recipe foo`时,厨师会立即执行食谱吗? (2认同)
  • 不,Chef运行包括两个阶段,首先读取所有配方并构造要管理的资源集合,然后才执行资源。 (2认同)