Chef Cookbook中如何覆盖父Cookbook的属性?
Chef子Cookbook覆盖父Cookbook属性的问题解决
问题根源
你的子Cookbook属性未生效,核心原因是子Cookbook的属性文件未被加载。Chef仅会加载run_list中指定的Cookbook及其依赖链中Cookbook的属性文件。当前你的run_list仅执行Parent::test_override,子Cookbook未被任何运行中的Cookbook触发加载,因此它的default['attribute']['string'] = 'Child'完全未生效,最终输出的是父Cookbook的默认属性值。
可行解决方案
方案1:将子Cookbook的Recipe加入Run List
在子Cookbook中创建一个默认Recipe(即使内容为空),确保Chef加载子Cookbook的属性文件,再执行父Cookbook的Recipe:
- 在子Cookbook目录下创建
recipes/default.rb(可留空) - 修改
.kitchen.yml的run_list:
- name: default run_list: - recipe[Child::default] - recipe[Parent::test_override]
Chef会先加载父Cookbook的属性,再加载子Cookbook的属性,同级别(default)下后加载的属性会覆盖先加载的,因此日志会输出Child。
方案2:使用更高优先级的属性级别
如果不想添加空Recipe,可在子Cookbook中使用override级别的属性(优先级高于default),但仍需确保子Cookbook被加载。例如在子Cookbook的attributes/default.rb中修改为:
override['attribute']['string'] = 'Child'
再按照方案1的方式将子Cookbook的Recipe加入run_list,这样即使父Cookbook的属性后加载,子Cookbook的override属性也会覆盖父的default属性。
补充:Chef属性优先级(从低到高)
defaultforce_defaultnormal(已标记为过时)overrideforce_overrideautomatic(由Ohai自动采集的系统属性,优先级最高)
内容的提问来源于stack exchange,提问作者JustAnotherDev
相关产品推荐
相关产品推荐

