Chef infra 在单个生产服务器上测试烹饪书的更新

Chef infra 在单个生产服务器上测试烹饪书的更新,chef-infra,Chef Infra,我们有时会有一些烹饪书无法在登台环境中完全测试,因为结果并不总是反映生产环境中可能发生的情况。作为一种解决方案,我正在尝试冻结环境的版本,如下所示: { "name": "production", "description": "Production Environment", "cookbook_versions": { "deployment": "= 0.1.12" }, ... ... "run_list": [ "recipe[base]", "r

我们有时会有一些烹饪书无法在登台环境中完全测试,因为结果并不总是反映生产环境中可能发生的情况。作为一种解决方案,我正在尝试冻结环境的版本,如下所示:

{
  "name": "production",
  "description": "Production Environment",
  "cookbook_versions": {
    "deployment": "= 0.1.12"
  },
...
...
  "run_list": [
  "recipe[base]",
  "recipe[security]",
  "recipe[deployment::auto_war@0.1.13]"
]
...
并通过在其运行列表中显式指定新版本来排除该限制的特定服务器,如下所示:

{
  "name": "production",
  "description": "Production Environment",
  "cookbook_versions": {
    "deployment": "= 0.1.12"
  },
...
...
  "run_list": [
  "recipe[base]",
  "recipe[security]",
  "recipe[deployment::auto_war@0.1.13]"
]
...
问题是,当环境的版本与run_列表中指定的版本不同时,chef client会在解析运行列表的cookbooks时陷入困境:…


为什么呢?有没有办法绕过这个问题?是否有更好的方法仅在一台服务器上测试配方的更新?

您无法覆盖现有约束,因此您必须临时将该节点移动到新环境以进行测试。

不幸的是,这将无法达到目的,因为某些配方的行为因节点的环境而异,这意味着,测试不会反映生产中将发生的情况。而且,我不认为这是真的,这似乎足够基本的设计。我还发现,在运行列表中使用特定版本时,即使没有约束,chef也会挂起在同一位置。这似乎只是一个bug。这个功能很少被使用,因为我们确实测试过它,所以我可以相当自信地说,它没有(简单的)bug。也就是说,即使存在冲突,它也不会在环境中使用冲突约束,因为该错误是正确的,并且按照设计工作。另一个选项是在生产中禁用守护程序模式或后台聚合,更新环境,然后在几台机器上运行canary部署。