如何使用Ruby块在Chef recipe中分配变量

我正在尝试在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 

我试图在块中创建新变量,但仍然无法在execute语句中找到访问它们的方法,而不是尝试重新分配chef属性。

我最初使用的是类和调用方法,但它是在配方之前编译的,我真的需要在运行时,在配方中执行逻辑。

您的问题是编译时间与收敛时间 。 您的块将在收敛时运行,但此时已经评估了执行资源中的node['host']

在这种情况下,最好的解决方案是使用延迟评估,以便在资源收敛时而不是在编译时扩展变量:

 execute "Enable on hosts" do command lazy { "#{path}/command --enable -N #{node['hosts']}" } end 

这里有一点警告,懒惰的操作符必须包含完整的command属性文本,而不仅仅是变量,它只能作为属性名后面的第一个关键字。