配方中的属性覆盖不起作用

Attribute overridding in recipe not working

下面是我的问题的提炼toy-example,带有错误输出(错误无关紧要——产生错误的陈旧值才是问题所在)。

我只是想覆盖一个变量。然后我订阅这个 ruby_block 并根据覆盖变量的字符串内容创建一个文件。

ruby_block "Get and set volume id" do
    block do
    node.force_override['ec2-consistent-snapshot']['script']['volumes-test'] = 'wtf?'
    end
    action :run
end

file "/var/log/ec2-test" do
    content node['ec2-consistent-snapshot']['script']['volumes-test']
    owner "ec2-user"
    group "ec2-user"
    mode "0666"
    subscribes :create, "ruby_block[Get and set volume id]", :delayed
end

如您所见,force_override 不起作用。我经历了大量不同节点范围的迭代,using/not 使用 notifies/subscribes,创建新属性等。我的结果看似随机(我知道情况并非如此,但我'我不确定这里发生了什么):有时一切正常,有时我得到陈旧的结果。

如有任何帮助,我们将不胜感激。作为参考,我无法通过 json 将参数传递给 chef-client(规范要求我不要那样做)。

查看 https://coderanger.net/two-pass/ 以了解 Chef 加载过程的概览。这里的问题是资源主体是在编译时计算的,但您是在收敛时设置新值。

ruby_block 中设置节点属性是一种可怕的代码味道。你真的需要问问你为什么要这样做,并在更早的时候重构某个地方。理想情况下,您不会在配方代码中设置任何属性,而只会在属性文件中设置属性。如果您甚至想使用属性,您可能需要重新考虑。有时它们是非常糟糕的工具,您可能想使用 node[:run_state] 散列,使用普通的旧 ruby 变量,或者在库中使用普通的 ruby 对象。从编写属性驱动的配方代码更改为 属性 驱动的资源代码也可能对您有很大帮助。