如何使用 Ruby 块在厨师食谱中分配变量
How to use a Ruby block to assign variables in chef recipe
我正在尝试在 Chef 食谱中即时执行 Ruby 逻辑,我相信实现此目的的最佳方法是使用块。
我无法将块内分配的变量传输到厨师食谱的主代码。这是我试过的:
ruby_block "Create list" do
block do
to_use ||= []
node['hosts'].each do |host|
system( "#{path}/command --all" \
" | awk '{print ; print }'" \
" | 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
我没有尝试即时重新分配 chef 属性,而是尝试在块中创建新变量,但仍然找不到在 execute
语句中访问它们的方法。
我最初使用的是 class 和调用方法,但它是在配方之前编译的,我真的需要在配方期间在运行时执行的逻辑。
您的问题是compile time versus converge time。您的块将在收敛时 运行 但此时执行资源中的 node['host']
已经被评估。
在这种情况下,最好的解决方案是使用 lazy evaluation,这样变量将在资源收敛时扩展,而不是在编译时扩展:
execute "Enable on hosts" do
command lazy { "#{path}/command --enable -N #{node['hosts']}" }
end
这里有个小警告,惰性运算符必须包含完整的 command
属性文本,而不仅仅是变量,它只能作为属性名称后的第一个关键字。
我正在尝试在 Chef 食谱中即时执行 Ruby 逻辑,我相信实现此目的的最佳方法是使用块。
我无法将块内分配的变量传输到厨师食谱的主代码。这是我试过的:
ruby_block "Create list" do
block do
to_use ||= []
node['hosts'].each do |host|
system( "#{path}/command --all" \
" | awk '{print ; print }'" \
" | 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
我没有尝试即时重新分配 chef 属性,而是尝试在块中创建新变量,但仍然找不到在 execute
语句中访问它们的方法。
我最初使用的是 class 和调用方法,但它是在配方之前编译的,我真的需要在配方期间在运行时执行的逻辑。
您的问题是compile time versus converge time。您的块将在收敛时 运行 但此时执行资源中的 node['host']
已经被评估。
在这种情况下,最好的解决方案是使用 lazy evaluation,这样变量将在资源收敛时扩展,而不是在编译时扩展:
execute "Enable on hosts" do
command lazy { "#{path}/command --enable -N #{node['hosts']}" }
end
这里有个小警告,惰性运算符必须包含完整的 command
属性文本,而不仅仅是变量,它只能作为属性名称后的第一个关键字。