在 knife ssh 时将 CLI 参数传递给 chef-client

Pass CLI arguments to chef-client while knife ssh

我正在尝试使用 Chef 自动部署应用程序。

我准备了通用的食谱(基于输入属性值工作)来部署 API。我已将所有属性保存在我的属性文件夹中。

这里面临的问题是,如果我在属性文件中保留包版本号,我就能够成功部署包。实际上,每次触发 CD 管道时,包号都会发生变化。并且我正在考虑使用 chef-client CLI 功能将参数作为 JSON 文件传递​​给 -j 选项。

问题是我不想在每次触发 CD 管道时触摸我的食谱来更新包版本,因为如果我更新我的食谱中的任何内容,我必须再次 运行 CI 用于食谱验证,同时我无法在每个节点(范围从 50 - 500 个服务器)中保留一个文件并在触发 chef-client 之前远程更新版本。

请帮助我找到一种方法将参数远程传递给 knife ssh。或解决此问题的任何其他解决方案。非常感谢您。

如果将包版本指定为属性,为什么不在 chef 环境中设置它?

https://docs.chef.io/environments.html

使用这种方法,您可以选择为应用程序的每个版本创建一个环境:

  • myapp_v1
  • myapp_v2
  • myapp_v3

或者只是为管道过程中的每个阶段更新现有环境:

  • 我的开发
  • myint
  • 我的测试
  • myqa

关键是当你bootstrap新节点时你可以指定环境。环境将确保每个节点将具有相同的节点属性覆盖设置(您也可以更新现有节点的环境),

最后,使用环境的不明显好处是能够 "pin" 您正在使用的应用程序说明书的版本。在某个阶段,您将需要升级您的食谱,并且该更改也需要进行版本控制!

总而言之,这里有一个示例环境,它说明了原则:

{
  "name": "mytest",
  "cookbook_versions": {
    "myappcookbook1": "= 1.0",
    "myappcookbook2": "= 2.0"
  },
  "override_attributes": {
    "myapp1": {
      "version": "1.0"
    },
    "myapp2": {
      "version": "2.0"
    }
  }
}