以下是我的问题的蒸馏玩具示例,错误输出(错误无关紧要 - 产生错误的陈旧值是问题)。
我只是试图覆盖变量。然后我订阅了这个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
无效。我已经经历了大量不同节点范围的迭代,使用/不使用通知/订阅,创建新属性等。我的结果看似随机(我知道这不是情况,但是我&# 39;我不确定这里发生了什么?:有时候事情很好,有时我会得到陈旧的结果。
非常感谢任何帮助。作为参考,我无法将via json中的参数传递给chef-client(规格要求我不要这样做)。
答案 0 :(得分:2)
查看https://coderanger.net/two-pass/以了解Chef的加载过程概述。这里的问题是在编译时评估资源主体,但是你在收敛时设置新值。
答案 1 :(得分:0)
在ruby_block
内设置节点属性是一种可怕的代码味道。你真的需要问为什么你这么做并在更早的时候重构某个地方。理想情况下,您不会在配方代码中设置任何属性,只会在属性文件中设置属性。如果您甚至想要使用属性,可能需要重新考虑。它们有时是非常糟糕的工具,您可能希望使用node[:run_state]
哈希,使用普通的旧ruby变量,或者在库中使用普通的ruby对象。从编写属性驱动的配方代码转换为属性驱动的资源代码也可能对您有所帮助。