2015-04-18 1 views
2

Я пытаюсь изменить атрибут в одном ресурсе и хочу использовать обновленное значение в другом ресурсе, но обновленное значение не отражается в других ресурсах. пожалуйста, помогите мнеКак передать значение от одного ресурса другому ресурсу в рецепте шеф-повара?

Код

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]

ответ

3

Ваша проблема в том, что переменная code устанавливается во время компиляции фазы шеф-повара , прежде чем блок ruby ​​изменит значение вашего атрибута. Вам нужно добавить ленивый инициализатор вокруг вашего кодового блока.

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 

Первый блок действительно не нуждается ленивый, но я бросил туда только в случае, если значение в других местах тоже меняется.

+0

Тем не менее я получаю сообщение об ошибке, как показано ниже: NoMethodError ------------- неопределенный метод 'эхо» для шеф-повара: : Ресурс: Bash Поваренная книга: --------------- /var/chef/cache/cookbooks/Oracle11G/recipes/testSplit.rb:3:in 'block (2 уровня) in from_file ' Ресурс Declarati на: --------------------- # В /var/chef/cache/cookbooks/Oracle11G/recipes/testSplit.rb 1: bash "beforeTest "do 2: код lazy { 3: echo" # {node [: oracle] [: asm] [: test]} " 4:} 5: end – SASI

+1

извините, это просто потому, что команда не в кавычки. Я исправлю это. –

+0

Как использовать ленивый ресурс ruby_block .. Не могли бы вы помочь мне .. – SASI

2

Lazy - это хорошо, но вот еще один подход. Вы можете использовать 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 
Смежные вопросы