如何将值从一个资源传递到厨师食谱中的另一个资源?

时间:2015-04-18 14:09:25

标签: ruby chef recipe

我正在尝试更改一个资源中的属性,并希望在另一个资源中使用更新的值,但更新的值不会反映在另一个资源中。请帮帮我

代码

node[:oracle][:asm][:disks].each_key do |disk|
    Chef::Log.info("I am in #{cookbook_name}::#{recipe_name} and current disk count #{node[:oracle][:asm][:test]}") 

    bash "beforeTest" do
        code <<-EOH
            echo #{node[:oracle][:asm][:test]}
        EOH
    end
    ruby_block "test current disk count" do
        block do
            node.set[:oracle][:asm][:test] = "#{node[:oracle][:asm][:test]}".to_i+1
        end
    end
    bash "test" do
        code <<-EOH
            echo #{node[:oracle][:asm][:test]}
        EOH
    end
end

我正在尝试更新的值是存储在node[:oracle][:asm][:test]

的值

2 个答案:

答案 0 :(得分:4)

您的问题是,在ruby块更改了属性值之前,在chef的编译阶段设置了code变量。您需要在代码块周围添加一个惰性初始值设定项。

Chef::Log.info("I am in #{cookbook_name}::#{recipe_name} and current disk count #{node[:oracle][:asm][:test]}") 

bash "beforeTest" do
  code lazy{ "echo #{node[:oracle][:asm][:test]}" }
end

ruby_block "test current disk count" do
  block do
    node.set[:oracle][:asm][:test] = "#{node[:oracle][:asm][:test]}".to_i+1
  end
end

bash "test" do
  code lazy{ "echo #{node[:oracle][:asm][:test]}" }
end

第一个块并不真正需要懒惰,但我把它扔在那里以防万一其他地方的值也在变化。

答案 1 :(得分:2)

懒惰很好,但这是另一种方法。 您可以将node.run_state用于您的目的。

以下是https://docs.chef.io/recipes.html

的使用示例
package 'httpd' do
  action :install
end

ruby_block 'randomly_choose_language' do
  block do
    if Random.rand > 0.5
      node.run_state['scripting_language'] = 'php'
    else
      node.run_state['scripting_language'] = 'perl'
    end
  end
end

package 'scripting_language' do
  package_name lazy { node.run_state['scripting_language'] }
  action :install
end