Chef-solo 缺乏环境支持似乎颇具争议。一方面,环境的一个特点是能够将食谱固定到特定环境,这对于 chef-solo 来说完全没有意义。另一方面,我们中的许多人希望在使用 Vagrant 进行测试时能够合并环境级属性并使用特定于环境的运行列表。而且我想我可能找到了一种简单的方法来解决这个问题。假设我在我的所有环境和角色中都使用 JSON 语法,并且我坚持以下设置属性的约定(从低到高的优先级):
- 食谱属性文件中的默认值
- 角色文件中的默认值
- 在环境文件中覆盖
看起来我可以自己解析这些文件并使用 -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']]
我意识到这不是最优雅的 hack,但它似乎对某些人来说是一个可行的解决方案。有人认为这是一个非常糟糕的主意吗?
Chef 11.6.0 终于在 chef-solo 中添加了对环境的支持。