看起来问题在于kibana cookbook有一个默认的recipe,它在使用node['kibana']['apache']['basic_auth_username']
和密码节点属性时没有使用lazy {}
修饰符。
看起来这里正在进行大量的工作来懒惰化一切,并出于我不理解的原因使用ruby_block
。更好的方法是简单地不使用ruby_block:
file = File.read('/opt/config/baselogging.json')
data = JSON.parse(file)
node.default['kibana']['apache']['basic_auth_username'] = data['KibanaUser']
node.default['kibana']['apache']['basic_auth_password'] = data['KibanaPassword']
include_recipe 'kibana'
如果 Chef 本身负责生成 baselogging.json,而您正在尝试生成 baselogging.json 并从 baselogging.json 中读取,则我想到的解决方案是重构并删除该部分:
data = ... stuff to populate the data ...
file "/opt/config/baselogging.json" do
content JSON.generate(data)
end
[...]
node.default['kibana']['apache']['basic_auth_username'] = data['KibanaUser']
node.default['kibana']['apache']['basic_auth_password'] = data['KibanaPassword']
include_recipe 'kibana'
即使当前有一个创建baselogging.json的remote_file
资源,你最好做这样的事情:
remote_file "/opt/config/baselogging.json" do
source "http://example.org/baselogging.json"
action :nothing
end.run_action(:create)
file = File.read('/opt/config/baselogging.json')
data = JSON.parse(file)
node.default['kibana']['apache']['basic_auth_username'] = data['KibanaUser']
node.default['kibana']['apache']['basic_auth_password'] = data['KibanaPassword']
include_recipe 'kibana'
这里的重点是,
lazy {}
会导致越来越多的惰性操作,如果你在控制范围之外使用烹饪书,则变得越来越丑陋。整个问题有很多“代码异味”,强制推迟事情的发生时间会导致与架构的设计相抵触。最好回过头来重新审视你的假设,以便在chef运行中推进更多的工作。
通常,您会尝试在属性文件解析阶段编译节点属性中的所有信息。在配方代码中设置属性会导致像这样的问题,并最终导致您希望提交PR以使它们使用的所有属性都变为惰性。使用基于资源驱动的库烹饪书而不是基于属性和配方驱动的库烹饪书可以帮助避免整个过程。除此之外,您应该尽早组装节点数据,以便您不必惰性访问节点数据。
如果您必须在配方代码中构建节点数据,则必须在编译时构建该数据。试图在配方收敛时间设置节点数据是您已经有点迷失的症状。
ruby_block
是在资源收集后执行的代码的一部分,因此简单地将include_recipe
放在该块之外作为下一步。 - WBAR