从食谱中全局覆盖厨师属性
Override chef attributes globally from a cookbook
我们使用 rbenv 和 ruby-build 使用 chef 在我们的 vagrant 设置中管理 Ruby 版本。尽管 rbenv 明确拒绝实现它,但我们想要的一个功能是让 "fuzzy" 版本匹配 ruby 版本(例如,将 1.9.3 转换为 1.9.3-p123)。
我希望在 run_list 中的 ruby-build 和 rbenv 之间的独立配方中透明地处理这个问题。我的代码 "works"(根据 ruby-build --definitions
的输出确定最新匹配的 ruby 版本),但是当 运行 rbenv 食谱时更改不会保留,所以我假设它们在我的食谱中是本地的。有什么方法可以在 运行?
期间全局更新属性
我应该补充一点,我对厨师不熟悉。这超出了我通常工作的领域。我知道这可能是一个奇怪的用例,如果我正在尝试做的事情确实令人震惊,那么完成我想要的事情的更好方法是什么?
这是我当前食谱的大纲:
original_rbenv_rubies = node[:rbenv][:rubies]
new_rbenv_rubies = determine_full_ruby_versions original_rbenv_rubies
node.force_override[:rbenv][:rubies] = new_rbenv_rubies
我已经通过使用我的食谱作为 rbenv 食谱的包装解决了这个问题。我将上面的逻辑移到了默认属性文件中,并使用 include_recipe
将原始食谱包含在我自己的食谱中。出于某种原因,新属性仍然没有被拾取,所以我将原始值移动到 node[:rbenv_wrapper][:rubies]
,并使用 override
设置新属性到 node[:rbenv][:rubies]
,之后一切按预期工作。
我们使用 rbenv 和 ruby-build 使用 chef 在我们的 vagrant 设置中管理 Ruby 版本。尽管 rbenv 明确拒绝实现它,但我们想要的一个功能是让 "fuzzy" 版本匹配 ruby 版本(例如,将 1.9.3 转换为 1.9.3-p123)。
我希望在 run_list 中的 ruby-build 和 rbenv 之间的独立配方中透明地处理这个问题。我的代码 "works"(根据 ruby-build --definitions
的输出确定最新匹配的 ruby 版本),但是当 运行 rbenv 食谱时更改不会保留,所以我假设它们在我的食谱中是本地的。有什么方法可以在 运行?
我应该补充一点,我对厨师不熟悉。这超出了我通常工作的领域。我知道这可能是一个奇怪的用例,如果我正在尝试做的事情确实令人震惊,那么完成我想要的事情的更好方法是什么?
这是我当前食谱的大纲:
original_rbenv_rubies = node[:rbenv][:rubies]
new_rbenv_rubies = determine_full_ruby_versions original_rbenv_rubies
node.force_override[:rbenv][:rubies] = new_rbenv_rubies
我已经通过使用我的食谱作为 rbenv 食谱的包装解决了这个问题。我将上面的逻辑移到了默认属性文件中,并使用 include_recipe
将原始食谱包含在我自己的食谱中。出于某种原因,新属性仍然没有被拾取,所以我将原始值移动到 node[:rbenv_wrapper][:rubies]
,并使用 override
设置新属性到 node[:rbenv][:rubies]
,之后一切按预期工作。