首页 > 解决方案 > 如何在 ruby​​_block 之外使用 ruby​​_block 变量

问题描述

我有一个代码,在该代码中它包含 ruby​​_block。生成的值是什么ruby_block,我想在同一配方文件的外部/另一个资源中使用它们。

Dir.chdir("#{Chef::Config[:file_cache_path]}")
Dir.glob("test-*.msi").each { |file| File.delete(file)}

windows_zipfile "#{Chef::Config[:file_cache_path]}" do
source node['seps_infrastructure']['zip_file']
action :unzip
overwrite true
end

ruby_block 'check_vpn_ip_list' do
block do
node.run_state['msi_file'] = Dir.glob(""test-*.msi"")
node.run_state['ver'] = (node.run_state['msi_file'])[0].split('-    ')[3].chomp(".msi")
end
end
puts  node.run_state['ver']
puts  node.run_state['msi_file']

标签: chef-infra

解决方案


首先,根据经验,我建议您使用 Chef 资源,并且不要在这些资源之外使用 ruby​​ 代码(因为 Chef 资源之外的 ruby​​ 块将在编译阶段而不是 chef-client run 的收敛阶段执行。当然,这条规则也有一些例外)。例如,地方

Dir.chdir("#{Chef::Config[:file_cache_path]}")
Dir.glob("test-*.msi").each { |file| File.delete(file)}

资源内ruby_block

与您的问题相关,您可以在 中分配节点属性,ruby_block并在需要时使用相同的节点属性。例如:

ruby_block 'foo' do
  block do
    node.default['files'] = Dir.glob("test-*.msi")
  end
end

execute 'baz' do
  command "echo #{node['files']}"
end

推荐阅读