我正在尝试在Chef配方中动态执行Ruby逻辑,并相信实现这一目标的最佳方法是使用块.
我无法将块内分配的变量传输到主厨配方的主代码中.这是我试过的:
ruby_block "Create list" do block do to_use ||= [] node['hosts'].each do |host| system( "#{path}/command --all" \ " | awk '{print $2; print $3}'" \ " | grep #{host} > /dev/null" ) unless $? == 0 to_use << host end end node['hosts'] = to_use.join(',') end action :create end execute "Enable on hosts" do command "#{path}/command --enable -N #{node['hosts']}" end
解决方法
您的问题是
compile time versus converge time.您的块将在收敛时运行,但此时已经评估了执行资源中的节点[‘host’].
在这种情况下,最好的解决方案是使用lazy evaluation,这样当资源收敛而不是编译时,变量将被扩展:
execute "Enable on hosts" do command lazy { "#{path}/command --enable -N #{node['hosts']}" } end