【发布时间】:2021-08-31 08:53:35
【问题描述】:
我正在使用 AWS OpsWorks 的 Chef。我有一个自定义属性 JSON,如下所示;
{
"custom_attributes": {
"custom_attribute_1": "default_value"
}
}
而且,我可以使用#{node[:custom_attributes][:custom_attribute_1]}" 在我的食谱中的任何位置打印/使用该值。然后,我想更改该值,我可以通过在我的食谱的attributes 目录中的default.rb 文件中提及它来实现它,如下所示;
override['custom_attributes']['custom_attribute_1'] = "overridden_value"
现在,如果我打印/使用此属性,新值将得到反映。这很好用。
让我们考虑一下我没有覆盖该值并尝试为此使用 ruby 块,如下所示;
ruby_block 'test_block' do
block do
node.override['custom_attributes']['custom_attribute_1'] = "overridden_value"
end
action :run
end
log 'message' do
message "attribute value = #{node[:custom_attributes][:custom_attribute_1]}"
level :info
end
现在,如果我们查看日志,它将显示 default_value 而不是 overridden_value。如果我的理解很清楚,它的发生是因为 compile 和 convergence 阶段。谁能告诉我如何解决这个问题?
谢谢。
编辑
根据我的研究,我知道属性分配发生在编译阶段,而 ruby 块评估发生在收敛阶段。在这种情况下,有人可以告诉我如何使用 Chef Lazy 覆盖/创建新属性吗?下面是我偶然发现的一个博客;
【问题讨论】:
-
您有什么理由要从
ruby_block中设置节点属性吗?它看起来更像是一个(变量的)范围问题,而不是编译/收敛阶段。 -
@seshadri_c 我明白你的意思。但问题是,假设我有一个跨不同接收者使用的属性值,并且该值是动态的。因此,即使我没有覆盖该值并假设我正在使用 ruby 块创建一个新属性并在我的食谱中提及它,它也会看起来是空白的。我同意编译/收敛阶段,我明白这就是正在发生的事情。
-
您在
ruby_block中分配给变量(或属性)的值将仅在其中应用。如果你编写一个简单的 Ruby 代码将属性的值写入ruby_block中的一个文件,你会看到overridden_value。
标签: ruby chef-infra devops aws-opsworks