如果我有一个软件系统,对libssl或libxml等其他库有很大的依赖关系,我应该为这些库中的每一个创build单独的食谱(配方实际上只有2行),或者做人在食谱中有几个“包”块,以确保依赖关系在那里(而不是将这些包块分割成它们的外部食谱)?
如果你只需要安装包依赖,你可以做一些简单的事情:
%w{ package1 package2 package3 }.each do |pkg| package pkg end
或者你甚至可以创build一个属性并遍历这些属性。
属性/ default.rb:
default['app']['deps'] = [ "package1", "package2" ]
食谱/ deps.rb:
node['app']['deps'].each do |pkg| package pkg end
第二种方法将允许您通过覆盖更新软件包列表。
你甚至可以把它添加到你的食谱中的一个单独的配方,你可以添加到bootstrap run_list或应用程序angular色。
正如CS3所说,仅仅为了安装一个应用程序而拥有数百个烹饪书是不现实的。 厨师实际上使用您的系统的包pipe理器,并可以自动解决您的依赖关系。
如果您有一些特定的configuration项目可能会在系统中进行更改,或者可能因依赖于它的包而有所不同,那么您想要分离依赖项的唯一原因是。
我会首先build议只embedded你的依赖,比如直接在安装你的应用程序的食谱中安装libssl-dev,libxml2-dev,libxslt-dev等。
这种方法遇到麻烦的地方在于,如果您在同一个映像上部署两个不同的应用程序食谱,这两个应用程序都包含像package "libssl-dev"这样的资源,那么您会在这里看到关于CHEF-3694资源克隆的警告。 既然两本食谱都有一个资源命名为同样的东西,那么在某个时候,我们确实希望这个资源消失,而且我们真的希望转移到一个只有在主厨中定义package "libssl-dev"的世界跑。
然后,您可以开始在通用烹饪书中收集这些依赖关系,应用程序烹饪书将包含这些依赖关系(如果它们对于您部署的每个应用程序而言都大致相同)。 否则,你可以开始把它们分解成不同的应用程序子types,或者对opscode xml和zlib cookbook等单一用途的食谱非常明确。
我会build议创build一个“平台”的食谱,收集所有平台上的所有types的杂项基础东西(安装lsof,tcpdump,strace,zsh,htop以及所有的-dev / -devel RPM和debs你通常需要)。 在安装这些东西之前,这个东西太难处理了,那么你需要把它分解开来。
尽pipe如此,所有这些都是有争议的,而更细致的食谱书的好处是,你更好地理解你的依赖关系,你的厨师运行应该有更less的资源和更小。 它在可pipe理性和精确性之间有一点折衷。 作为一个最佳实践,你可能应该把它们全部打破。 但是,如果太多的“应该”开始妨碍实际工作,那么我会巩固。
Berkshelf和testing厨房以及烹饪书的正确集成testing使得小型的单一用途烹饪书变得容易得多,但是在那里有一个学习曲线,最好不要把libssl-dev安装到自己的食谱中直到你在路上。