配方中的属性覆盖不起作用
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 对象。从编写属性驱动的配方代码更改为 属性 驱动的资源代码也可能对您有很大帮助。
下面是我的问题的提炼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 对象。从编写属性驱动的配方代码更改为 属性 驱动的资源代码也可能对您有很大帮助。