厨师版本 - 是否有优先顺序?

时间:2013-12-21 10:06:00

标签: chef

据我了解,您可以在metadata.rb文件中设置食谱的版本。

您可以随后在三个地方引用该版本。其他食谱元数据,环境或run_lists。

如果您在具有不同版本号的多个位置中为同一个食谱指定版本约束,会发生什么情况。哪个版本是强制执行的?

询问的原因是角色是否没有像烹饪书那样进行版本化......也许生产环境配置为将版本锁定到已知的好食谱但是管理员出现并更新Roles run_list中的配方,如apache @ 1.2.2所以它与环境约束的不同......它赢了。

希望这是有道理的。

FLO

2 个答案:

答案 0 :(得分:3)

Chef中的依赖项求解器(不幸地默默地)使用了 它可以解决图表的最佳版本的依赖食谱。那 意味着你有:

  • cookbook runit存在于Chef服务器上,版本为0.13.2和1.2.0
  • cookbook myface依赖于没有版本约束运算符的runit
  • cookbook yourface取决于runit with~> 0.13.0

当节点的扩展运行列表包含recipe[myface]recipe[yourface],它将使用runit版本0.13.2。

如果Chef无法解析图形,它将返回HTTP 412, 前提条件失败。例如,如果你锁定了runit的版本 环境= 1.2.0,recipe[myface]和。{ recipe[yourface]在运行列表中,它将无法解决 因为你的脸要v0.13.2。

另一种情况:

  • cookbook couchdb存在版本1.1.0和1.0.0
  • cookbook couchdb版本1.1.0取决于runit~> 1.1
  • cookbook couchdb版本2.0.0取决于runit> = 1.0.0(主要 版本凹凸正在修复依赖关系,因此早期版本可以 使用)
  • cookbook myface取决于couchdb> = 1.1.0(并且过渡性地运行 1.2.0)
  • cookbook yourface取决于couchdb~> 2.0.0(并且过渡性地运行 1.0.0)

当节点的运行列表再次同时包含recipe[myface]recipe[yourface],那么你可能最终得到:

  • couchdb 2.0.0(由于你的脸部悲观约束,这个 满足myface的1.1.0要求)
  • runit 1.1(由于couchdb 2.0.0的要求)

然而,这可能是你真正想要的,也可能不是 也许不同的couchdb烹饪书中的行为是不同的 对于应用程序在某种程度上与其使用runit无关。它的 可能很好。

通常可以根据您的需要在社区烹饪书中设置烹饪书的元数据中的依赖关系。对于一些烹饪书,自由约束(或根本没有)是好的。对于其他烹饪书,悲观的constrinats(使用〜>运算符)可能是好的。这是根据具体情况而定,所以我没有一般性建议。例如,密切注意您感兴趣的烹饪书的更改日志或提交日志,并查看作者是否习惯在次要版本之间分解。

建议在环境(尤其是生产/稳定类型环境)中使用=运算符固定cookbook版本。这就是我们(Chef,公司)对运行Hosted Chef(Chef Server SaaS)的烹饪书所做的事情。

答案 1 :(得分:1)

请记住,运行列表附加菜谱中会显示菜谱条目,这些菜单在各种元数据文件中列为依赖项。在运行时,厨师必须构建一个烹饪书版本树,以确定将使用的每个食谱的实际版本。

例如,烹饪书B可以取决于食谱X的> v3.0,而食谱B可以取决于>版本1.0。因此,这不是一个关于哪个食谱“获胜”的问题,更重要的是厨师是否满足它发现的版本的限制并满足加载的可用烹饪书版本的限制。

当谈到约束时,最好建议将它们放在两个地方:

  • 环境文件中的Cookbook依赖项。
  • 环境运行列表

为什么?

  1. 不那么令人困惑
  2. 上传食谱时刀具支持对环境的限制
  3. 当您指出角色未版本化时,在角色运行列表上设置版本将适用于所有厨师服务器环境......
  4. 使用cookbook控制运行列表是一种新模式,元数据版本和依赖项自动控制要选择的版本。