我应该使用 include_recipe 还是将 recipe 添加到 run_list 中?

70

尝试找出大型项目的最佳方法。何时适合使用include_recipe将配方添加到另一个配方中,而不是将其添加到run_list中?有没有什么好的经验法则?

2个回答

79

在我看来,任何菜谱都应该能够单独在一个空机器上运行。因此,如果某个菜谱A在其之前需要运行菜谱B,我总是使用include_recipe。

例如:两本烹饪书,Tomcat和Java。Tomcat需要Java。

  1. 当某个用户想要安装Tomcat时,他可能没有意识到实际上需要其他的烹饪书才能安装它。他运行Tomcat菜谱,或者它会失败并显示一些完全没有帮助的错误消息,比如“找不到Java”等更糟糕的情况 - 它成功了,但是用户当然无法启动Tomcat,因为他没有安装Java。

  2. 但是,当Tomcat烹饪书中有一行“include_recipe 'java'”时,这也需要metadata中的“depends 'java'”行,当用户尝试安装Tomcat时,将会看到可理解的错误消息:“找不到Java烹饪书”。这种方式实际上使用户可以通过阅读metadata自己下载依赖关系(甚至使用某些自动工具),而无需实际运行菜谱。


8
Chef在避免重复使用菜谱方面有多聪明?如果您的食谱取决于“parent”,则应该include_recipe parent,但如果有人无意中将“parent”添加到运行列表中,那么会执行parent::default.rb两次吗?如果“parent”已经正确地制作了,则机器上不会发生任何问题,但是在引导/收敛新节点时会浪费多少时间?如果Chef不能自动避免重复,是否有推荐的手动避免方法? - Patrick M
7
如果已经加载过同一道食谱,它不会再次加载,而是跳过它。 - Draco Ater
我想这就是幂等性的好处:如果你保证无论运行多少次都会得到相同的结果,那么你就知道如果已经运行过了,可以跳过它!谢谢 Draco。 - Patrick M
2
当Chef读取include_recipe foo时,它是否立即执行配方? - Kevin Meredith
2
不,Chef运行包括两个阶段,首先它会读取所有的配方并构建一个资源集合来进行管理,然后才执行这些资源。 - Draco Ater

3

所有逻辑都应该受到运行列表的控制。尽管尝试过,但烹饪书并不像人们想象中的那样可重用。 include_recipe 所做的只是添加另一个要查看以了解运行列表的位置,因此应明确地将其放在运行列表中。


1
我认为应该使用include_recipe来明确依赖关系。 - user1071847

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接