我是否应该使用这个简单的技巧来解决 chef-solo 缺乏环境支持的问题?

我是否应该使用这个简单的技巧来解决 chef-solo 缺乏环境支持的问题?

Chef-solo 缺乏环境支持似乎颇具争议。一方面,环境的功能之一是能够将食谱固定到特定环境,而这对于 chef-solo 来说毫无意义。另一方面,我们中的许多人都希望在使用 Vagrant 进行测试时能够合并环境级属性并使用特定于环境的运行列表。我想我可能已经找到了一种解决这个问题的简单方法。假设我在所有环境和角色中使用 JSON 语法,并遵守以下设置属性的约定(从最低优先级到最高优先级):

  1. 食谱属性文件中的默认值
  2. 角色文件中的默认设置
  3. 在环境文件中覆盖

看起来我可以自己解析这些文件并使用 -j 选项将属性注入 chef-solo。例如,我可以在我的 Vagrantfile 中执行如下操作:

chef_env_conf = parse_json("./environments/#{ENV['CHEF_ENVIRONMENT']}.json")
chef.json = chef_env_conf["override_attributes"]

由于通过 -j 选项设置的属性以正常优先级应用,这可以是覆盖角色默认值的另一种方式,并且这可能就是在环境不会自动拉入的情况下所需要的全部内容。

您可以做类似的事情来获取每个环境的运行列表(通过解析角色文件):

chef_role_conf = parse_json("./roles/#{role}.json")
chef.run_list = chef_role_conf["env_run_lists"][ENV['CHEF_ENVIRONMENT']]

我知道这不是最优雅的破解方法,但对于某些人来说,这似乎是一个可行的解决方案。有人认为这是一个非常糟糕的主意吗?

答案1

Chef 11.6.0 最终增加了对 chef-solo 中环境的支持。

相关内容