Как передать значение из одного ресурса в другой ресурс в рецепте шеф-повара?

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

Код

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].


person SASI    schedule 18.04.2015    source источник


Ответы (2)


Ваша проблема в том, что переменная 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

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

person Tejay Cardon    schedule 18.04.2015
comment
Тем не менее я получаю сообщение об ошибке, как показано ниже: NoMethodError ------------- неопределенный метод echo' for Chef::Resource::Bash Cookbook Trace: --------------- /var/chef/cache/cookbooks/Oracle11G/recipes/testSplit.rb:3:in block (2 уровня) в объявлении ресурса from_file: --------------- ------ # В /var/chef/cache/cookbooks/Oracle11G/recipes/testSplit.rb 1: bash beforeTest do 2: code lazy{ 3: echo #{node[:oracle][:asm][: тест]} 4: } 5: конец - person SASI; 20.04.2015
comment
извините, это только потому, что команда не в кавычках. Я исправлю это. - person Tejay Cardon; 20.04.2015
comment
Почему вы хотите использовать lazy в ruby_block? - person Tejay Cardon; 23.04.2015
comment
@TejayCardon, я в шоке. Пользуюсь Chef в течение 3–4 лет и испробовал несколько довольно сложных способов получения вывода из одного ресурса в другой (особенно в отношении зашифрованных пакетов данных). Это решает так много проблем. Спасибо!! - person Brett; 21.09.2016
comment
@ Бретт, нет проблем. Концепция Lazy была ОГРОМНЫМ дополнением к Chef, которое действительно сделало возможным гораздо больше вещей. Теперь, если бы я только мог использовать Lazy вне рамок рецепта.... - person Tejay Cardon; 21.09.2016

Ленивый — это хорошо, но здесь другой подход. Вы можете использовать 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
person Baurzhan Konurbayev    schedule 06.12.2016