Chef infra 配方中的属性重写不起作用

Chef infra 配方中的属性重写不起作用,chef-infra,Chef Infra,下面是我的问题的一个示例,带有一个错误输出(错误无关,产生错误的陈旧值就是问题) 我只是想重写一个变量。然后我订阅这个ruby_块,并基于重写变量的字符串内容创建一个文件 ruby_block "Get and set volume id" do block do node.force_override['ec2-consistent-snapshot']['script']['volumes-test'] = 'wtf?' end action :run end

下面是我的问题的一个示例,带有一个错误输出(错误无关,产生错误的陈旧值就是问题)

我只是想重写一个变量。然后我订阅这个
ruby_块
,并基于重写变量的字符串内容创建一个文件

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
不起作用。我已经用不同的节点作用域进行了大量迭代,使用/不使用通知/订阅,创建新属性等等。我的结果似乎是随机的(我知道不是这样,但我不确定这里发生了什么):有时情况很好,有时我得到了陈旧的结果


任何帮助都将不胜感激。作为参考,我不能通过json将参数传递给chef客户端(规范要求我不要这样做)。

查看chef加载过程的概述。这里的问题是在编译时对资源体进行评估,但在收敛时设置新值。

查看Chef加载过程的概述。这里的问题是资源体是在编译时计算的,但您是在收敛时设置新值。

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

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

我想我理解这篇文章,但如何着手解决这个问题?最简单的解决方案可能是延迟评估:
content lazy{node['ec2-consistent-snapshot']['script'['volumes-test']}
但是,由于您删除了所有相关细节,我无法对您真正的问题发表评论。这就是为什么您应该在问题中具体说明,但要说明您的实际用例。无法在以下内容中提供更多详细信息:(我最后只是设定了一个环境变量,但看起来这也行得通。如果你的雇主不允许你分享你的代码细节,你应该通知他们需要从保密协议下的人那里购买支持,或者直接雇佣那些人。如果他们不想分享那么多,你就得不到免费帮助,句号。我肯定不是你的电话,但你应该确保他们理解你可能无法获得完成工作所需的资源。我想我理解这篇文章,但我如何着手解决这个问题?最简单的解决方案可能是延迟评估:
content lazy{node['ec2-consistent-snapshot']['script']['volumes-test']}
但是,由于您删除了所有相关的详细信息,我实际上无法对您真正的问题发表评论。这就是为什么您应该在问题中详细说明您的实际使用情况。无法在以下内容中提供更多详细信息:(我最后只是设定了一个环境变量,但看起来这也行得通。如果你的雇主不允许你分享你的代码细节,你应该通知他们需要从保密协议下的人那里购买支持,或者直接雇佣那些人。如果他们不想分享那么多,你就得不到免费帮助我肯定不是你的电话,但你应该确保他们知道你可能没有足够的资源来完成你的工作。