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


68

试图找出大型项目的最佳方法。什么时候适合通过在配方中添加配方include_recipe而不是将配方添加到配方中run_list?有良好的经验法则吗?

Answers:


78

如我所见,任何配方都应该能够在空机器上自行运行。因此,如果某些配方A取决于之前运行的配方B,则我将始终使用include_recipe。

例如:2本食谱,tomcat和java。Tomcat需要Java。

  1. 当某些用户想要安装tomcat时,他可能不知道自己实际上还需要其他食谱来安装它。他运行了tomcat配方,但失败了,并显示了一些完全无用的错误消息,例如“找不到Java”,甚至更糟-它成功了,但是用户当然不能启动tomcat,因为他没有安装Java。

  2. 但是,如果include_recipe 'java'tomcat食谱中有一行,它也需要depends 'java'元数据中的一行,那么当用户尝试安装tomcat时,将看到可以理解的错误消息:“未找到该食谱java”。这样,用户实际上可以自己下载依赖项(甚至使用某些自动工具),而无需实际运行配方,而是读取元数据。


8
厨师如何避免重复食谱有多聪明?因此,如果您的菜谱依赖parent,您include_recipe parent和一些不知情的灵魂就会添加parent到运行列表中,是否parent::default.rb会运行两次?如果parent已经正确地制作,没什么不好会发生机器,但它多少时间,当你引导/汇聚新节点浪费?如果Chef不能自动避免重复,是否有建议的方法手动避免重复?
Patrick M

7
它不会多次加载相同的配方。如果已经看到它,它将跳过它。
Draco Ater 2013年

我想这是幂等的好处:如果无论运行多少次,都保证得到相同的结果,那么您知道可以跳过它(如果已运行)!谢谢德拉科。
Patrick M

2
厨师在读取时会立即执行食谱include_recipe foo吗?
凯文·梅瑞迪斯

2
不,Chef运行包括两个阶段,首先读取所有配方并构造要管理的资源集合,然后才执行资源。
Draco Ater 2014年

3

所有逻辑都应通过运行列表进行控制。尝试尝试的食谱无法像人们想像的那样可重复使用。所有的include_recipe工作就是在另一个地方增加了用户必须查看的地方,以明确运行清单将要做什么,因此要使其明确并放入运行清单。


1
我认为应该使用include_recipe一个显式的依赖关系。
user1071847 '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.